diff --git a/packages/.DS_Store b/packages/.DS_Store index bcea691dcd5057e7a4d0539e7351369d24462eac..aa34b87e6d044eb853d93529f0c24837cbc8fe2a 100644 Binary files a/packages/.DS_Store and b/packages/.DS_Store differ diff --git a/packages/f-theme-editor/farris-theme-builder-site/e2e/protractor.conf.js b/packages/f-theme-editor/farris-theme-builder-site/e2e/protractor.conf.js index 86776a391a5b48b32506eb0fa62b15ed6c926b69..261571cd4ef11b273ebc5ff6d27b90480169b37c 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/e2e/protractor.conf.js +++ b/packages/f-theme-editor/farris-theme-builder-site/e2e/protractor.conf.js @@ -1,8 +1,31 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - +/* eslint-disable no-undef */ +/* eslint-disable global-require */ const { SpecReporter } = require('jasmine-spec-reporter'); +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.e2e.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; + exports.config = { allScriptsTimeout: 11000, specs: [ diff --git a/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.e2e-spec.ts b/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.e2e-spec.ts index 26a4b83792b4af022db9ba4c28c92af0a94f3d13..8f7c72cf7a7c57030d0fd196ebe513df24e7bb2b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.e2e-spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.e2e-spec.ts @@ -2,22 +2,22 @@ import { AppPage } from './app.po'; import { browser, logging } from 'protractor'; describe('workspace-project App', () => { - let page: AppPage; + let page: AppPage; - beforeEach(() => { - page = new AppPage(); - }); + beforeEach(() => { + page = new AppPage(); + }); - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('Welcome to theme-tool!'); - }); + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('Welcome to theme-tool!'); + }); - afterEach(async () => { + afterEach(async () => { // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); - }); + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.po.ts b/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.po.ts index 5776aa9eb80d8e5ad05ed75ec9a04e7ee5060ba9..59260fb73c52b9408b3db40c21b093db39b4fdbb 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.po.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/e2e/src/app.po.ts @@ -1,11 +1,11 @@ import { browser, by, element } from 'protractor'; export class AppPage { - navigateTo() { - return browser.get(browser.baseUrl) as Promise; - } + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } - getTitleText() { - return element(by.css('app-root h1')).getText() as Promise; - } + getTitleText() { + return element(by.css('app-root h1')).getText() as Promise; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.scss b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.scss index a1641035a5e03da4d630349f36597d92785fcc99..e61d79d80fa867982745d17ab5224403a014acdf 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.scss +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.scss @@ -9,23 +9,10 @@ align-items: stretch; width: 100%; .color-picker-input { - // -webkit-appearance: none; - // background-color: #fff; - // background-image: none; border-top-right-radius: 0; border-bottom-right-radius: 0; flex: 1 1 auto; width: 1%; - // border: 1px solid #dcdfe6; - // box-sizing: border-box; - // color: #2e333d; - // display: inline-block; - // font-size: inherit; - // height: 40px; - // line-height: 1; - // outline: none; - // padding: 0 15px; - // transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1); min-width: 200px; } .color-picker-trigger { diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.ts index 7c9dd44584b4cbca5d6e3c99b9c84e151bd01f9d..c44c74819430c3e5f5a207183f21f9657530729a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.component.ts @@ -1,5 +1,8 @@ -import { Component, OnInit, Input, Output, EventEmitter, ChangeDetectorRef, SimpleChanges, ViewChild, ElementRef, Renderer2, - Inject, AfterViewInit, OnChanges, OnDestroy, forwardRef +/* eslint-disable no-use-before-define */ +/* eslint-disable camelcase */ +import { + Component, OnInit, Input, Output, EventEmitter, ChangeDetectorRef, SimpleChanges, ViewChild, ElementRef, Renderer2, + Inject, AfterViewInit, OnChanges, OnDestroy, forwardRef } from '@angular/core'; import { Color, ColorString } from './helpers/color.class'; import { ColorPickerControl, ColorType } from './helpers/control.class'; @@ -7,8 +10,6 @@ import { getValueByType } from './helpers/helper.functions'; import { DOCUMENT } from '@angular/common'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - - const FARRIS_ColorPicker_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ColorPickerComponent), @@ -36,7 +37,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O get showAlpha() { if (this.colorFormat && this.colorFormat.indexOf('a') > 0) { return true; - } else if ( + } if ( this.control.initType && this.control.initType.indexOf('a') > 0 ) { @@ -49,6 +50,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O set colorFormat(v: ColorType) { this._colorFormat = v; } + get colorFormat() { if (!this._colorFormat) { if (this.control.initType) { @@ -58,8 +60,6 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O return this._colorFormat; } - - @Input() presets: Array = []; /** @@ -70,7 +70,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O @Input() editable = false; @Input() - control: ColorPickerControl; + control: ColorPickerControl; @Output() public change: EventEmitter = new EventEmitter(false); @@ -102,41 +102,47 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O this._preColor ); } + get preColor() { return this._preColor; } + set _color(v: string) { if (this.control) { this.control.setValueFrom(v); this.findColorType(this.colorFormat); } } + get _color() { if (this.colorFormat) { return getValueByType( new Color(this.color), ColorType[this.colorFormat] ); - } else { - return this.color; } + return this.color; + } - onModelChange = (val) => {}; - onTouched = (val) => {}; + onModelChange = (val) => { }; + + onTouched = (val) => { }; // 只支持两种 类型变化 - presetColorType=[ + presetColorType = [ { - text:'HEX', - type:ColorType['hex'] + text: 'HEX', + type: ColorType.hex }, { - text:'RGBA', - type:ColorType['rgba'] + text: 'RGBA', + type: ColorType.rgba } ]; - currentColorTypeIndex=-1; + + currentColorTypeIndex = -1; + constructor( private readonly cdr: ChangeDetectorRef, private renderer: Renderer2, @@ -162,7 +168,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O } this.control.valueChanges.subscribe(value => { this.cdr.markForCheck(); - console.log('valueChanges:'+this._colorFormat); + console.log('valueChanges:' + this._colorFormat); this.color = getValueByType(value, ColorType[this.colorFormat]); this.activeChange.emit( getValueByType(value, ColorType[this.colorFormat]) @@ -183,6 +189,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O this.control.unsubscribe(); this.cdr.detach(); } + public ngOnChanges(changes: SimpleChanges): void { if ( this.color && @@ -193,7 +200,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O this.control.setValueFrom(this.color); } if (changes.colorFormat && !changes.colorFormat.isFirstChange()) { - this.preColor = getValueByType( new Color(this.color), this.colorFormat); + this.preColor = getValueByType(new Color(this.color), this.colorFormat); this.onModelChange(this.preColor); } } @@ -206,6 +213,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O this.color = ''; this.renderer.setStyle(this.trigger.nativeElement, 'background', ''); } + public commit(): void { this.renderer.setStyle( this.trigger.nativeElement, @@ -216,6 +224,7 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O this.onModelChange(this.preColor); this.isShowPanel = false; } + public toggleShowPanel(e): void { e.stopPropagation(); if (this.disabled) { @@ -256,34 +265,37 @@ export class ColorPickerComponent implements OnInit, AfterViewInit, OnChanges, O val = ''; } this.color = val; - if(this._colorFormat){ + if (this._colorFormat) { this.preColor = getValueByType( new Color(this.color), ColorType[this.colorFormat] ); - }else{ - this.preColor = val; + } else { + this.preColor = val; } } + registerOnChange(fn: any): void { this.onModelChange = fn; } + registerOnTouched(fn: any): void { this.onTouched = fn; } + setDisabledState?(isDisabled: boolean): void { this.disabled = isDisabled; } - private findColorType(typeStr){ - let findTypeIndex= this.presetColorType.findIndex(item=>item.type==typeStr); - this.currentColorTypeIndex=findTypeIndex; + private findColorType(typeStr) { + const findTypeIndex = this.presetColorType.findIndex(item => item.type === typeStr); + this.currentColorTypeIndex = findTypeIndex; } - changeColorFormatByIcon(direction='up'){ - let total=this.presetColorType.length; - this.currentColorTypeIndex=(total+this.currentColorTypeIndex + (direction=='up'?1:-1)) % total; - this.colorFormat=this.presetColorType[this.currentColorTypeIndex]['type']; + changeColorFormatByIcon(direction = 'up') { + const total = this.presetColorType.length; + this.currentColorTypeIndex = (total + this.currentColorTypeIndex + (direction === 'up' ? 1 : -1)) % total; + this.colorFormat = this.presetColorType[this.currentColorTypeIndex].type; } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.module.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.module.ts index fe04179441ebf8c257c20e764d3867d7bfd95e49..7478ffe4ce283cef8614f28d4c7e2e21b2314dc8 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.module.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/color-picker.module.ts @@ -1,4 +1,4 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; +import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/base-component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/base-component.ts index 7fe20d9c8ae5abcc78985461783eb5af95504883..a4e26f9218224ad9c049353c225ed4098d34f33f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/base-component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/base-component.ts @@ -1,4 +1,5 @@ -import { ElementRef, Renderer2, OnDestroy } from '@angular/core' +/* eslint-disable @typescript-eslint/ban-types */ +import { ElementRef, Renderer2, OnDestroy } from '@angular/core'; /** * because a dynamic directive yet is not implemented, @@ -7,50 +8,53 @@ import { ElementRef, Renderer2, OnDestroy } from '@angular/core' * components */ export abstract class BaseComponent implements OnDestroy { - private eventHooks: Array = [] - private window: any = { pageXOffset: 0, pageYOffset: 0 } - private readonly requestAnimationFrame + private eventHooks: Array = []; + + private window: any = { pageXOffset: 0, pageYOffset: 0 }; + + private readonly requestAnimationFrame; constructor( private readonly document, protected readonly elementRef: ElementRef, protected readonly renderer: Renderer2 ) { - this.window = document.defaultView - this.requestAnimationFrame = this.getRequestAnimationFrame() + this.window = document.defaultView; + this.requestAnimationFrame = this.getRequestAnimationFrame(); } - // 抽象方法 移动焦点 子类中具体实现 + + // 抽象方法 移动焦点 子类中具体实现 public abstract movePointer(coordinates: { - x: number - y: number - height: number - width: number - }): void - - // 鼠标点击事件及触屏事件 + x: number; + y: number; + height: number; + width: number; + }): void; + + // 鼠标点击事件及触屏事件 protected onEventChange(event: MouseEvent | TouchEvent): void { - this.calculate(event) + this.calculate(event); this.eventHooks.push( this.renderer.listen(this.document, 'mouseup', () => this.removeListeners() ) - ) + ); this.eventHooks.push( this.renderer.listen(this.document, 'touchend', () => this.removeListeners() ) - ) + ); this.eventHooks.push( this.renderer.listen(this.document, 'mousemove', e => this.calculate(e) ) - ) + ); this.eventHooks.push( this.renderer.listen(this.document, 'touchmove', e => this.calculate(e) ) - ) + ); } private calculateCoordinates(event: MouseEvent | TouchEvent): void { @@ -59,31 +63,31 @@ export abstract class BaseComponent implements OnDestroy { height: elHeight, top: elTop, left: elLeft - } = this.elementRef.nativeElement.getBoundingClientRect() + } = this.elementRef.nativeElement.getBoundingClientRect(); const pageX = - typeof event['pageX'] === 'number' - ? event['pageX'] - : event['touches'][0].pageX + typeof event.pageX === 'number' + ? event.pageX + : event.touches[0].pageX; const pageY = - typeof event['pageY'] === 'number' - ? event['pageY'] - : event['touches'][0].pageY + typeof event.pageY === 'number' + ? event.pageY + : event.touches[0].pageY; const x = Math.max( 0, Math.min(pageX - (elLeft + this.window.pageXOffset), elWidth) - ) + ); const y = Math.max( 0, Math.min(pageY - (elTop + this.window.pageYOffset), elHeight) - ) + ); - this.movePointer({ x, y, height: elHeight, width: elWidth }) + this.movePointer({ x, y, height: elHeight, width: elWidth }); } private calculate(event: MouseEvent | TouchEvent): void { - event.preventDefault() + event.preventDefault(); if (!this.requestAnimationFrame) { return this.calculateCoordinates(event); } @@ -98,15 +102,16 @@ export abstract class BaseComponent implements OnDestroy { this.window.mozRequestAnimationFrame || this.window.oRequestAnimationFrame || this.window.msRequestAnimationFrame - ) + ); } - // 注册事件并清空待注册列表 + + // 注册事件并清空待注册列表 private removeListeners(): void { - this.eventHooks.forEach(cb => cb()) - this.eventHooks.length = 0 + this.eventHooks.forEach(cb => cb()); + this.eventHooks.length = 0; } public ngOnDestroy(): void { - this.removeListeners() + this.removeListeners(); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/hue/hue.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/hue/hue.component.ts index 4b19edbe301c0ea1f8b9929e03d1f69c675a07ba..69bfbb27af488b0ef80fd4d44df4bd217c8e829f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/hue/hue.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/hue/hue.component.ts @@ -10,11 +10,12 @@ import { EventEmitter, ViewChild, HostListener -} from '@angular/core' -import { DOCUMENT } from '@angular/common' +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +import { BaseComponent } from '../base-component'; +import { Color } from '../../helpers/color.class'; -import { BaseComponent } from '../base-component' -import { Color } from '../../helpers/color.class' @Component({ selector: 'hue', templateUrl: './hue.component.html', @@ -22,71 +23,74 @@ import { Color } from '../../helpers/color.class' }) export class HueComponent extends BaseComponent implements OnInit { @Input() - public hue: Color + public hue: Color; @Input() - public color: Color + public color: Color; + + private isVertical = false; - private isVertical: boolean = false @Input() public set vertical(value: string) { - this.isVertical = true + this.isVertical = true; } + @Output() - public hueChange = new EventEmitter(false) + public hueChange = new EventEmitter(false); @Output() - public colorChange = new EventEmitter(false) + public colorChange = new EventEmitter(false); @ViewChild('thumb') - public thumb: ElementRef + public thumb: ElementRef; constructor( renderer: Renderer2, @Inject(DOCUMENT) document, elementRef: ElementRef ) { - super(document, elementRef, renderer) + super(document, elementRef, renderer); } @HostListener('mousedown', ['$event']) @HostListener('touchstart', ['$event']) public onClick(event: any): void { - this.onEventChange(event) + this.onEventChange(event); } ngOnInit(): void {} + // color 改变时更改 cursor 位置 public ngOnChanges(changes: SimpleChanges): void { if ( changes.hue && changes.hue.previousValue !== changes.hue.currentValue ) { - const hsva = this.hue.getHsva() - this.changePointerPosition(hsva.hue) + const hsva = this.hue.getHsva(); + this.changePointerPosition(hsva.hue); } } public movePointer({ x, y, height, width }): void { - const hue = this.isVertical ? (y / height) * 360 : (x / width) * 360 - this.changePointerPosition(hue) + const hue = this.isVertical ? (y / height) * 360 : (x / width) * 360; + this.changePointerPosition(hue); - const color = this.color.getHsva() + const color = this.color.getHsva(); const newColor = new Color().setHsva( hue, color.saturation, color.value, color.alpha - ) - const newHueColor = new Color().setHsva(hue, 100, 100, color.alpha) + ); + const newHueColor = new Color().setHsva(hue, 100, 100, color.alpha); - this.hueChange.emit(newHueColor) - this.colorChange.emit(newColor) + this.hueChange.emit(newHueColor); + this.colorChange.emit(newColor); } private changePointerPosition(hue: number): void { - const x = Math.max(0, Math.min((hue / 360) * 100, 100)) - const orientation = this.isVertical ? 'top' : 'left' - this.renderer.setStyle(this.thumb.nativeElement, orientation, `${x}%`) + const x = Math.max(0, Math.min((hue / 360) * 100, 100)); + const orientation = this.isVertical ? 'top' : 'left'; + this.renderer.setStyle(this.thumb.nativeElement, orientation, `${x}%`); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/input-btns/input-btns.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/input-btns/input-btns.component.ts index a6666181fb3efa7b70bca9425dc7e55b1fa88a30..2d8b6d65a4a312fd0b3c51cbe2d9c8492e85d51d 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/input-btns/input-btns.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/input-btns/input-btns.component.ts @@ -11,11 +11,12 @@ import { ViewChild, HostBinding, HostListener -} from '@angular/core' -import { DOCUMENT } from '@angular/common' +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +import { BaseComponent } from '../base-component'; +import { Color } from '../../helpers/color.class'; -import { BaseComponent } from '../base-component' -import { Color } from '../../helpers/color.class' @Component({ selector: 'input-btns', templateUrl: './input-btns.component.html', @@ -23,39 +24,40 @@ import { Color } from '../../helpers/color.class' }) export class InputBtnsComponent extends BaseComponent implements OnInit { @Input() - public hue: Color + public hue: Color; @Input() - public color: Color + public color: Color; @Output() - public colorChange = new EventEmitter(false) + public colorChange = new EventEmitter(false); @ViewChild('cursor') - public cursor: ElementRef + public cursor: ElementRef; constructor( renderer: Renderer2, @Inject(DOCUMENT) document, elementRef: ElementRef ) { - super(document, elementRef, renderer) + super(document, elementRef, renderer); } @HostListener('mousedown', ['$event']) @HostListener('touchstart', ['$event']) public onClick(event: any): void { - this.onEventChange(event) + this.onEventChange(event); } ngOnInit(): void {} + // color 改变时更改 cursor 位置 public ngOnChanges(changes: SimpleChanges): void {} public movePointer({ x, y, height, width }): void {} private changePointerPosition(x: number, y: number): void { - this.renderer.setStyle(this.cursor.nativeElement, 'top', `${100 - y}%`) - this.renderer.setStyle(this.cursor.nativeElement, 'left', `${x}%`) + this.renderer.setStyle(this.cursor.nativeElement, 'top', `${100 - y}%`); + this.renderer.setStyle(this.cursor.nativeElement, 'left', `${x}%`); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.scss b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.scss index d8fe9b6d4696b47b4e81ad58a682064051487a89..e2dc2141329d8755a9cc875a9791341907191011 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.scss +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.scss @@ -14,9 +14,6 @@ height: 20px; border-radius: 4px; cursor: pointer; - // &:nth-child(10n + 1) { - // margin-left: 0; - // } &.selected { box-shadow: 0 0 3px 2px #409eff; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.ts index 0c25150ab9f45082280aed35d30cf14c557a903a..e08677dd8b047516564afc39a74cb3b23c86b0ac 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/preset/preset.component.ts @@ -6,8 +6,8 @@ import { ViewChild, ElementRef, Renderer2 -} from '@angular/core' -import { Color } from '../../helpers/color.class' +} from '@angular/core'; +import { Color } from '../../helpers/color.class'; @Component({ selector: 'preset', @@ -16,43 +16,44 @@ import { Color } from '../../helpers/color.class' }) export class PresetComponent { @Input() - public colorPresets: Array + public colorPresets: Array; + @Input() - public hue: Color + public hue: Color; @Input() - public color: Color + public color: Color; @Output() - public colorChange = new EventEmitter(false) + public colorChange = new EventEmitter(false); @Output() - public hueChange = new EventEmitter(false) + public hueChange = new EventEmitter(false); @ViewChild('selectors') - public selectors: ElementRef + public selectors: ElementRef; constructor(public renderer: Renderer2) {} public onSelectionChange(color: Color, selected: ElementRef): void { const preSelected = this.selectors.nativeElement.querySelector( '.selected' - ) + ); if (preSelected) { - this.renderer.removeClass(preSelected, 'selected') + this.renderer.removeClass(preSelected, 'selected'); } - this.renderer.addClass(selected, 'selected') + this.renderer.addClass(selected, 'selected'); - const selectedRgbaColor = color.getRgba() - const selectedHsvaColor = color.getHsva() + const selectedRgbaColor = color.getRgba(); + const selectedHsvaColor = color.getHsva(); const newColor = new Color().setRgba( selectedRgbaColor.red, selectedRgbaColor.green, selectedRgbaColor.blue, selectedRgbaColor.alpha - ) - const hueColor = new Color().setHsva(selectedHsvaColor.hue) - this.hueChange.emit(hueColor) - this.colorChange.emit(newColor) + ); + const hueColor = new Color().setHsva(selectedHsvaColor.hue); + this.hueChange.emit(hueColor); + this.colorChange.emit(newColor); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/sv-panel/sv-panel.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/sv-panel/sv-panel.component.ts index 21d8022fe19912a9c91a9908e5fb904ef1db94e7..11d5de14d23a7eb0c62951a19d423b4d5f2561ae 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/sv-panel/sv-panel.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/components/sv-panel/sv-panel.component.ts @@ -11,11 +11,12 @@ import { ViewChild, HostBinding, HostListener -} from '@angular/core' -import { DOCUMENT } from '@angular/common' +} from '@angular/core'; +import { DOCUMENT } from '@angular/common'; + +import { BaseComponent } from '../base-component'; +import { Color } from '../../helpers/color.class'; -import { BaseComponent } from '../base-component' -import { Color } from '../../helpers/color.class' @Component({ selector: 'sv-panel', templateUrl: './sv-panel.component.html', @@ -23,34 +24,34 @@ import { Color } from '../../helpers/color.class' }) export class SvPanelComponent extends BaseComponent implements OnInit { @Input() - public hue: Color + public hue: Color; @Input() - public color: Color + public color: Color; @Output() - public colorChange = new EventEmitter(false) + public colorChange = new EventEmitter(false); @ViewChild('cursor') - public cursor: ElementRef + public cursor: ElementRef; constructor( renderer: Renderer2, @Inject(DOCUMENT) document, elementRef: ElementRef ) { - super(document, elementRef, renderer) + super(document, elementRef, renderer); } @HostBinding('style.backgroundColor') public get backgroundColor(): string { - return this.hue ? this.hue.toRgbaString() : '#3f51b5' + return this.hue ? this.hue.toRgbaString() : '#3f51b5'; } @HostListener('mousedown', ['$event']) @HostListener('touchstart', ['$event']) public onClick(event: any): void { - this.onEventChange(event) + this.onEventChange(event); } ngOnInit(): void { @@ -63,37 +64,38 @@ export class SvPanelComponent extends BaseComponent implements OnInit { // this.backgroundColor // ) } + // color 改变时更改 cursor 位置 public ngOnChanges(changes: SimpleChanges): void { if ( changes.color && changes.color.previousValue !== changes.color.currentValue ) { - const hsva = this.color.getHsva() - this.changePointerPosition(hsva.saturation, hsva.value) + const hsva = this.color.getHsva(); + this.changePointerPosition(hsva.saturation, hsva.value); } } public movePointer({ x, y, height, width }): void { - const saturation = (x * 100) / width - const bright = -((y * 100) / height) + 100 + const saturation = (x * 100) / width; + const bright = -((y * 100) / height) + 100; - this.changePointerPosition(saturation, bright) - const hsva = this.hue.getHsva() - const color = this.color.getHsva() + this.changePointerPosition(saturation, bright); + const hsva = this.hue.getHsva(); + const color = this.color.getHsva(); const newColor = new Color().setHsva( hsva.hue, saturation, bright, color.alpha - ) - this.colorChange.emit(newColor) + ); + this.colorChange.emit(newColor); } private changePointerPosition(x: number, y: number): void { - x = Math.max(0, Math.min(x, 100)) - y = Math.max(0, Math.min(y, 100)) - this.renderer.setStyle(this.cursor.nativeElement, 'top', `${100 - y}%`) - this.renderer.setStyle(this.cursor.nativeElement, 'left', `${x}%`) + x = Math.max(0, Math.min(x, 100)); + y = Math.max(0, Math.min(y, 100)); + this.renderer.setStyle(this.cursor.nativeElement, 'top', `${100 - y}%`); + this.renderer.setStyle(this.cursor.nativeElement, 'left', `${x}%`); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/base-color.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/base-color.class.ts index 048008e3b0b486ea364866e9da2b6d916368e9ad..90cbafee52e054d0a3b7229c6fafa11594aeb7e9 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/base-color.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/base-color.class.ts @@ -1,6 +1,6 @@ - - - +export abstract class BaseColor { + public abstract toString(showAlpha?: boolean): string; +} export abstract class BaseColor { public abstract toString(showAlpha?: boolean): string; diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/cmyk.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/cmyk.class.ts index d3e463e0285f66f1f74b0bf53c7bc2da9f8b308c..4e3826c7098e41129c64d65e297e2f4160ba0a08 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/cmyk.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/cmyk.class.ts @@ -2,7 +2,7 @@ import { BaseColor } from './base-color.class'; /** * CMYK color space - * + * * Cyan = ranges from 0 to 100% * Magenta = ranges from 0 to 100% * Yellow = ranges from 0 to 100% @@ -30,6 +30,11 @@ export class Cmyk extends BaseColor { return Math.round(this.yellow); } + public getBlack() { + return Math.round(this.black); + } +} + public getBlack() { return Math.round(this.black); } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.spec.ts index 62e7e803222339defd8967b20e8a29599c5c2fdf..8421063513dbb1ead58753dc2a20ac55ec6bbaa0 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.spec.ts @@ -44,7 +44,7 @@ const staticColors = { hsl: 'hsl(352, 66%, 23%)', cmyk: 'cmyk(0%, 80%, 69%, 61%)' } -} +}; describe('Color.class', () => { @@ -156,4 +156,6 @@ describe('Color.class', () => { // const purple = new Color(staticColors.purple.cmyk); // })); +}); + }); \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.ts index 705dcea50718f8bdc6b65e88479a17c76be90643..76e336f7baf987adde80339c45d6242842bd5f5b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/color.class.ts @@ -1,3 +1,5 @@ +/* eslint-disable no-fallthrough */ +/* eslint-disable no-case-declarations */ import { Cmyk } from './cmyk.class'; import { Hsla } from './hsla.class'; import { Hsva } from './hsva.class'; @@ -16,6 +18,7 @@ export class Color { * #ff0000 */ private hsva: Hsva = new Hsva(0, 1, 1, 1); + private rgba: Rgba = new Rgba(255, 0, 0, 1); constructor(colorString?: ColorString){ @@ -27,13 +30,13 @@ export class Color { public static from(color: ColorString | Color | Hsva | Rgba | Hsla): Color { if (typeof color === 'string') { return new Color(color); - } else if(color instanceof Color) { + } if(color instanceof Color) { return color.clone(); - } else if(color instanceof Rgba) { + } if(color instanceof Rgba) { return new Color().setRgba(color.red, color.green, color.blue, color.alpha); - } else if(color instanceof Hsva) { + } if(color instanceof Hsva) { return new Color().setHsva(color.hue, color.saturation, color.value, color.alpha); - } else if(color instanceof Hsla) { + } if(color instanceof Hsla) { return new Color().setHsla(color.hue, color.saturation, color.lightness, color.alpha); } @@ -57,7 +60,7 @@ export class Color { /** * define Color from HSV values */ - public setHsva(hue: number = null, saturation: number = 100, brightness: number = 100, alpha: number = 1): this { + public setHsva(hue: number = null, saturation = 100, brightness = 100, alpha = 1): this { if (hue != null) { this.hsva.hue = hue; } @@ -82,7 +85,7 @@ export class Color { /** * define Color from RGBa */ - public setRgba(red: number = null, green: number = null, blue: number = null, alpha: number = 1): this { + public setRgba(red: number = null, green: number = null, blue: number = null, alpha = 1): this { if (red != null) { this.rgba.red = red; } @@ -107,7 +110,7 @@ export class Color { /** * define Color from HSLa */ - public setHsla(hue: number, saturation: number, lightness: number, alpha: number = 1): this { + public setHsla(hue: number, saturation: number, lightness: number, alpha = 1): this { if (alpha != null) { alpha = alpha > 1 ? 1 : alpha < 0 ? 0 : alpha; this.rgba.alpha = alpha; @@ -122,7 +125,7 @@ export class Color { /** * return hexadecimal value formatted as '#341d2a' or '#341d2aFF' if alhpa channel is enabled */ - public toHexString(alpha: boolean = false): ColorString { + public toHexString(alpha = false): ColorString { /* tslint:disable:no-bitwise */ let hex = '#' + ((1 << 24) | (this.rgba.getRed() << 16) | (this.rgba.getGreen() << 8) | this.rgba.getBlue()).toString(16).substr(1); if (alpha) { @@ -198,7 +201,7 @@ export class Color { } private hsvaToHsla(color: Hsva): Hsla { - const hue = color.hue; + const {hue} = color; const s = color.saturation / 100; const v = color.value / 100; const lightness = ((2 - s) * color.value) / 2; @@ -208,7 +211,7 @@ export class Color { } private hslaToHsva(color: Hsla): Hsva { - const hue = color.hue; + const {hue} = color; const l = (color.lightness / 100) * 2; const s = (color.saturation / 100) * (l <= 1 ? l : 2 - l); const value = (l + s) / 2; @@ -221,7 +224,7 @@ export class Color { const red = color.red / 255; const green = color.green / 255; const blue = color.blue / 255; - const alpha = color.alpha; + const {alpha} = color; const Cmax = Math.max(red, green, blue); const Cmin = Math.min(red, green, blue); @@ -233,22 +236,22 @@ export class Color { if (Cmax !== Cmin) { switch (Cmax) { - case red: - hue = (green - blue) / delta + (green < blue ? 6 : 0); - break; - case green: - hue = 2 + (blue - red) / delta; - break; - case blue: - hue = 4 + (red - green) / delta; - break; + case red: + hue = (green - blue) / delta + (green < blue ? 6 : 0); + break; + case green: + hue = 2 + (blue - red) / delta; + break; + case blue: + hue = 4 + (red - green) / delta; + break; } hue /= 6; } - hue = hue * 360; - saturation = saturation * 100; - brightness = brightness * 100; + hue *= 360; + saturation *= 100; + brightness *= 100; return new Hsva(hue, saturation, brightness, alpha); } @@ -259,7 +262,7 @@ export class Color { let blue = 0; const saturation = color.saturation / 100; const brightness = color.value / 100; - const alpha = color.alpha; + const {alpha} = color; const hex = color.hue / 60; const primary = Math.floor(hex); @@ -269,20 +272,20 @@ export class Color { const c = (1 - (saturation * (1 - secoundary))) * brightness; switch (primary) { - case 6: - case 0: red = brightness; green = c; blue = a; break; - case 1: red = b; green = brightness; blue = a; break; - case 2: red = a; green = brightness; blue = c; break; - case 3: red = a; green = b; blue = brightness; break; - case 4: red = c; green = a; blue = brightness; break; - case 5: red = brightness; green = a; blue = b; break; + case 6: + case 0: red = brightness; green = c; blue = a; break; + case 1: red = b; green = brightness; blue = a; break; + case 2: red = a; green = brightness; blue = c; break; + case 3: red = a; green = b; blue = brightness; break; + case 4: red = c; green = a; blue = brightness; break; + case 5: red = brightness; green = a; blue = b; break; } - red = red * 255; - green = green * 255; - blue = blue * 255; + red *= 255; + green *= 255; + blue *= 255; - return new Rgba(red, green, blue, alpha) + return new Rgba(red, green, blue, alpha); } private rgbaToHsla(color: Rgba): Hsla { @@ -290,7 +293,7 @@ export class Color { const red = color.red / 255; const green = color.green / 255; const blue = color.blue / 255; - const alpha = color.alpha; + const {alpha} = color; const max = Math.max(red, green, blue); const min = Math.min(red, green, blue); @@ -303,23 +306,23 @@ export class Color { if (max !== min) { saturation = luminance > 0.5 ? delta / (2.0 - max - min) : delta / (max + min); switch (max) { - case red: - hue = (green - blue) / delta + (green < blue ? 6 : 0); - break; - case green: - hue = (blue - red) / delta + 2; - break; - case blue: - hue = (red - green) / delta + 4; - break; + case red: + hue = (green - blue) / delta + (green < blue ? 6 : 0); + break; + case green: + hue = (blue - red) / delta + 2; + break; + case blue: + hue = (red - green) / delta + 4; + break; } hue /= 6; } - hue = hue * 360; - saturation = saturation * 100; - luminance = luminance * 100; + hue *= 360; + saturation *= 100; + luminance *= 100; return new Hsla(hue, saturation, luminance, alpha); } @@ -335,7 +338,7 @@ export class Color { const hue = color.hue / 360; const saturation = color.saturation / 100; const lightness = color.lightness / 100; - const alpha = color.alpha; + const {alpha} = color; let red = lightness; let green = lightness; @@ -350,9 +353,9 @@ export class Color { blue = this.hueToRgb(p, q, hue - (1 / 3)); } - red = red * 255; - green = green * 255; - blue = blue * 255; + red *= 255; + green *= 255; + blue *= 255; return new Rgba(red, green, blue, alpha); } @@ -390,9 +393,9 @@ export class Color { let green = Math.min(1, (1 - magenta) * (1 - black)); let blue = Math.min(1, (1 - yellow) * (1 - black)); - red = red * 255; - green = green * 255; - blue = blue * 255; + red *= 255; + green *= 255; + blue *= 255; return new Rgba(red, green, blue, 1); } @@ -430,7 +433,7 @@ export class Color { let yellow = 1 - blue; let black = Math.min(cyan, magenta, yellow); - if (black == 1) { + if (black === 1) { return new Cmyk(0, 0, 0, 1); } @@ -438,10 +441,10 @@ export class Color { magenta = (magenta - black) / (1 - black); yellow = (yellow - black) / (1 - black); - black = black * 100; - cyan = cyan * 100; - magenta = magenta * 100; - yellow = yellow * 100; + black *= 100; + cyan *= 100; + magenta *= 100; + yellow *= 100; return new Cmyk(cyan, magenta, yellow, black); } @@ -462,7 +465,7 @@ export class Color { */ if (str[0] === '#') { let hex = str.substr(1); - const length = hex.length; + const {length} = hex; let a = 1; let hexArray; @@ -491,26 +494,26 @@ export class Color { let alpha = 1; switch (colorTypeName) { - case 'rgba': - alpha = parseFloat(params.pop()); - // Fall through. - case 'rgb': - rgba = new Rgba(parseInt(params[0], 10), parseInt(params[1], 10), parseInt(params[2], 10), alpha); - break; - case 'hsla': - alpha = parseFloat(params.pop()); - case 'hsl': - const hsla = new Hsla(parseInt(params[0], 10), parseInt(params[1], 10), parseInt(params[2], 10), alpha); - rgba = this.hslaToRgba(hsla); - break; - case 'cmyk': - const cmyk = new Cmyk( - parseInt(params[0], 10), - parseInt(params[1], 10), - parseInt(params[2], 10), - parseInt(params[3], 10)); - rgba = this.cmykToRgba(cmyk); - break; + case 'rgba': + alpha = parseFloat(params.pop()); + // Fall through. + case 'rgb': + rgba = new Rgba(parseInt(params[0], 10), parseInt(params[1], 10), parseInt(params[2], 10), alpha); + break; + case 'hsla': + alpha = parseFloat(params.pop()); + case 'hsl': + const hsla = new Hsla(parseInt(params[0], 10), parseInt(params[1], 10), parseInt(params[2], 10), alpha); + rgba = this.hslaToRgba(hsla); + break; + case 'cmyk': + const cmyk = new Cmyk( + parseInt(params[0], 10), + parseInt(params[1], 10), + parseInt(params[2], 10), + parseInt(params[3], 10)); + rgba = this.cmykToRgba(cmyk); + break; } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/colors-table.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/colors-table.class.ts index 69e9b5b1fcb8986bf9fb411bbbee55d459e1b562..fa761cbf9f1ccfaa5a6cac4479c1a43b0debfde7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/colors-table.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/colors-table.class.ts @@ -1,5 +1,306 @@ import { Rgba } from './rgba.class'; +/** + * http://www.w3.org/TR/css3-color/ + */ +export class ColorsTable { + public static transparent = new Rgba(0, 0, 0, 0); + + public static aliceblue = new Rgba(240, 248, 255, 1); + + public static antiquewhite = new Rgba(250, 235, 215, 1); + + public static aqua = new Rgba(0, 255, 255, 1); + + public static aquamarine = new Rgba(127, 255, 212, 1); + + public static azure = new Rgba(240, 255, 255, 1); + + public static beige = new Rgba(245, 245, 220, 1); + + public static bisque = new Rgba(255, 228, 196, 1); + + public static black = new Rgba(0, 0, 0, 1); + + public static blanchedalmond = new Rgba(255, 235, 205, 1); + + public static blue = new Rgba(0, 0, 255, 1); + + public static blueviolet = new Rgba(138, 43, 226, 1); + + public static brown = new Rgba(165, 42, 42, 1); + + public static burlywood = new Rgba(222, 184, 135, 1); + + public static cadetblue = new Rgba(95, 158, 160, 1); + + public static chartreuse = new Rgba(127, 255, 0, 1); + + public static chocolate = new Rgba(210, 105, 30, 1); + + public static coral = new Rgba(255, 127, 80, 1); + + public static cornflowerblue = new Rgba(100, 149, 237, 1); + + public static cornsilk = new Rgba(255, 248, 220, 1); + + public static crimson = new Rgba(220, 20, 60, 1); + + public static cyan = new Rgba(0, 255, 255, 1); + + public static darkblue = new Rgba(0, 0, 139, 1); + + public static darkcyan = new Rgba(0, 139, 139, 1); + + public static darkgoldenrod = new Rgba(184, 134, 11, 1); + + public static darkgray = new Rgba(169, 169, 169, 1); + + public static darkgreen = new Rgba(0, 100, 0, 1); + + public static darkgrey = ColorsTable.darkgray; + + public static darkkhaki = new Rgba(189, 183, 107, 1); + + public static darkmagenta = new Rgba(139, 0, 139, 1); + + public static darkolivegreen = new Rgba(85, 107, 47, 1); + + public static darkorange = new Rgba(255, 140, 0, 1); + + public static darkorchid = new Rgba(153, 50, 204, 1); + + public static darkred = new Rgba(139, 0, 0, 1); + + public static darksalmon = new Rgba(233, 150, 122, 1); + + public static darkseagreen = new Rgba(143, 188, 143, 1); + + public static darkslateblue = new Rgba(72, 61, 139, 1); + + public static darkslategray = new Rgba(47, 79, 79, 1); + + public static darkslategrey = ColorsTable.darkslategray; + + public static darkturquoise = new Rgba(0, 206, 209, 1); + + public static darkviolet = new Rgba(148, 0, 211, 1); + + public static deeppink = new Rgba(255, 20, 147, 1); + + public static deepskyblue = new Rgba(0, 191, 255, 1); + + public static dimgray = new Rgba(105, 105, 105, 1); + + public static dimgrey = ColorsTable.dimgray; + + public static dodgerblue = new Rgba(30, 144, 255, 1); + + public static firebrick = new Rgba(178, 34, 34, 1); + + public static floralwhite = new Rgba(255, 250, 240, 1); + + public static forestgreen = new Rgba(34, 139, 34, 1); + + public static fuchsia = new Rgba(255, 0, 255, 1); + + public static gainsboro = new Rgba(220, 220, 220, 1); + + public static ghostwhite = new Rgba(248, 248, 255, 1); + + public static gold = new Rgba(255, 215, 0, 1); + + public static goldenrod = new Rgba(218, 165, 32, 1); + + public static gray = new Rgba(128, 128, 128, 1); + + public static grey = ColorsTable.gray; + + public static green = new Rgba(0, 128, 0, 1); + + public static greenyellow = new Rgba(173, 255, 47, 1); + + public static honeydew = new Rgba(240, 255, 240, 1); + + public static hotpink = new Rgba(255, 105, 180, 1); + + public static indianred = new Rgba(205, 92, 92, 1); + + public static indigo = new Rgba(75, 0, 130, 1); + + public static ivory = new Rgba(255, 255, 240, 1); + + public static khaki = new Rgba(240, 230, 140, 1); + + public static lavender = new Rgba(230, 230, 250, 1); + + public static lavenderblush = new Rgba(255, 240, 245, 1); + + public static lawngreen = new Rgba(124, 252, 0, 1); + + public static lemonchiffon = new Rgba(255, 250, 205, 1); + + public static lightblue = new Rgba(173, 216, 230, 1); + + public static lightcoral = new Rgba(240, 128, 128, 1); + + public static lightcyan = new Rgba(224, 255, 255, 1); + + public static lightgoldenrodyellow = new Rgba(250, 250, 210, 1); + + public static lightgray = new Rgba(211, 211, 211, 1); + + public static lightgreen = new Rgba(144, 238, 144, 1); + + public static lightgrey = ColorsTable.lightgray; + + public static lightpink = new Rgba(255, 182, 193, 1); + + public static lightsalmon = new Rgba(255, 160, 122, 1); + + public static lightseagreen = new Rgba(32, 178, 170, 1); + + public static lightskyblue = new Rgba(135, 206, 250, 1); + + public static lightslategray = new Rgba(119, 136, 153, 1); + + public static lightslategrey = ColorsTable.lightslategray; + + public static lightsteelblue = new Rgba(176, 196, 222, 1); + + public static lightyellow = new Rgba(255, 255, 224, 1); + + public static lime = new Rgba(0, 255, 0, 1); + + public static limegreen = new Rgba(50, 205, 50, 1); + + public static linen = new Rgba(250, 240, 230, 1); + + public static magenta = new Rgba(255, 0, 255, 1); + + public static maroon = new Rgba(128, 0, 0, 1); + + public static mediumaquamarine = new Rgba(102, 205, 170, 1); + + public static mediumblue = new Rgba(0, 0, 205, 1); + + public static mediumorchid = new Rgba(186, 85, 211, 1); + + public static mediumpurple = new Rgba(147, 112, 219, 1); + + public static mediumseagreen = new Rgba(60, 179, 113, 1); + + public static mediumslateblue = new Rgba(123, 104, 238, 1); + + public static mediumspringgreen = new Rgba(0, 250, 154, 1); + + public static mediumturquoise = new Rgba(72, 209, 204, 1); + + public static mediumvioletred = new Rgba(199, 21, 133, 1); + + public static midnightblue = new Rgba(25, 25, 112, 1); + + public static mintcream = new Rgba(245, 255, 250, 1); + + public static mistyrose = new Rgba(255, 228, 225, 1); + + public static moccasin = new Rgba(255, 228, 181, 1); + + public static navajowhite = new Rgba(255, 222, 173, 1); + + public static navy = new Rgba(0, 0, 128, 1); + + public static oldlace = new Rgba(253, 245, 230, 1); + + public static olive = new Rgba(128, 128, 0, 1); + + public static olivedrab = new Rgba(107, 142, 35, 1); + + public static orange = new Rgba(255, 165, 0, 1); + + public static orangered = new Rgba(255, 69, 0, 1); + + public static orchid = new Rgba(218, 112, 214, 1); + + public static palegoldenrod = new Rgba(238, 232, 170, 1); + + public static palegreen = new Rgba(152, 251, 152, 1); + + public static paleturquoise = new Rgba(175, 238, 238, 1); + + public static palevioletred = new Rgba(219, 112, 147, 1); + + public static papayawhip = new Rgba(255, 239, 213, 1); + + public static peachpuff = new Rgba(255, 218, 185, 1); + + public static peru = new Rgba(205, 133, 63, 1); + + public static pink = new Rgba(255, 192, 203, 1); + + public static plum = new Rgba(221, 160, 221, 1); + + public static powderblue = new Rgba(176, 224, 230, 1); + + public static purple = new Rgba(128, 0, 128, 1); + + public static red = new Rgba(255, 0, 0, 1); + + public static rosybrown = new Rgba(188, 143, 143, 1); + + public static royalblue = new Rgba(65, 105, 225, 1); + + public static saddlebrown = new Rgba(139, 69, 19, 1); + + public static salmon = new Rgba(250, 128, 114, 1); + + public static sandybrown = new Rgba(244, 164, 96, 1); + + public static seagreen = new Rgba(46, 139, 87, 1); + + public static seashell = new Rgba(255, 245, 238, 1); + + public static sienna = new Rgba(160, 82, 45, 1); + + public static silver = new Rgba(192, 192, 192, 1); + + public static skyblue = new Rgba(135, 206, 235, 1); + + public static slateblue = new Rgba(106, 90, 205, 1); + + public static slategray = new Rgba(112, 128, 144, 1); + + public static slategrey = ColorsTable.slategray; + + public static snow = new Rgba(255, 250, 250, 1); + + public static springgreen = new Rgba(0, 255, 127, 1); + + public static steelblue = new Rgba(70, 130, 180, 1); + + public static tan = new Rgba(210, 180, 140, 1); + + public static teal = new Rgba(0, 128, 128, 1); + + public static thistle = new Rgba(216, 191, 216, 1); + + public static tomato = new Rgba(255, 99, 71, 1); + + public static turquoise = new Rgba(64, 224, 208, 1); + + public static violet = new Rgba(238, 130, 238, 1); + + public static wheat = new Rgba(245, 222, 179, 1); + + public static white = new Rgba(255, 255, 255, 1); + + public static whitesmoke = new Rgba(245, 245, 245, 1); + + public static yellow = new Rgba(255, 255, 0, 1); + + public static yellowgreen = new Rgba(154, 205, 50, 1); +} + /** * http://www.w3.org/TR/css3-color/ */ diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/control.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/control.class.ts index 6a8ffe21a58cd515b03d5d4205b8f04b5966d277..541a1dd1a5add69798f2e67c04f2a3b901d32fda 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/control.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/control.class.ts @@ -1,3 +1,6 @@ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable max-len */ +/* eslint-disable eqeqeq */ import { Color, ColorString } from './color.class'; import { Subject, BehaviorSubject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; @@ -18,19 +21,25 @@ export enum ColorType { export class ColorPickerControl { private modelValue: Color = null; + private hueValue: Color = null; + private initValue: Color = null; + private readonly valueChanged: Subject = new Subject(); public readonly presetsVisibilityChanges: BehaviorSubject = new BehaviorSubject(true); + public initType: ColorType = null; + public readonly alphaChannelVisibilityChanges: BehaviorSubject = new BehaviorSubject(true); + public readonly valueChanges = this.valueChanged.asObservable().pipe(distinctUntilChanged((x, y) => x.toRgbaString() == y.toRgbaString())); private colorPresets: Array | Color> = []; constructor() { - //new Rgba(255, 0, 0, 1) + // new Rgba(255, 0, 0, 1) const color = Color.from(''); this.setValue(color); this.setHueColor(color); @@ -129,21 +138,21 @@ export class ColorPickerControl { const OpenParenthesis = str.indexOf('('); const colorTypeName = str.substr(0, OpenParenthesis); switch (colorTypeName) { - case ColorType.rgba: - this.initType = ColorType.rgba; - break; - case ColorType.rgb: - this.initType = ColorType.rgb; - break; - case ColorType.hsla: - this.initType = ColorType.hsla; - break; - case ColorType.hsl: - this.initType = ColorType.hsl; - break; - case ColorType.cmyk: - this.initType = ColorType.cmyk; - break; + case ColorType.rgba: + this.initType = ColorType.rgba; + break; + case ColorType.rgb: + this.initType = ColorType.rgb; + break; + case ColorType.hsla: + this.initType = ColorType.hsla; + break; + case ColorType.hsl: + this.initType = ColorType.hsl; + break; + case ColorType.cmyk: + this.initType = ColorType.cmyk; + break; } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/helper.functions.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/helper.functions.ts index db6c47d29448d053e7a2ef5683e54e2ca2763398..4c79b9f79e8fa75c0ecc7ca2fd7547f1b16754c3 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/helper.functions.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/helper.functions.ts @@ -1,22 +1,21 @@ import { Color } from './color.class'; import { ColorType } from './control.class'; - export function getValueByType(color: Color, type: ColorType): string { - switch(type) { - case ColorType.hex: - return color.toHexString(); - case ColorType.hexa: - return color.toHexString(true); - case ColorType.rgb: - return color.toRgbString(); - case ColorType.rgba: - return color.toRgbaString(); - case ColorType.hsl: - return color.toHslString(); - case ColorType.hsla: - return color.toHslaString(); - default: - return color.toRgbaString(); + switch (type) { + case ColorType.hex: + return color.toHexString(); + case ColorType.hexa: + return color.toHexString(true); + case ColorType.rgb: + return color.toRgbString(); + case ColorType.rgba: + return color.toRgbaString(); + case ColorType.hsl: + return color.toHslString(); + case ColorType.hsla: + return color.toHslaString(); + default: + return color.toRgbaString(); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsla.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsla.class.ts index ff287fffe9bbfe3268eff5f06d7cd14e6fef4c6e..dc8935b5015dc0d18c561bc650916724430be5de 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsla.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsla.class.ts @@ -2,7 +2,7 @@ import { BaseColor } from './base-color.class'; /** * HSL and HSI are the same - * + * * Hue = ranges from 0 to 360° * Saturation = ranges from 0 to 100% * Lightness or Intensity = ranges from 0 to 100% @@ -14,8 +14,8 @@ export class Hsla extends BaseColor { super(); } - public toString(showAlphaChannel: boolean = true): string { - return showAlphaChannel + public toString(showAlphaChannel = true): string { + return showAlphaChannel ? `hsla(${this.getHue()}, ${this.getSaturation()}%, ${this.getLightness()}%, ${this.getAlpha()})` : `hsl(${this.getHue()}, ${this.getSaturation()}%, ${this.getLightness()}%)`; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsva.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsva.class.ts index c559878177f04cea2f07c8815fd13ec5d754abde..343b3d27d8f30b6dec0c4f4ba2438a314122271e 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsva.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/hsva.class.ts @@ -2,7 +2,7 @@ import { BaseColor } from './base-color.class'; /** * HSB and HSV are the same - * + * * Hue = ranges from 0 to 360° * Saturation = ranges from 0 to 100% * Brightness or Value = ranges from 0 to 100% @@ -14,9 +14,9 @@ export class Hsva extends BaseColor { super(); } - public toString(showAlphaChannel: boolean = true): string { - return showAlphaChannel ? `hsva(${this.getHue()}, ${this.getSaturation()}%, ${this.getValue()}%, ${this.getAlpha()})` - : `hsv(${this.getHue()}, ${this.getSaturation()}%, ${this.getValue()}%)`; + public toString(showAlphaChannel = true): string { + return showAlphaChannel ? `hsva(${this.getHue()}, ${this.getSaturation()}%, ${this.getValue()}%, ${this.getAlpha()})` + : `hsv(${this.getHue()}, ${this.getSaturation()}%, ${this.getValue()}%)`; } public getHue() { diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/rgba.class.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/rgba.class.ts index fdacbc9410296427130c9bdd1f8cac803e2ad1a1..79b9529132139101cb164e5a7f979c3546a0c560 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/rgba.class.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/color-picker/helpers/rgba.class.ts @@ -2,7 +2,7 @@ import { BaseColor } from './base-color.class'; /** * RGB (Red Green Blue) - * + * * Red = ranges from 0-255 * Green = ranges from 0-255 * Blue = ranges from 0-255 @@ -14,8 +14,8 @@ export class Rgba extends BaseColor { super(); } - public toString(showAlphaChannel: boolean = true): string { - return showAlphaChannel + public toString(showAlphaChannel = true): string { + return showAlphaChannel ? `rgba(${this.getRed()}, ${this.getGreen()}, ${this.getBlue()}, ${this.getAlpha()})` : `rgb(${this.getRed()}, ${this.getGreen()}, ${this.getBlue()})`; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.spec.ts index ad2d3c7a05fdd04604b76c0a80663fe3cba56125..d9e405deb68b3aa876f9db6bee5528a48e9d49f5 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { IframeComponent } from './iframe.component'; describe('IframeComponent', () => { - let component: IframeComponent; - let fixture: ComponentFixture; + let component: IframeComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ IframeComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ IframeComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(IframeComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(IframeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.ts index 8fe0a7cc4797e12e2c086ac3a7306ea68b49d017..71bb81d0a27e14879228a0516378ba93666073b3 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/iframe/iframe.component.ts @@ -14,28 +14,36 @@ import { ThemeRouteChangeService } from '../../service/theme-route-change.servic export class IframeComponent implements OnInit { @ViewChild('iframe') iframe: ElementRef; + private _previewType = ""; + /** * pType: preview-page 预览模板| preview-widget 预览组件 */ @Input() set previewType(pType: string) { // 预览类型 - if (pType != this._previewType) { + if (pType !== this._previewType) { this._previewType = pType; this.url = document.getElementsByTagName('base')[0].href + pType + "/" + this.themeRouteChangeSer.getFormatUrl(); this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.url); } } + get previewType() { return this._previewType; } url: string; + iframeUrl: SafeResourceUrl; + cssSubscription: Subscription; + widgetSubscription: Subscription; + theme: string; + widgetName = new BehaviorSubject(''); constructor( @@ -51,52 +59,31 @@ export class IframeComponent implements OnInit { this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.url); } }); - // this.route.params.subscribe((params) => { - // debugger - // const widget = params['previewType']; - - // this.url = document.getElementsByTagName('base')[0].href + 'preview-page'; - // this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.url); - // // if(this.widgetName.getValue() !== widget) { - // // this.widgetName.next(widget); - // // } - // // if(this.theme !== params['theme']) { - // // this.loading.show(); - // // this.theme = params['theme']; - // // this.url = document.getElementsByTagName('base')[0].href + (widget ? 'preview' : 'wizard') + '/' + this.theme; - // // this.iframeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.url); - // // } - // }); } receiveMessage(e): void { - // 根据iframe的信息判断,路由转跳 - // if (e.data.widget) { - // this.router.navigate(['/advanced', this.metadataService.theme.name, this.metadataService.theme.colorScheme, e.data.widget]); - // } - // iframe通知说关闭loading - if (e.data&&e.data['hideLoading']) { + if (e.data&&e.data.hideLoading) { console.log("iframe接收message事件"); this.onIframeLoad(); this.loading.hide(); } } + /** * iframe加载成功后 */ onIframeLoad(): void { const frameWindow = this.iframe.nativeElement.contentWindow; - // frameWindow can be null if iframe reloaded (wizard -> preview navigation) if (frameWindow === null) return; if (this.cssSubscription) this.cssSubscription.unsubscribe(); this.cssSubscription = this.metadataService.css.subscribe(({ css, theme }) => { - theme = theme ? theme : this.metadataService.theme; - let name = theme.name; + theme = theme || this.metadataService.theme; + const {name} = theme; const themeSize = theme.colorScheme.includes('loose') ? 'loose' : 'default'; console.log("iframe响应css的变更——theme:" + JSON.stringify(theme) + "——themeSize:" + themeSize); // iFrame窗口 发出消息事件 @@ -107,8 +94,6 @@ export class IframeComponent implements OnInit { }, this.url); }); - - } ngOnDestroy(): void { @@ -116,7 +101,7 @@ export class IframeComponent implements OnInit { } ngOnInit(): void { - // 给window绑定事件 + // 给window绑定事件 // 收到来自子内容的事件 window.addEventListener('message', this.receiveMessage.bind(this), false); } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.spec.ts index e4d1cd4e29745f2c11806815eaba16092f9b9530..2a7a2cdab16bcd1105f31f72a405e3f16c41f0d7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { LoadingComponent } from './loading.component'; describe('LoadingComponent', () => { - let component: LoadingComponent; - let fixture: ComponentFixture; + let component: LoadingComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ LoadingComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoadingComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(LoadingComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(LoadingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.ts index 2ece2169ab5081478c2f164b9d221a1f1863e8f6..fffe4543ec5290dc9c173b26327ce7f51a8521c7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/common/loading/loading.component.ts @@ -1,20 +1,21 @@ +/* eslint-disable no-return-assign */ import { Component, OnInit } from '@angular/core'; import { LoadingService } from '../../service/loading.service'; @Component({ - selector: 'app-loading', - templateUrl: './loading.component.html', - styleUrls: ['./loading.component.css'] + selector: 'app-loading', + templateUrl: './loading.component.html', + styleUrls: ['./loading.component.css'] }) export class LoadingComponent implements OnInit { - loading = false; + loading = false; - constructor(private loadingService: LoadingService) { } + constructor(private loadingService: LoadingService) { } - ngOnInit(): void { - this.loadingService.busy.subscribe((busy) => { - return this.loading = busy - }); - } + ngOnInit(): void { + this.loadingService.busy.subscribe((busy) => { + return this.loading = busy; + }); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.spec.ts index 5fb761d440d209d4882463a684abc5bead87a5eb..d0a6e7c9877dfaf3f1d10b5aeb25df994ae1db09 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BaseComponent } from './base.component'; describe('BaseComponent', () => { - let component: BaseComponent; - let fixture: ComponentFixture; + let component: BaseComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BaseComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BaseComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(BaseComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(BaseComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.ts index b2736c5a3c4524bbcf90406f6f56da6ef648e234..8cc94a107d0dee043adf653b759cb6ab49e052d8 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/base/base.component.ts @@ -1,30 +1,32 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; @Component({ - selector: 'app-base', - templateUrl: './base.component.html', - styleUrls: ['./base.component.css'] + selector: 'app-base', + templateUrl: './base.component.html', + styleUrls: ['./base.component.css'] }) export class BaseComponent implements OnInit { - //@Input() variableType:string; - // 值 - @Input() value: any; - // 只读 - @Input() readonly = false; - // 事件 - @Output() valueChange:EventEmitter = new EventEmitter(); + // 值 + @Input() value: any; + // 只读 + @Input() readonly = false; - constructor(){ + // 事件 + @Output() valueChange: EventEmitter = new EventEmitter(); - } - ngOnInit(){ + constructor(){ - } - /** + } + + ngOnInit(){ + + } + + /** * 值改变 */ - valueChangeHandler(val:string){ - this.valueChange.emit(val); - } + valueChangeHandler(val: string){ + this.valueChange.emit(val); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.spec.ts index 4da9f0b5dac32982b849f05add4768a3f1285c25..0bca564671bec6203106732e9fadeb730f278015 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ColorComponent } from './color.component'; describe('ColorComponent', () => { - let component: ColorComponent; - let fixture: ComponentFixture; + let component: ColorComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ColorComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ColorComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ColorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ColorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.ts index 3f647299f8e5b6dad76a9a24e82033063aea6f40..c6f2055bb4cf8f288480ba2f2b52c21fa026568f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/color/color.component.ts @@ -1,22 +1,26 @@ +/* eslint-disable max-len */ import { Component, OnInit } from '@angular/core'; import {BaseComponent} from '../base/base.component'; + @Component({ - selector: 'app-color', - templateUrl: './color.component.html', - styleUrls: ['./color.component.css'] + selector: 'app-color', + templateUrl: './color.component.html', + styleUrls: ['./color.component.css'] }) export class ColorComponent extends BaseComponent implements OnInit { - presets=['#F44336','#E91E63','#9C27B0','#673AB7','#3f51b5','#2196f3','#03a9f4','#00bcd4','#009688','#4caf50','#8bc34a','#cddc39','#ffeb3b','#ffc107','#ff9800','#ff5722 ','#9e9e9e']; - constructor() { - super(); - } + presets=['#F44336','#E91E63','#9C27B0','#673AB7','#3f51b5','#2196f3','#03a9f4','#00bcd4','#009688','#4caf50','#8bc34a','#cddc39','#ffeb3b','#ffc107','#ff9800','#ff5722 ','#9e9e9e']; + + constructor() { + super(); + } + + ngOnInit() { + } - ngOnInit() { - } - /** + /** * 值改变 */ - valueChangeHandler(val:string){ - this.valueChange.emit(val.toLocaleLowerCase()); - } + valueChangeHandler(val: string){ + this.valueChange.emit(val.toLocaleLowerCase()); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.spec.ts index 93e48c279f5a2204a1babb9b9225d88eb4232428..1cbce84d1afb6feb10978468d4e6d95e364d3b5e 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { EditorComponent } from './editor.component'; describe('EditorComponent', () => { - let component: EditorComponent; - let fixture: ComponentFixture; + let component: EditorComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ EditorComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditorComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(EditorComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(EditorComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.ts index c1841c159673cb4bc7b87613f297b453ceb48689..41b2967e3e78ab2984434170ff0daaf91386e066 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/editor/editor.component.ts @@ -3,34 +3,39 @@ import { MetaItem } from '../../models/meta-item'; import { MetadataService } from '../../service/metadata.service'; import { SafeHtml } from '@angular/platform-browser'; import { SearchNameService } from '../../service/search-name.service'; + @Component({ - selector: 'app-editor', - templateUrl: './editor.component.html', - styleUrls: ['./editor.component.css'] + selector: 'app-editor', + templateUrl: './editor.component.html', + styleUrls: ['./editor.component.css'] }) export class EditorComponent { - @HostBinding('class.tool-editor') cls=true; - @Input('item') item: MetaItem; - /* 标记变量变更类型,如果是:快速配置 'rapidSettings', 普通配置 '' + @HostBinding('class.tool-editor') cls=true; + + @Input('item') item: MetaItem; + + /* 标记变量变更类型,如果是:快速配置 'rapidSettings', 普通配置 '' * 快速配置有特殊的颜色关系,需要在服务器端进行特殊处理,所以此处有差异 */ - @Input('variableType') variableType=''; - // 查询 - @Input() searchText = ''; + @Input('variableType') variableType=''; + + // 查询 + @Input() searchText = ''; + + constructor(private names: SearchNameService, + private metaRepository: MetadataService) { } - constructor(private names: SearchNameService, - private metaRepository: MetadataService) { } + highlight(text: string): SafeHtml { + return this.names.getHighlightedForLeftMenuName(text, this.searchText); + } - highlight(text: string): SafeHtml { - return this.names.getHighlightedForLeftMenuName(text, this.searchText); - } - /** + /** * 变量修改后是否符合条件要加校验 - * @param e - * @param key + * @param e + * @param key */ - valueChanged(e: any, key: string): void { - console.log("属性:"+key+"修改后值:"+e); - this.metaRepository.updateSingleVariable({changeValue:e,controlKey:key,variableType:this.variableType}); - } + valueChanged(e: any, key: string): void { + console.log("属性:"+key+"修改后值:"+e); + this.metaRepository.updateSingleVariable({changeValue:e,controlKey:key,variableType:this.variableType}); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.spec.ts index b1cd6f84bc63ac69f05d14746f1b12a2a4facc7f..e429260803e78e51a0cbaa9660894286530399a0 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SelectComponent } from './select.component'; describe('SelectComponent', () => { - let component: SelectComponent; - let fixture: ComponentFixture; + let component: SelectComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SelectComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SelectComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SelectComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SelectComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.ts index 6b595c85f781cc57e889e70987c789c547ee8de5..e2b4ad7f7c80d33a400adafa41311bbcf8fe01fd 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/select/select.component.ts @@ -3,17 +3,18 @@ import { BaseComponent } from '../base/base.component'; import { MetaItem } from 'src/app/models/meta-item'; @Component({ - selector: 'app-select', - templateUrl: './select.component.html', - styleUrls: ['./select.component.css'] + selector: 'app-select', + templateUrl: './select.component.html', + styleUrls: ['./select.component.css'] }) export class SelectComponent extends BaseComponent implements OnInit { - // 数据 - @Input() items:MetaItem[]; - constructor() { - super(); - } + // 数据 + @Input() items: MetaItem[]; - ngOnInit() { - } + constructor() { + super(); + } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.spec.ts index 73ace3102c6fe03da913d4765ef8d5b890bf6dfa..38ed4dfc553bb48c8ddbfc3d04c105d0dd1e6d79 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SwitchComponent } from './switch.component'; describe('SwitchComponent', () => { - let component: SwitchComponent; - let fixture: ComponentFixture; + let component: SwitchComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SwitchComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SwitchComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SwitchComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SwitchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.ts index c38545aaa531109e24fd5182362feea25da6659d..d93ea7c1d98f7d98b5d794bd0a76f10bd27605e8 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/switch/switch.component.ts @@ -2,17 +2,17 @@ import { Component, OnInit } from '@angular/core'; import { BaseComponent } from '../base/base.component'; @Component({ - selector: 'app-switch', - templateUrl: './switch.component.html', - styleUrls: ['./switch.component.css'] + selector: 'app-switch', + templateUrl: './switch.component.html', + styleUrls: ['./switch.component.css'] }) export class SwitchComponent extends BaseComponent implements OnInit { - constructor() { - super(); - } + constructor() { + super(); + } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.spec.ts index d91002a0ff59229d636ea4e1bb4482674e725183..5952d36f7d9697d6233d7e2d224c88b74d02446d 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TextComponent } from './text.component'; describe('TextComponent', () => { - let component: TextComponent; - let fixture: ComponentFixture; + let component: TextComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ TextComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TextComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(TextComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(TextComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.ts index 82c9089977fc6fb647a2da74d4a446f1d48c38b1..7eedb4d737d772acfa30d507329b71303f1639b4 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/editor/text/text.component.ts @@ -3,26 +3,29 @@ import { ControlValueAccessor } from '@angular/forms'; import { BaseComponent } from '../base/base.component'; @Component({ - selector: 'app-text', - templateUrl: './text.component.html', - styleUrls: ['./text.component.css'] + selector: 'app-text', + templateUrl: './text.component.html', + styleUrls: ['./text.component.css'] }) -export class TextComponent extends BaseComponent implements OnInit, ControlValueAccessor { +export class TextComponent extends BaseComponent implements OnInit, ControlValueAccessor { public value = 0; + public disable = false; onChange: any = () => { }; - onTouch: any = () => { }; + onTouch: any = () => { }; writeValue(obj: any): void { this.value = obj; } + registerOnChange(fn: any): void { this.onChange = fn; } + registerOnTouched(fn: any): void { this.onTouch = fn; - } -} \ No newline at end of file + } +} diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/ng-transclude.directive.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/ng-transclude.directive.ts index d890724776ba35678fc3f8c00953239321318417..1e4d689e66ad26a49722f40308b5c083b44c734a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/ng-transclude.directive.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/ng-transclude.directive.ts @@ -1,33 +1,28 @@ import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core'; @Directive({ - // tslint:disable-next-line:directive-selector - selector: '[ngTransclude]' + selector: '[ngTransclude]' }) export class NgTranscludeDirective { - viewRef: ViewContainerRef; + viewRef: ViewContainerRef; - // tslint:disable-next-line:variable-name - protected _viewRef: ViewContainerRef; - /* tslint:disable-next-line:no-any */ - // tslint:disable-next-line:variable-name - protected _ngTransclude: TemplateRef; + protected _viewRef: ViewContainerRef; - @Input() - /* tslint:disable-next-line:no-any */ - set ngTransclude(templateRef: TemplateRef) { - this._ngTransclude = templateRef; - if (templateRef) { - this.viewRef.createEmbeddedView(templateRef); + protected _ngTransclude: TemplateRef; + + @Input() + set ngTransclude(templateRef: TemplateRef) { + this._ngTransclude = templateRef; + if (templateRef) { + this.viewRef.createEmbeddedView(templateRef); + } } - } - /* tslint:disable-next-line:no-any */ - get ngTransclude(): TemplateRef { - return this._ngTransclude; - } + get ngTransclude(): TemplateRef { + return this._ngTransclude; + } - constructor(viewRef: ViewContainerRef) { - this.viewRef = viewRef; - } + constructor(viewRef: ViewContainerRef) { + this.viewRef = viewRef; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab-heading.directive.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab-heading.directive.ts index e61c6ffe4107f3b1dd4d954d153cdf81fb675f37..d7938870f5a4caabbd6b528f1a38c63bb3700221 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab-heading.directive.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab-heading.directive.ts @@ -6,11 +6,11 @@ import { TabDirective } from './tab.directive'; // tslint:disable-next-line:directive-selector @Directive({ selector: '[tabHeading]' }) export class TabHeadingDirective { - /* tslint:disable-next-line:no-any */ - templateRef: TemplateRef; + /* tslint:disable-next-line:no-any */ + templateRef: TemplateRef; - /* tslint:disable-next-line:no-any */ - constructor(templateRef: TemplateRef, tab: TabDirective) { - tab.headingRef = templateRef; - } + /* tslint:disable-next-line:no-any */ + constructor(templateRef: TemplateRef, tab: TabDirective) { + tab.headingRef = templateRef; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab.directive.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab.directive.ts index b1afca5909c0c17487ec23c7955430751a55d764..b5b392923f53ab6b3c621294546efd4dffef63f5 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab.directive.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tab.directive.ts @@ -1,3 +1,5 @@ +/* eslint-disable no-self-assign */ +/* eslint-disable no-use-before-define */ import { Directive, EventEmitter, @@ -13,28 +15,37 @@ import { import { TabsetComponent } from './tabset.component'; @Directive({ - // tslint:disable-next-line:directive-selector selector: 'tab, [tab]' }) export class TabDirective implements OnInit, OnDestroy { /** tab header text */ @Input() heading: string; + /** tab id. The same id with suffix '-link' will be added to the corresponding <li> element */ @HostBinding('attr.id') @Input() id: string; + @Input() appId: string; + @Input() appEntrance: string; + @Input() funcId: string; + /** 当前tab打开的类型:菜单menu 应用app */ @Input() appType: string; + /** mode: spa or mdi */ @Input() appMode: string; + /** if true tab can not be activated */ @Input() disabled: boolean; + /** if true tab can be removable, additional button will appear */ @Input() removable: boolean; + /** if set, will be added to the tab's class attribute. Multiple classes are supported. */ @Input() visible: boolean; + // @Input() isjquery: boolean; /** if set, will be added to the tab's class attribute. Multiple classes are supported. */ @Input() @@ -91,7 +102,7 @@ export class TabDirective implements OnInit, OnDestroy { } this._active = active; - if (!!active) { + if (active) { this.activate.emit(this); } // this.select.emit(this); @@ -118,11 +129,15 @@ export class TabDirective implements OnInit, OnDestroy { /* tslint:disable-next-line:no-any */ headingRef: TemplateRef; + tabset: TabsetComponent; + // tslint:disable-next-line:variable-name protected _active = false; + // tslint:disable-next-line: variable-name protected _isjquery = false; + // tslint:disable-next-line:variable-name protected _customClass: string; diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabs.module.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabs.module.ts index e55fe1e9672cc71b3042d139db46f35c4a41fb95..e7218dcd1f8270156f5141c5f4d930f529b67e54 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabs.module.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabs.module.ts @@ -7,25 +7,25 @@ import { TabsetComponent } from './tabset.component'; import { TabsetConfig } from './tabset.config'; @NgModule({ - imports: [CommonModule], - declarations: [ - NgTranscludeDirective, - TabDirective, - TabsetComponent, - TabHeadingDirective - ], - exports: [ - TabDirective, - TabsetComponent, - TabHeadingDirective, - NgTranscludeDirective - ] + imports: [CommonModule], + declarations: [ + NgTranscludeDirective, + TabDirective, + TabsetComponent, + TabHeadingDirective + ], + exports: [ + TabDirective, + TabsetComponent, + TabHeadingDirective, + NgTranscludeDirective + ] }) export class FrameworkTabsModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: FrameworkTabsModule, - providers: [TabsetConfig] - }; - } + static forRoot(): ModuleWithProviders { + return { + ngModule: FrameworkTabsModule, + providers: [TabsetConfig] + }; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.component.ts index 3634d840bc23f56677704c6aa4d2ce58cede1c36..227e6bae69facd95df00392ad5d4eee85bbe6cec 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.component.ts @@ -6,12 +6,8 @@ import { import { TabDirective } from './tab.directive'; import { TabsetConfig } from './tabset.config'; -// import { FrameworkEventService, FrameworkService, AppService, FuncEventArgs } from '@gsp-sys/rtf-common'; -import { Router, NavigationStart } from '@angular/router'; -// todo: add active event to tab -// todo: fix? mixing static and dynamic tabs position tabs in order of creation +import { Router } from '@angular/router'; -// tslint:disable @Component({ selector: 'tabset', templateUrl: './tabset.component.html', @@ -20,43 +16,47 @@ import { Router, NavigationStart } from '@angular/router'; export class TabsetComponent implements OnDestroy { @HostBinding('class.gw-container-tabset') cls = true; + @HostBinding('class.tab-container') clazz = true; @ViewChild('dhsvg') dhsvg: ElementRef; + showAllNav = false; + showAllNavBtn = false; - /** if true tabs will be placed vertically */ + @Input() get vertical(): boolean { return this._vertical; } + set vertical(value: boolean) { this._vertical = value; this.setClassMap(); } - /** if true tabs fill the container and have a consistent width */ @Input() get justified(): boolean { return this._justified; } + set justified(value: boolean) { this._justified = value; this.setClassMap(); } - /** navigation context class: 'tabs' or 'pills' */ @Input() get type(): string { return this._type; } + set type(value: string) { this._type = value; this.setClassMap(); } @Output() - closeAllTabs: EventEmitter = new EventEmitter(); + closeAllTabs: EventEmitter = new EventEmitter(); tabs: TabDirective[] = []; @@ -64,7 +64,7 @@ export class TabsetComponent implements OnDestroy { protected isDestroyed: boolean; - private pageCanClosed: boolean = true; + private pageCanClosed = true; protected _vertical: boolean; @@ -75,9 +75,6 @@ export class TabsetComponent implements OnDestroy { constructor( config: TabsetConfig, private ngZone: NgZone, - // private frmEvent: FrameworkEventService, - // private frmSvc: FrameworkService, - // private appSvc: AppService, private renderer: Renderer2, private elementRef: ElementRef, private route: Router @@ -89,6 +86,7 @@ export class TabsetComponent implements OnDestroy { ngOnDestroy(): void { this.isDestroyed = true; } + /** * 添加标签页 */ @@ -100,7 +98,6 @@ export class TabsetComponent implements OnDestroy { } else { this.tabs.push(tab); } - // tab.active = this.tabs.length === 1 && typeof tab.active === 'undefined'; if (this.elementRef != null && this.elementRef.nativeElement !== null) { if ( document.getElementById('iframetab').scrollWidth > @@ -128,7 +125,6 @@ export class TabsetComponent implements OnDestroy { if (index === -1 || this.isDestroyed) { return; } - // Select a new tab if the tab to be removed is selected and not destroyed if (options.reselect && tab.active && this.hasAvailableTabs(index)) { const newActiveIndex = this.getClosestTabIndex(index); this.tabs[newActiveIndex].active = true; @@ -180,7 +176,7 @@ export class TabsetComponent implements OnDestroy { appType: tab.appType }; - //this.frmSvc.beforeCloseMenu(opts); + // this.frmSvc.beforeCloseMenu(opts); } /** @@ -262,8 +258,6 @@ export class TabsetComponent implements OnDestroy { // 导航滚动定位 document.querySelector('#' + 'tabKey' + section).scrollIntoView(); tabItem.active = true; - // 收起 - // this.showAllNav = false; } public closeAllnavPanel(ev: Event) { @@ -272,58 +266,10 @@ export class TabsetComponent implements OnDestroy { } /** - * 绑定事件 + * 绑定事件 */ private eventBingding() { - // this.frmEvent.eventListner(this.frmEvent.FuncClosed, (arg: FuncEventArgs) => { - // if (arg) { - // this.tabs.forEach(item => { - // this.ngZone.run(() => { - // if (arg.tabId === item.id) { - // this.removeTab(item); - // } - // }); - // }); - // } - // }); - - // this.route.events.subscribe( - // event => { - // if (event instanceof NavigationStart) { - // this.pageCanClosed = false; - // } else { - // this.pageCanClosed = true; - // } - // } - // ); - - // this.ngZone.runOutsideAngular(() => { - // window.document.addEventListener('mousedown', (event) => { - // if ((event.target as HTMLElement).localName === 'svg' || (event.target as HTMLElement).localName === 'rect' || (event.target as HTMLElement).localName === 'animate') { - // this.showAllNav = false; - // } else { - // this.changeState(event); - // } - // }); - // }); } - // private changeState(event) { - // if (!( - // (event.target as HTMLElement).className.indexOf('list-group-items') >= 0 - // || - // (event.target as HTMLElement).className.indexOf('all-nav-container') >= 0 - // || - // (event.target as HTMLElement).className.indexOf('apphomeoricolor') >= 0 - // || - // (event.target as HTMLElement).className.indexOf('down-arrow') >= 0 - // || - // (event.target as HTMLElement).className.indexOf('noimghover') >= 0 - // || - // (event.target as HTMLElement).className.indexOf('spanlib') >= 0 - // )) { - // this.showAllNav = false; - // } - // } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.config.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.config.ts index b03f8e7bf835885f03cc62f1f9a42103f2af109b..b09a724c894f7d2e71bc7930384b72a17d9db276 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.config.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework-tabs/tabset.config.ts @@ -2,6 +2,5 @@ import { Injectable } from '@angular/core'; @Injectable() export class TabsetConfig { - /** provides default navigation context class: 'tabs' or 'pills' */ - type = 'tabs'; + type = 'tabs'; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-container.module.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-container.module.ts index ff2b97494d8604ad7e1ee92e5b0dd95459b02c9d..163c6f6658c918512275f6297ff1deb3940ad110 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-container.module.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-container.module.ts @@ -3,10 +3,10 @@ import { CommonModule } from '@angular/common'; import { FrameworkHeaderComponent } from './framework-header/framework-header.component'; @NgModule({ - declarations: [FrameworkHeaderComponent], - imports: [ - CommonModule - ], - exports:[FrameworkHeaderComponent] + declarations: [FrameworkHeaderComponent], + imports: [ + CommonModule + ], + exports:[FrameworkHeaderComponent] }) export class FrameworkContainerModule { } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.spec.ts index a3c2278fb19e0e51a7bf827cfcc55e3eb0471f15..f2a10eb066e1d394b4fd17399934ef977a6fdba8 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { FrameworkHeaderComponent } from './framework-header.component'; describe('FrameworkHeaderComponent', () => { - let component: FrameworkHeaderComponent; - let fixture: ComponentFixture; + let component: FrameworkHeaderComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ FrameworkHeaderComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FrameworkHeaderComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(FrameworkHeaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(FrameworkHeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.ts index ac3c4b6e35b79c323b85d103cde9d483443ebad1..8e2c9d6b28c0d97a10d9dc69bbf5ec012fbeea76 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/framework/framework-header/framework-header.component.ts @@ -1,15 +1,15 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-framework-header', - templateUrl: './framework-header.component.html', - styleUrls: ['./framework-header.component.css'] + selector: 'app-framework-header', + templateUrl: './framework-header.component.html', + styleUrls: ['./framework-header.component.css'] }) export class FrameworkHeaderComponent implements OnInit { - constructor() { } + constructor() { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.spec.ts index 8334db55826fcad7fa552c004993e33ffedc65e3..f2b7bf6703fb04b09fc9ebcaa4e6b347697ba6df 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { AdvanceSettingsComponent } from './advance-settings.component'; describe('AdvanceSettingsComponent', () => { - let component: AdvanceSettingsComponent; - let fixture: ComponentFixture; + let component: AdvanceSettingsComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdvanceSettingsComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdvanceSettingsComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(AdvanceSettingsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(AdvanceSettingsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.ts index 2dabb9158babb11a695212eccb1111b1171765ad..24d75f0cffdf46e63d2b882d42450c2d8ba5fb8a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/advance-settings/advance-settings.component.ts @@ -1,15 +1,15 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-advance-settings', - templateUrl: './advance-settings.component.html', - styleUrls: ['./advance-settings.component.css'] + selector: 'app-advance-settings', + templateUrl: './advance-settings.component.html', + styleUrls: ['./advance-settings.component.css'] }) export class AdvanceSettingsComponent implements OnInit { - constructor() { } + constructor() { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.aliases.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.aliases.ts index 6bcec785e45d5d9544b10320bd8c597ed060f6ac..816b045f09f8124f0d5ae439c69ac85e42173a72 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.aliases.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.aliases.ts @@ -1,3 +1,6 @@ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ +/* eslint-disable max-len */ import { MenuItem } from '../../models/left-menu-item'; import { MetaItem } from "../../models/meta-item"; @@ -23,39 +26,8 @@ export class SettingsAlias { code: 'theme-color', equivalents: '', isFold: true, - regs: { farris: [/f-theme-03/i,/f-text-02/i,/f-semantic-info-01/i,/f-semantic-submit-01/i,/f-semantic-success-01/i,/f-semantic-warning-01/i,/f-semantic-danger-01/i] } + regs: { farris: [/f-theme-03/i, /f-text-02/i, /f-semantic-info-01/i, /f-semantic-submit-01/i, /f-semantic-success-01/i, /f-semantic-warning-01/i, /f-semantic-danger-01/i] } }, - // { - // name: '辅助色', - // code: 'aid-color', - // isFold: true, - // equivalents: '', - // regs: [/f-aid-/i] - // }, { - // name: '点缀色', - // code: 'ornament-color', - // equivalents: '', - // isFold: true, - // regs: [/f-ornament-/i] - // }, { - // name: '中性色', - // code: 'neutral-color', - // equivalents: '', - // isFold: true, - // regs: [/f-neutral-/i] - // }, { - // name: '文字色', - // code: 'text-color', - // equivalents: '', - // isFold: true, - // regs: [/f-text-/i] - // }, { - // name: '语义色', - // code: 'semantic-color', - // equivalents: '', - // isFold: true, - // regs: [/f-semantic-/i] - // } ] } ]; @@ -63,21 +35,25 @@ export class SettingsAlias { static getRapidSettings(): MenuItem[] { return this.rapidSettings; } + /** - * - * @param dataAlias - * @param metadata + * + * @param dataAlias + * @param metadata */ - static formatSettings(dataAlias, metadata, sortService):MenuItem[] { - let menuData = [].concat(dataAlias); - + static formatSettings(dataAlias, metadata, sortService): MenuItem[] { + const menuData = [].concat(dataAlias); + const getMatchedItems = (themeName: string, regex: RegExp): MetaItem[] => { + // 所有变量里,存在Name并且key符合规则 + return metadata[themeName].filter((value) => value.Name && regex.test(value.Key)); + }; const fillItems = (menuItem: MenuItem): void => { // 进入之前 {"name":"Basic Settings","regs":[{规则},{},{}],"route":"base.common"} if (menuItem.regs) { menuItem.items = []; - for (let themeKey in menuItem.regs) { + for (const themeKey in menuItem.regs) { menuItem.regs[themeKey].forEach((regex) => { - Array.prototype.push.apply(menuItem.items, getMatchedItems(themeKey,regex)); + Array.prototype.push.apply(menuItem.items, getMatchedItems(themeKey, regex)); }); } // 数据再处理 @@ -91,10 +67,6 @@ export class SettingsAlias { menuItem.items.sort((item1, item2) => sortService.sortNames(item1.Name, item2.Name)); } }; - const getMatchedItems = (themeName:string,regex: RegExp): MetaItem[] => { - // 所有变量里,存在Name并且key符合规则 - return metadata[themeName].filter((value) => value.Name && regex.test(value.Key)); - }; menuData.forEach((item) => { // 填充menuData项的Items diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.spec.ts index c095b7d225d7146ff3f80c6ea28eca27c833e47e..337f3ea73016bfd0f3b4929cb0b07f5d6304952a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { RapidSettingsComponent } from './rapid-settings.component'; describe('RapidSettingsComponent', () => { - let component: RapidSettingsComponent; - let fixture: ComponentFixture; + let component: RapidSettingsComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ RapidSettingsComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RapidSettingsComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(RapidSettingsComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(RapidSettingsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.ts index 1f7f7c019cd0927d6ce49897de1d274f24fcb1d0..2e445676a54bf8346471b61afe5d4f1605d69eae 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/rapid-settings/rapid-settings.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-debugger */ import { Component, OnInit, OnDestroy, Output, EventEmitter } from "@angular/core"; import { Subscription } from "rxjs"; import { Router } from "@angular/router"; @@ -9,144 +10,155 @@ import { ThemeRouteChangeService } from "../../service/theme-route-change.servic import { MenuItem } from 'src/app/models/left-menu-item'; @Component({ - selector: "app-rapid-settings", - templateUrl: "./rapid-settings.component.html", - styleUrls: ["./rapid-settings.component.css"] + selector: "app-rapid-settings", + templateUrl: "./rapid-settings.component.html", + styleUrls: ["./rapid-settings.component.css"] }) export class RapidSettingsComponent implements OnInit, OnDestroy { - value="rgba(255,0,0,0.5)"; - subscription: Subscription; - // 变量数据 - editorsData: MenuItem[]; - themeSettings = null; - // 颜色 - themeColor: string; - // 大小 - themeSize: string; - // 清空css事件 - @Output() clearCSSEvent = new EventEmitter(); - constructor( - private metadataService: MetadataService, - private nameSer: SearchNameService, - private router: Router, - private themeRouteSer: ThemeRouteChangeService - ) { + value = "rgba(255,0,0,0.5)"; + + subscription: Subscription; + + // 变量数据 + editorsData: MenuItem[]; + + themeSettings = null; + + // 颜色 + themeColor: string; + + // 大小 + themeSize: string; + + // 清空css事件 + @Output() clearCSSEvent = new EventEmitter(); + + constructor( + private metadataService: MetadataService, + private nameSer: SearchNameService, + private router: Router, + private themeRouteSer: ThemeRouteChangeService + ) { // 主题大小 - this.themeSize = this.themeRouteSer.getThemeSize(); - // 默认主题颜色 - this.themeColor = this.themeRouteSer.getThemeColor(); - // 获取主题配置 - this.themeSettings = this.themeRouteSer.getThemSettings(); - // 关联菜单数据 - this.nameSer.getFilterDatas().subscribe((datas: MenuItem[]) => { - this.editorsData = [...datas]; - }); - } + this.themeSize = this.themeRouteSer.getThemeSize(); + // 默认主题颜色 + this.themeColor = this.themeRouteSer.getThemeColor(); + // 获取主题配置 + this.themeSettings = this.themeRouteSer.getThemSettings(); + // 关联菜单数据 + this.nameSer.getFilterDatas().subscribe((datas: MenuItem[]) => { + this.editorsData = [...datas]; + }); + } - updateData(): void { + updateData(): void { // 获取基础变量的定义 - let presetRapidSettings = SettingsAlias.getRapidSettings(); - // 查找配置,构造需要几个主题的基础变量 - let needThemes = ['farris']; - // 整理主题类型 - presetRapidSettings.forEach(item => { - let equThemes = item.equivalents.split(','); - equThemes.forEach(themeItem => { - if (needThemes.findIndex(needThemeItem => themeItem == needThemeItem) < 0) { - needThemes.push(themeItem); - } - }); - }); + const presetRapidSettings = SettingsAlias.getRapidSettings(); + // 查找配置,构造需要几个主题的基础变量 + const needThemes = ['farris']; + // 整理主题类型 + presetRapidSettings.forEach(item => { + const equThemes = item.equivalents.split(','); + equThemes.forEach(themeItem => { + if (needThemes.findIndex(needThemeItem => themeItem === needThemeItem) < 0) { + needThemes.push(themeItem); + } + }); + }); - // 获取基础变量 - this.metadataService.getBaseParameters(needThemes.join(',')).then((commonParameters) => { - //赋值 形如,[{"Key":"$base-accent","Name":"10. Accent color","Type":"color","Value":"[object Object]"} , ...] - // baseParameters.forEach(item => { - // // 目前出现赋值不对的问题,先临时补偿一下 - // if (item.Type == 'color' && item.Value == "[object Object]") { - // item.Value = "rgba(0,0,0,0.25)"; - // } - // }); - debugger; - console.log('基础变量'); - // let tParameters = [ - // { - // "Key": "$f-theme-01", - // "Name": "10. 収折颜色", - // "Type": "color", - // "Value": "rgba(0,0,0,0.25)" - // }, - // { - // "Key": "$f-aid-01", - // "Name": "20. 辅助色", - // "Type": "color", - // "Value": "rgba(0,0,0,0.25)" - // }, - // { - // "Key": "$f-ornament-01", - // "Name": "30. 点缀色", - // "Type": "color", - // "Value": "rgba(0,0,0,0.25)" - // }, - // { - // "Key": "$f-neutral-01", - // "Name": "40. 中性色", - // "Type": "color", - // "Value": "rgba(0,0,0,0.25)" - // } - // ]; - // let datas = SettingsAlias.formatSettings(SettingsAlias.getRapidSettings(), tParameters, this.nameSer); - let datas = SettingsAlias.formatSettings(presetRapidSettings, commonParameters, this.nameSer); - // 更新nav数据 - this.nameSer.updateNavDatas(datas); - // 赋初始值 - this.editorsData = [...datas]; - }); - } + // 获取基础变量 + this.metadataService.getBaseParameters(needThemes.join(',')).then((commonParameters) => { + // 赋值 形如,[{"Key":"$base-accent","Name":"10. Accent color","Type":"color","Value":"[object Object]"} , ...] + // baseParameters.forEach(item => { + // // 目前出现赋值不对的问题,先临时补偿一下 + // if (item.Type == 'color' && item.Value == "[object Object]") { + // item.Value = "rgba(0,0,0,0.25)"; + // } + // }); + debugger; + console.log('基础变量'); + // let tParameters = [ + // { + // "Key": "$f-theme-01", + // "Name": "10. 収折颜色", + // "Type": "color", + // "Value": "rgba(0,0,0,0.25)" + // }, + // { + // "Key": "$f-aid-01", + // "Name": "20. 辅助色", + // "Type": "color", + // "Value": "rgba(0,0,0,0.25)" + // }, + // { + // "Key": "$f-ornament-01", + // "Name": "30. 点缀色", + // "Type": "color", + // "Value": "rgba(0,0,0,0.25)" + // }, + // { + // "Key": "$f-neutral-01", + // "Name": "40. 中性色", + // "Type": "color", + // "Value": "rgba(0,0,0,0.25)" + // } + // ]; + // let datas = SettingsAlias.formatSettings(SettingsAlias.getRapidSettings(), tParameters, this.nameSer); + const datas = SettingsAlias.formatSettings(presetRapidSettings, commonParameters, this.nameSer); + // 更新nav数据 + this.nameSer.updateNavDatas(datas); + // 赋初始值 + this.editorsData = [...datas]; + }); + } - ngOnInit() { - this.updateData(); - /** - * css 每次变更获取最新的变量 - */ - this.subscription = this.metadataService.css.subscribe(({ css, theme }) => { - this.updateData(); - }); - } - ngOnDestroy(): void { - this.subscription.unsubscribe(); - } - /** - * 修改主题颜色 - */ - changeThemeColor(type: string) { - if(this.themeColor !=type){ - this.themeColor = type; - this.clearCSSEvent.emit(); - this.themeRouteSer.updateThemeColor(type); + ngOnInit() { + this.updateData(); + /** + * css 每次变更获取最新的变量 + */ + this.subscription = this.metadataService.css.subscribe(({ css, theme }) => { + this.updateData(); + }); } - } - /** - * 修改主题大小 + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } + + /** + * 修改主题颜色 */ - changeThemeSize(type: string) { - if (this.themeSize != type) { - this.themeSize = type; - this.clearCSSEvent.emit(); - this.themeRouteSer.updateThemeSize(type); + changeThemeColor(type: string) { + if (this.themeColor !== type) { + this.themeColor = type; + this.clearCSSEvent.emit(); + this.themeRouteSer.updateThemeColor(type); + } + } + + /** +* 修改主题大小 +*/ + changeThemeSize(type: string) { + if (this.themeSize !== type) { + this.themeSize = type; + this.clearCSSEvent.emit(); + this.themeRouteSer.updateThemeSize(type); + } } - } - /** - * 判断収折 - * @param groupInfoIndex - * @param groupIndex - */ - foldOrExpandGroup(groupInfoIndex, groupIndex) { - let groupInfos = this.editorsData[groupInfoIndex] - let currentGroup = groupInfos['groups'][groupIndex]; - if (currentGroup.items.length <= 3) { - return false; + + /** + * 判断収折 + * @param groupInfoIndex + * @param groupIndex + */ + foldOrExpandGroup(groupInfoIndex, groupIndex) { + const groupInfos = this.editorsData[groupInfoIndex]; + const currentGroup = groupInfos.groups[groupIndex]; + if (currentGroup.items.length <= 3) { + return false; + } + currentGroup.isFold = !currentGroup.isFold; } - currentGroup.isFold = !currentGroup.isFold; - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.spec.ts index 43729199b31b8da38c23fd949837519cfb5e4a33..e52f4e8c0402a9f207f904bc3e64b5c77efd0411 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SearchComponent } from './search.component'; describe('SearchComponent', () => { - let component: SearchComponent; - let fixture: ComponentFixture; + let component: SearchComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SearchComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SearchComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SearchComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SearchComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.ts index 85c86e26ee1839a0066b5aceb162fde4896c194e..42930bde802114ab30c43b4c16bf9b178416f63f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/search/search.component.ts @@ -5,108 +5,116 @@ import {MenuItem} from "../../models/left-menu-item"; import { SearchNameService } from '../../service/search-name.service'; @Component({ - selector: "app-search-header", - templateUrl: "./search.component.html", - styleUrls: ["./search.component.css"] + selector: "app-search-header", + templateUrl: "./search.component.html", + styleUrls: ["./search.component.css"] }) export class SearchComponent implements OnInit { - @ViewChild("searchInput") searchInput: ElementRef; - @Input() variableName = "基础变量"; - // 菜单数据 - navDatas:MenuItem[]; - // 是否进入了查询 - inSearch = false; - // 查询文本 - searchText = ""; - // 过滤出来的数据 - filteredData:MenuItem[]=[]; - /** + @ViewChild("searchInput") searchInput: ElementRef; + + @Input() variableName = "基础变量"; + + // 菜单数据 + navDatas: MenuItem[]; + + // 是否进入了查询 + inSearch = false; + + // 查询文本 + searchText = ""; + + // 过滤出来的数据 + filteredData: MenuItem[]=[]; + + /** * 查询 */ - formGroup = new FormGroup({ - searchControl: new FormControl("") - }); - - constructor(private searchNameSer:SearchNameService) { - this.searchNameSer.getNavDatas().subscribe((datas:MenuItem[])=>{ - this.navDatas=[...datas] + formGroup = new FormGroup({ + searchControl: new FormControl("") }); - } - ngOnInit() { - this.formGroup.valueChanges.pipe(debounceTime(600)).subscribe(data => { - this.searchText = data.searchControl; - this.menuSearch(); - }); - } - /** + constructor(private searchNameSer: SearchNameService) { + this.searchNameSer.getNavDatas().subscribe((datas: MenuItem[])=>{ + this.navDatas=[...datas]; + }); + } + + ngOnInit() { + this.formGroup.valueChanges.pipe(debounceTime(600)).subscribe(data => { + this.searchText = data.searchControl; + this.menuSearch(); + }); + } + + /** * 查询状态变更 * @param e */ - changeSearchState(e: MouseEvent): void { - this.inSearch = !this.inSearch; - this.searchText = ""; - if (this.inSearch) { - // 确定在查询中,聚焦 - setTimeout(() => this.searchInput.nativeElement.focus(), 100); - } else { - this.menuSearch(); + changeSearchState(e: MouseEvent): void { + this.inSearch = !this.inSearch; + this.searchText = ""; + if (this.inSearch) { + // 确定在查询中,聚焦 + setTimeout(() => this.searchInput.nativeElement.focus(), 100); + } else { + this.menuSearch(); + } + + e.stopPropagation(); } - e.stopPropagation(); - } - /** + /** * 查询变量列表 */ - menuSearch(): void { - const keyword = this.searchNameSer.getRealName(this.searchText.toLowerCase()); + menuSearch(): void { + const keyword = this.searchNameSer.getRealName(this.searchText.toLowerCase()); - const addFilteredMenuItem = (item: MenuItem, itemsArray: MenuItem[]): void => { + const addFilteredMenuItem = (item: MenuItem, itemsArray: MenuItem[]): void => { // 当前项如果名称包含在其中,则取他的item构造结果 - if(item.name.toLowerCase().indexOf(keyword) >= 0) { - itemsArray.push(item); - return; - } + if(item.name.toLowerCase().indexOf(keyword) >= 0) { + itemsArray.push(item); + return; + } - if(!item.items) return; + if(!item.items) return; - const filteredItems = item.items.filter((metaItem) => { - const itemName = this.searchNameSer.getRealName(metaItem.Name).toLowerCase(); - return itemName.indexOf(keyword) >= 0; - }); + const filteredItems = item.items.filter((metaItem) => { + const itemName = this.searchNameSer.getRealName(metaItem.Name).toLowerCase(); + return itemName.indexOf(keyword) >= 0; + }); + + if(filteredItems.length) { + itemsArray.push({ name: item.name, items: filteredItems, route: item.route }); + } + }; - if(filteredItems.length) { - itemsArray.push({ name: item.name, items: filteredItems, route: item.route }); + if(!keyword.length) { + this.filteredData = []; + // this.filteredData[0] = this.workArea; + this.searchNameSer.updateFilterDatas(this.navDatas); + return; } - }; - if(!keyword.length) { this.filteredData = []; - // this.filteredData[0] = this.workArea; - this.searchNameSer.updateFilterDatas(this.navDatas); - return; - } - - this.filteredData = []; - // 归集数据后的所有的变量集合 [] - this.navDatas.forEach((navDataItem) => { + // 归集数据后的所有的变量集合 [] + this.navDatas.forEach((navDataItem) => { // 先构造items里面的数据 - addFilteredMenuItem(navDataItem, this.filteredData); + addFilteredMenuItem(navDataItem, this.filteredData); - if(navDataItem.groups) { + if(navDataItem.groups) { // 如果有分组再构造分组里的数据 - const filteredDataGroups: MenuItem[] = []; + const filteredDataGroups: MenuItem[] = []; - navDataItem.groups.forEach((group) => addFilteredMenuItem(group, filteredDataGroups)); + navDataItem.groups.forEach((group) => addFilteredMenuItem(group, filteredDataGroups)); - if(filteredDataGroups.length) { - const existingGroup = this.filteredData.filter((i) => i.name === navDataItem.name); - if(!existingGroup.length) { - this.filteredData.push({ name: navDataItem.name, groups: filteredDataGroups, route: navDataItem.route }); + if(filteredDataGroups.length) { + const existingGroup = this.filteredData.filter((i) => i.name === navDataItem.name); + if(!existingGroup.length) { + this.filteredData.push({ name: navDataItem.name, groups: filteredDataGroups, route: navDataItem.route }); + } } } - } - }); - this.searchNameSer.updateFilterDatas(this.filteredData); - } + }); + this.searchNameSer.updateFilterDatas(this.filteredData); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.spec.ts index eac2882bf20126272d7fcd8b4f7efd3c604fcd13..780ea25e459de2ce7245877384a4cd4f2d1fee6d 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SettingsHeaderComponent } from './settings-header.component'; describe('SettingsHeaderComponent', () => { - let component: SettingsHeaderComponent; - let fixture: ComponentFixture; + let component: SettingsHeaderComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SettingsHeaderComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SettingsHeaderComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SettingsHeaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SettingsHeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.ts index 2d03559145b28b025d1377e89ccd2ec2197f97a3..4ff8761bcf3a4cb40038eb0c09cabe7783db71b2 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/settings-header/settings-header.component.ts @@ -1,3 +1,8 @@ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable guard-for-in */ +/* eslint-disable eqeqeq */ +/* eslint-disable max-len */ +/* eslint-disable default-param-last */ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import fileSaver from 'file-saver'; import * as JSZip from 'jszip'; @@ -7,200 +12,214 @@ import { MetadataService } from '../../service/metadata.service'; import { ImportExportService } from '../../service/import-export.service'; @Component({ - selector: 'app-settings-header', - templateUrl: './settings-header.component.html', - styleUrls: ['./settings-header.component.css'] + selector: 'app-settings-header', + templateUrl: './settings-header.component.html', + styleUrls: ['./settings-header.component.css'] }) export class SettingsHeaderComponent implements OnInit { - // 标记当前的标签 - @Input() current = ''; - @Input() extendCSS = ''; - // 标记下载的内容是否准备好 - contentReady = true; - private downloadDP = false; - // 清空css事件 - @Output() clearCSSEvent = new EventEmitter(); - // 编译事件 - @Output() buildThemeEvent = new EventEmitter(); - constructor(private themeRouteChangeSer: ThemeRouteChangeService, private metadataService: MetadataService, private importExportSer: ImportExportService) { } - - ngOnInit() { - } - /** + // 标记当前的标签 + @Input() current = ''; + + @Input() extendCSS = ''; + + // 标记下载的内容是否准备好 + contentReady = true; + + private downloadDP = false; + + // 清空css事件 + @Output() clearCSSEvent = new EventEmitter(); + + // 编译事件 + @Output() buildThemeEvent = new EventEmitter(); + + constructor(private themeRouteChangeSer: ThemeRouteChangeService, private metadataService: MetadataService, private importExportSer: ImportExportService) { } + + ngOnInit() { + } + + /** * 获取不带后缀的名称 */ - getFileNameWithoutExt(themeName: string = '', nameSuffix): string { - let result = ''; - let suffix = nameSuffix ? '(' + nameSuffix + ')' : '' - switch (themeName) { - case 'framework': - result = `${themeName}.${this.themeRouteChangeSer.getThemeColor()}${suffix}`; - break; - - default: - result = `${this.themeRouteChangeSer.getThemeName()}.${this.themeRouteChangeSer.getThemeColor()}.${this.themeRouteChangeSer.getThemeSize()}${suffix}`; - break; + getFileNameWithoutExt(themeName = '', nameSuffix): string { + let result = ''; + const suffix = nameSuffix ? '(' + nameSuffix + ')' : ''; + switch (themeName) { + case 'framework': + result = `${themeName}.${this.themeRouteChangeSer.getThemeColor()}${suffix}`; + break; + + default: + result = `${this.themeRouteChangeSer.getThemeName()}.${this.themeRouteChangeSer.getThemeColor()}.${this.themeRouteChangeSer.getThemeSize()}${suffix}`; + break; + } + return result; } - return result; - } - /** + + /** * 下载下拉面板 - * @param ev + * @param ev */ - downloadDropdown(ev) { - ev.stopPropagation(); - this.downloadDP = !this.downloadDP; - } - /** + downloadDropdown(ev) { + ev.stopPropagation(); + this.downloadDP = !this.downloadDP; + } + + /** * 下载两个 */ - downloadZip() { - let nameSuffix = this.formatDate(new Date()); - this.downloadFarrisZip(nameSuffix); - this.downloadFramework(nameSuffix); - } - /** + downloadZip() { + const nameSuffix = this.formatDate(new Date()); + this.downloadFarrisZip(nameSuffix); + this.downloadFramework(nameSuffix); + } + + /** * 下载文件 */ - downloadFarrisZip(nameSuffix) { - nameSuffix = nameSuffix ? nameSuffix : this.formatDate(new Date()); - const zip = new JSZip(); - this.contentReady = false; - const tfilePath = `assets/themes/${this.themeRouteChangeSer.getThemeColor()}/${this.themeRouteChangeSer.getThemeSize()}/`; - let imgsFiles = ['table-norecords.png']; - let fontsFiles = ['farrisicon.ttf', 'farrisicon-extend.ttf']; - /** + downloadFarrisZip(nameSuffix) { + nameSuffix = nameSuffix || this.formatDate(new Date()); + const zip = new JSZip(); + this.contentReady = false; + const tfilePath = `assets/themes/${this.themeRouteChangeSer.getThemeColor()}/${this.themeRouteChangeSer.getThemeSize()}/`; + const imgsFiles = ['table-norecords.png']; + const fontsFiles = ['farrisicon.ttf', 'farrisicon-extend.ttf']; + /** * 汇总图片 */ - let imgZip = zip.folder("imgs"); - imgsFiles.forEach((fileName) => { - imgZip.file( - fileName, - JSZipUtils.getBinaryContent(tfilePath + 'imgs/' + fileName) - ); - }); - /** + const imgZip = zip.folder("imgs"); + imgsFiles.forEach((fileName) => { + imgZip.file( + fileName, + JSZipUtils.getBinaryContent(tfilePath + 'imgs/' + fileName) + ); + }); + /** * 汇总字体文件 */ - fontsFiles.forEach((fileName) => { - zip.file( - fileName, - JSZipUtils.getBinaryContent(tfilePath + fileName) - ); - }); - const fileName = this.getFileNameWithoutExt('', nameSuffix); - /** + fontsFiles.forEach((fileName) => { + zip.file( + fileName, + JSZipUtils.getBinaryContent(tfilePath + fileName) + ); + }); + const fileName = this.getFileNameWithoutExt('', nameSuffix); + /** * 汇总样式文件 * 如果没有变化,直接读取资源的farris-all.css */ - if (this.metadataService.getModifiedItems().length == 0) { - zip.file( - 'farris-all.css', - JSZipUtils.getBinaryContent(tfilePath + 'farris-all.css') - ); - } else { - zip.file( - `farris-all.css`, - this.importExportSer.exportCss(), - { binary: false } - ); - } - /** + if (this.metadataService.getModifiedItems().length == 0) { + zip.file( + 'farris-all.css', + JSZipUtils.getBinaryContent(tfilePath + 'farris-all.css') + ); + } else { + zip.file( + `farris-all.css`, + this.importExportSer.exportCss(), + { binary: false } + ); + } + /** * 生成 */ - zip.generateAsync({ type: 'blob' }) - .then((content) => { - this.contentReady = true; - fileSaver.saveAs(content, fileName + '.zip'); - }); - this.downloadDP = false; - } - downloadFramework(nameSuffix) { - nameSuffix = nameSuffix ? nameSuffix : this.formatDate(new Date()); - const zip = new JSZip(); - this.contentReady = false; - const tfilePath = `assets/themes/framework/${this.themeRouteChangeSer.getThemeColor()}/`; - const fileName = this.getFileNameWithoutExt('framework', nameSuffix); - /** + zip.generateAsync({ type: 'blob' }) + .then((content) => { + this.contentReady = true; + fileSaver.saveAs(content, fileName + '.zip'); + }); + this.downloadDP = false; + } + + downloadFramework(nameSuffix) { + nameSuffix = nameSuffix || this.formatDate(new Date()); + const zip = new JSZip(); + this.contentReady = false; + const tfilePath = `assets/themes/framework/${this.themeRouteChangeSer.getThemeColor()}/`; + const fileName = this.getFileNameWithoutExt('framework', nameSuffix); + /** * 汇总样式文件 * 如果没有变化,直接读取资源的farris-all.css */ - if (this.metadataService.getModifiedItems().length == 0) { - zip.file( - 'gsp-cloud-web.css', - JSZipUtils.getBinaryContent(tfilePath + 'gsp-cloud-web.min.css') - ); - } else { - zip.file( - `gsp-cloud-web.css`, - this.importExportSer.exportCss('framework'), - { binary: false } - ); - } - /** + if (this.metadataService.getModifiedItems().length == 0) { + zip.file( + 'gsp-cloud-web.css', + JSZipUtils.getBinaryContent(tfilePath + 'gsp-cloud-web.min.css') + ); + } else { + zip.file( + `gsp-cloud-web.css`, + this.importExportSer.exportCss('framework'), + { binary: false } + ); + } + /** * 生成 */ - zip.generateAsync({ type: 'blob' }) - .then((content) => { - this.contentReady = true; - fileSaver.saveAs(content, fileName + '.zip'); - }); - this.downloadDP = false; - } - /** + zip.generateAsync({ type: 'blob' }) + .then((content) => { + this.contentReady = true; + fileSaver.saveAs(content, fileName + '.zip'); + }); + this.downloadDP = false; + } + + /** * 更新预览界面 */ - updatePreview() { + updatePreview() { /** * 如果界面由多个主题生成功能组成 * 如何串联? */ - this.buildThemeEvent.emit(); - this.metadataService.buildAll(); - //this.metadataService.build(); - } - /** + this.buildThemeEvent.emit(); + this.metadataService.buildAll(); + // this.metadataService.build(); + } + + /** * 重置变量 */ - resetVariables() { - if (this.current == 'extend') { - this.clearCSSEvent.emit(); + resetVariables() { + if (this.current == 'extend') { + this.clearCSSEvent.emit(); + } + this.metadataService.resetVariables(); } - this.metadataService.resetVariables(); - } - /** + + /** * 日期格式转换 * @param millisecond 毫秒 * @param template 模板(可选) * @example formatDate(new Date(), "YYYY-mm-dd HH:MM:SS") => 2021-11-02 09:39:59 */ - private formatDate(millisecond, template = "YYYY-mm-dd HH:MM:SS") { - var res = ""; - try { - var date = new Date(millisecond); - var opt = { - "Y+": date.getFullYear().toString(), // 年 - "m+": (date.getMonth() + 1).toString(), // 月 - "d+": date.getDate().toString(), // 日 - "H+": date.getHours().toString(), // 时 - "M+": date.getMinutes().toString(), // 分 - "S+": date.getSeconds().toString(), // 秒 - }; - template = template || "YYYY-mm-dd"; - for (var k in opt) { - var ret = new RegExp("(" + k + ")").exec(template); - if (ret) { - template = template.replace( - ret[1], - ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0") - ); + private formatDate(millisecond, template = "YYYY-mm-dd HH:MM:SS") { + let res = ""; + try { + const date = new Date(millisecond); + const opt = { + "Y+": date.getFullYear().toString(), // 年 + "m+": (date.getMonth() + 1).toString(), // 月 + "d+": date.getDate().toString(), // 日 + "H+": date.getHours().toString(), // 时 + "M+": date.getMinutes().toString(), // 分 + "S+": date.getSeconds().toString(), // 秒 + }; + template = template || "YYYY-mm-dd"; + for (const k in opt) { + const ret = new RegExp("(" + k + ")").exec(template); + if (ret) { + template = template.replace( + ret[1], + ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0") + ); + } + } + res = template; + } catch (error) { + console.warn("日期格式化报错", error); } - } - res = template; - } catch (error) { - console.warn("日期格式化报错", error); + return res; } - return res; - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.spec.ts index bce60517325e845e61d9fefd6ba89a1aaa5c2b01..41c6703d9868eb20d0cd2f15aa5ca47bbd425eaf 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ThemeNavComponent } from './theme-nav.component'; describe('ThemeNavComponent', () => { - let component: ThemeNavComponent; - let fixture: ComponentFixture; + let component: ThemeNavComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ThemeNavComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ThemeNavComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ThemeNavComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ThemeNavComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.ts index 6f204a6d0dc601db6b993b785d2e9a7be3940c3d..98bcb79d9542c302fbd2f920303f2b0fa676ee4f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout-nav/theme-nav/theme-nav.component.ts @@ -1,81 +1,93 @@ +/* eslint-disable no-useless-escape */ +/* eslint-disable max-len */ import { Component, OnInit, HostBinding, Renderer2, ElementRef, ChangeDetectorRef } from '@angular/core'; import { LoadingService } from '../../service/loading.service'; import {ThemeExtendCSSService} from '../../service/theme-extend-css.service'; @Component({ - selector: 'app-theme-nav', - templateUrl: './theme-nav.component.html', - styleUrls: ['./theme-nav.component.css'] + selector: 'app-theme-nav', + templateUrl: './theme-nav.component.html', + styleUrls: ['./theme-nav.component.css'] }) export class ThemeNavComponent implements OnInit { - @HostBinding('class.tool-layout-nav') cls = true; - tabItems = [{ - code: 'rapid', - name: '快速配置', - icon: 'nav-icon-rapid' - }, - // { - // code: 'advanced', - // name: '高级配置', - // icon: 'nav-icon-detailed' - // }, - { - code: 'extend', - name: '自定义', - icon: 'nav-icon-css' - } - ]; - // 标记当前标签的code - tabActiveCode; - // 样式扩展区域 - themeExtend = ''; - // 标记 monacoInited是否要初始化 - monacoInited = false; - /** + @HostBinding('class.tool-layout-nav') cls = true; + + tabItems = [{ + code: 'rapid', + name: '快速配置', + icon: 'nav-icon-rapid' + }, + // { + // code: 'advanced', + // name: '高级配置', + // icon: 'nav-icon-detailed' + // }, + { + code: 'extend', + name: '自定义', + icon: 'nav-icon-css' + } + ]; + + // 标记当前标签的code + tabActiveCode; + + // 样式扩展区域 + themeExtend = ''; + + // 标记 monacoInited是否要初始化 + monacoInited = false; + + /** * monaco配置 */ - monacoOptions = { - theme: 'vs-dark', - language: 'css', - automaticLayout: true - }; - /** + monacoOptions = { + theme: 'vs-dark', + language: 'css', + automaticLayout: true + }; + + /** * monaco 编辑器指针 */ - private _editor: any; - constructor(private cd: ChangeDetectorRef, private loadingSer: LoadingService, private render: Renderer2, private el: ElementRef,private extendCSSSer:ThemeExtendCSSService) { - this.navTabClickHandler(this.tabItems[0]['code']); - } - - ngOnInit() { - } - /** + private _editor: any; + + constructor(private cd: ChangeDetectorRef, private loadingSer: LoadingService, private render: Renderer2, private el: ElementRef,private extendCSSSer: ThemeExtendCSSService) { + this.navTabClickHandler(this.tabItems[0].code); + } + + ngOnInit() { + } + + /** * 标签点击 - * @param code + * @param code */ - navTabClickHandler(code: string) { - if (!this.monacoInited && code == 'extend') { - this.loadingSer.show(); + navTabClickHandler(code: string) { + if (!this.monacoInited && code === 'extend') { + this.loadingSer.show(); + } + this.tabActiveCode = code; } - this.tabActiveCode = code; - } - /** - * - * @param ev + + /** + * + * @param ev */ - navStateChangeHandler(ev) { + navStateChangeHandler(ev) { + + } - } - /** + /** * 代码编辑工具 - * @param event + * @param event */ - onMonacoInitHandler(event) { - this.monacoInited = true; - this.loadingSer.hide(); + onMonacoInitHandler(event) { + this.monacoInited = true; + this.loadingSer.hide(); - this._editor = event.editor; - this.cd.detectChanges(); + this._editor = event.editor; + this.cd.detectChanges(); // setTimeout(() => { // this._editor // .getAction('editor.action.formatDocument') @@ -84,45 +96,49 @@ export class ThemeNavComponent implements OnInit { // console.log('格式化成功'); // }); // }, 300); - } - /** + } + + /** * css格式化后重新赋值 */ - formatCodeHandler() { - this.themeExtend = this._cssFormat(this.themeExtend); - } - /** + formatCodeHandler() { + this.themeExtend = this._cssFormat(this.themeExtend); + } + + /** * css格式化 - * @param code + * @param code */ - private _cssFormat(code) { - code = code.replace(/(\s){2,}/gi, '$1'); - code = code.replace(/(\S)\s*\{/gi, '$1 {'); - code = code.replace(/\*\/(.[^\}\{]*)}/gi, '*/\n$1}'); - code = code.replace(/\/\*/gi, '\n/*'); - code = code.replace(/;\s*(\S)/gi, ';\n\t$1'); - code = code.replace(/\}\s*(\S)/gi, '}\n$1'); - code = code.replace(/\n\s*\}/gi, '\n}'); - code = code.replace(/\{\s*(\S)/gi, '{\n\t$1'); - code = code.replace(/(\S)\s*\*\//gi, '$1*/'); - code = code.replace(/\*\/\s*([^\}\{]\S)/gi, '*/\n\t$1'); - code = code.replace(/(\S)\}/gi, '$1\n}'); - code = code.replace(/(\n){2,}/gi, '\n'); - code = code.replace(/:/gi, ': '); - code = code.replace(/ /gi, ' '); - return code; - } - /** + private _cssFormat(code) { + code = code.replace(/(\s){2,}/gi, '$1'); + code = code.replace(/(\S)\s*\{/gi, '$1 {'); + code = code.replace(/\*\/(.[^\}\{]*)}/gi, '*/\n$1}'); + code = code.replace(/\/\*/gi, '\n/*'); + code = code.replace(/;\s*(\S)/gi, ';\n\t$1'); + code = code.replace(/\}\s*(\S)/gi, '}\n$1'); + code = code.replace(/\n\s*\}/gi, '\n}'); + code = code.replace(/\{\s*(\S)/gi, '{\n\t$1'); + code = code.replace(/(\S)\s*\*\//gi, '$1*/'); + code = code.replace(/\*\/\s*([^\}\{]\S)/gi, '*/\n\t$1'); + code = code.replace(/(\S)\}/gi, '$1\n}'); + code = code.replace(/(\n){2,}/gi, '\n'); + code = code.replace(/:/gi, ': '); + code = code.replace(/ {2}/gi, ' '); + return code; + } + + /** * 清空CSS */ - clearCSSHandler(){ - this.themeExtend=''; - this.extendCSSSer.updateCSS(this.themeExtend); - } - /** + clearCSSHandler(){ + this.themeExtend=''; + this.extendCSSSer.updateCSS(this.themeExtend); + } + + /** * 创建主题 */ - buildThemeHandler(){ - this.extendCSSSer.updateCSS(this.themeExtend); - } + buildThemeHandler(){ + this.extendCSSSer.updateCSS(this.themeExtend); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.html b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.html index e18142ef5fcc42c2c885825d826534001c7f891d..e60dfbcf677adac268e67cbf874dcb1b9beb3067 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.html +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.html @@ -1,5 +1,3 @@ - - \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.spec.ts index 9686f8ae82799f9d4ab3d1421eedf6f826dd1525..4d11ce55201cc65c054c26f75a90de7a02a6059e 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { AppLayoutComponent } from './app-layout.component'; describe('AppLayoutComponent', () => { - let component: AppLayoutComponent; - let fixture: ComponentFixture; + let component: AppLayoutComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AppLayoutComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AppLayoutComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(AppLayoutComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(AppLayoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.ts index edc9bf29bafd809bcfc3eeff04d2993c7d207af1..d3a13c900477d9f72d59c826bf690ab8dc45e2d7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/app-layout/app-layout.component.ts @@ -1,15 +1,16 @@ import { Component, OnInit, HostBinding } from '@angular/core'; @Component({ - selector: 'app-app-layout', - templateUrl: './app-layout.component.html', - styleUrls: ['./app-layout.component.css'] + selector: 'app-app-layout', + templateUrl: './app-layout.component.html', + styleUrls: ['./app-layout.component.css'] }) export class AppLayoutComponent implements OnInit { - @HostBinding('class.tool-layout') cls = true; - constructor() { } + @HostBinding('class.tool-layout') cls = true; - ngOnInit() { - } + constructor() { } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.spec.ts index 052f9b7d0a8366db8bae6239db8a04982c1b19f8..c866f92a37fb2102578f947771b16d6eb9397f34 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { PreviewLayoutComponent } from './preview-layout.component'; describe('PreviewLayoutComponent', () => { - let component: PreviewLayoutComponent; - let fixture: ComponentFixture; + let component: PreviewLayoutComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PreviewLayoutComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PreviewLayoutComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(PreviewLayoutComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(PreviewLayoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.ts index afbeda257749416f1c11ebf9bdf676838ab16321..8099c1039c3726a670d8b4239947485106dd2397 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/preview-layout/preview-layout.component.ts @@ -1,15 +1,15 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-preview-layout', - templateUrl: './preview-layout.component.html', - styleUrls: ['./preview-layout.component.css'] + selector: 'app-preview-layout', + templateUrl: './preview-layout.component.html', + styleUrls: ['./preview-layout.component.css'] }) export class PreviewLayoutComponent implements OnInit { - constructor() { } + constructor() { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.spec.ts index 178880c7819a41951d8e19bb5e915807f42254ca..c3c002aabc42114412722b34f99087e44311b5c9 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ThemeMainComponent } from './theme-main.component'; describe('ThemeMainComponent', () => { - let component: ThemeMainComponent; - let fixture: ComponentFixture; + let component: ThemeMainComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ThemeMainComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ThemeMainComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ThemeMainComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ThemeMainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.ts index 58168c3c9e15f59c7c922d5693ad64af1937b11b..a33409d8fff04f5b1699a3851fbfcab571b1e70f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/layout/theme-main/theme-main.component.ts @@ -1,48 +1,51 @@ import { Component, OnInit, HostBinding } from '@angular/core'; import { Router } from '@angular/router'; import { MetadataService } from '../../service/metadata.service'; -import { ThemeRouteChangeService } from '../../service/theme-route-change.service' - +import { ThemeRouteChangeService } from '../../service/theme-route-change.service'; @Component({ - selector: 'app-theme-main', - templateUrl: './theme-main.component.html', - styleUrls: ['./theme-main.component.css'] + selector: 'app-theme-main', + templateUrl: './theme-main.component.html', + styleUrls: ['./theme-main.component.css'] }) export class ThemeMainComponent implements OnInit { - @HostBinding('class.tool-layout-main') cls = true; - previewType = ""; - // 设置支持类型 - previewDatas = [ - { - code: 'preview-page', - name: '模板' - }, - { - code: 'preview-widget', - name: '组件' + @HostBinding('class.tool-layout-main') cls = true; + + previewType = ""; + + // 设置支持类型 + previewDatas = [ + { + code: 'preview-page', + name: '模板' + }, + { + code: 'preview-widget', + name: '组件' + } + ]; + + constructor(public router: Router, private metadataSer: MetadataService,private routeChangeSer: ThemeRouteChangeService) { + this.previewType=this.routeChangeSer.getViewType(); + this.routeChangeSer.getUrlChange().subscribe(url=>{ + if(url){ + this.router.navigateByUrl('preview/'+url); + } + }); + } + + ngOnInit() { } - ]; - constructor(public router: Router, private metadataSer: MetadataService,private routeChangeSer:ThemeRouteChangeService) { - this.previewType=this.routeChangeSer.getViewType(); - this.routeChangeSer.getUrlChange().subscribe(url=>{ - if(url){ - this.router.navigateByUrl('preview/'+url); - } - }); - } - ngOnInit() { - } - /** - * 修改路由 - * @param type + /** + * 修改路由 + * @param type */ - changePreviewType(type: string) { - if (type != this.previewType) { - this.previewType = type ? type : 'preview-page'; - this.routeChangeSer.updateViewType(this.previewType); - this.router.navigateByUrl('preview/'+this.routeChangeSer.getFormatUrl()); + changePreviewType(type: string) { + if (type !== this.previewType) { + this.previewType = type || 'preview-page'; + this.routeChangeSer.updateViewType(this.previewType); + this.router.navigateByUrl('preview/'+this.routeChangeSer.getFormatUrl()); + } } - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/builder-result.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/builder-result.ts index ca24adbaa48d0cf7a6bfb90ad374975ddb204823..cdef1c0a61a0b640eafc7428081afff91bd424a1 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/builder-result.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/builder-result.ts @@ -1,8 +1,13 @@ export class BuilderResult { css: string; + compiledMetadata: { [key: string]: string }; + swatchSelector: string; + unusedWidgets: string[]; + widgets: string[]; + version: string; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/left-menu-item.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/left-menu-item.ts index ef21aa1a6fb7cda6f3418c1a11ae9484e2083113..625a7fb1870277500de554231338ec63b27e573b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/left-menu-item.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/left-menu-item.ts @@ -1,15 +1,22 @@ +/* eslint-disable no-use-before-define */ import { MetaItem } from './meta-item'; export class MenuItem { name: string; + regs?: { - [themeName:string]:RegExp[] + [themeName: string]: RegExp[]; }; + equivalents?: string; + groups?: MenuItem[]; + items?: MetaItem[]; + route?: string; - code?:string; - isFold?:boolean; -} + code?: string; + + isFold?: boolean; +} diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/meta-item.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/meta-item.ts index 88e5e9ad6cf5cd32c9fa983c5a02e86b7ac193cb..123964ea0a86e0c59c8ac656fe3c0c0b23090bb7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/meta-item.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/meta-item.ts @@ -1,14 +1,24 @@ +/* eslint-disable no-use-before-define */ +/* eslint-disable max-classes-per-file */ export class MetaItem { Name: string; + Key: string; + Value: string; + Type?: string; + TypeValues?: string; + TypeValuesArray?: string[]; + Items?: MetaItem[]; } -export class MetaValueChange{ - changeValue:any;// 修改后的值 - controlKey:string;//控件编号 - variableType:string;// 变量修改的类型,基础变量还是高级变量 -} \ No newline at end of file +export class MetaValueChange { + changeValue: any;// 修改后的值 + + controlKey: string;// 控件编号 + + variableType: string;// 变量修改的类型,基础变量还是高级变量 +} diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/metadata.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/metadata.ts index 3d60e25cece47e499cef0f1402ea088c0af8317a..231b5238e1bdd7cc64064456ba8ce39f04381bb3 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/metadata.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/metadata.ts @@ -3,9 +3,14 @@ import { MetaItem } from './meta-item'; export class Metadata { baseParameters?: string[]; + generic: MetaItem[]; + material?: MetaItem[]; - farris?:MetaItem[]; + + farris?: MetaItem[]; + themes: ThemeConfig[]; + version: string; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/theme.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/theme.ts index cce753ab0de21b2ed7484a6881754e226d19a963..8bb0a0e323a3bf1cc3c8c48a5e515d9dd32ce675 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/models/theme.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/models/theme.ts @@ -1,10 +1,14 @@ +/* eslint-disable max-classes-per-file */ export class Theme { name: string; + colorScheme: string; } export class ThemeConfig extends Theme { themeId: number; + text: string; + group: string; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.spec.ts index 33340d2d46e91df545c26cb7dc3f3fc6f39ca75d..56893a43b0d8dc6060b169130886e0e1a1663633 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { BulkEditTmplComponent } from './bulk-edit-tmpl.component'; describe('BulkEditTmplComponent', () => { - let component: BulkEditTmplComponent; - let fixture: ComponentFixture; + let component: BulkEditTmplComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BulkEditTmplComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BulkEditTmplComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(BulkEditTmplComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(BulkEditTmplComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.ts index 96939cfff03da5bbd5eb073281b967b4fbb95238..023eea1b2ff172c7d567a8a5c8b7ec88dc288f60 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/bulk-edit-tmpl/bulk-edit-tmpl.component.ts @@ -2,68 +2,74 @@ import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core'; import { PageService } from '../service/page.service'; @Component({ - selector: 'app-bulk-edit-tmpl', - templateUrl: './bulk-edit-tmpl.component.html', - styleUrls: ['./bulk-edit-tmpl.component.css'] + selector: 'app-bulk-edit-tmpl', + templateUrl: './bulk-edit-tmpl.component.html', + styleUrls: ['./bulk-edit-tmpl.component.css'] }) export class BulkEditTmplComponent implements OnInit { - maingridcolumns = []; - mainGridData=[]; - mainGridTotal=0; - @ViewChild('cell2') cell2: TemplateRef; - @ViewChild('cell3') cell3: TemplateRef; - constructor(private orderService: PageService) { - this.orderService.viewList().subscribe((data: any) => { - this.mainGridData = data; - this.mainGridTotal = data.length; - }); - } + maingridcolumns = []; - ngOnInit() { - this.maingridcolumns = [ - { field: '', width: 100, title: '加急', template: this.cell2 }, - { - field: 'DDRQ', - width: 200, - title: '单据日期' - }, - { field: 'DDBH', width: 200, title: '订单编号', template: this.cell3, sortable: true }, - { field: 'KHMC', width: 200, title: '客户名称', sortable: true }, - { field: 'KHBM', width: 200, title: '客户别名', }, - { field: 'BM', width: 200, title: '部门' }, - { field: 'YWY', width: 200, title: '业务员' }, - { field: 'ZJE', width: 100, title: '总金额', sortable: true }, - { field: 'BZ', width: 100, title: '币种' }, - { - title: '管理', - width: 200, - align: 'center', - hAlign: 'center' - } - ]; - } - getBadgeCls(rowIndex) { - const result = rowIndex % 6; - let cls = ''; - switch (result) { - case 0: - cls = '-info'; - break; - case 1: - cls = '-success'; - break; - case 2: - cls = '-warning'; - break; - case 3: - cls = '-danger'; - break; - case 4: - cls = '-continue'; - break; - default: - cls = '-primary'; + mainGridData=[]; + + mainGridTotal=0; + + @ViewChild('cell2') cell2: TemplateRef; + + @ViewChild('cell3') cell3: TemplateRef; + + constructor(private orderService: PageService) { + this.orderService.viewList().subscribe((data: any) => { + this.mainGridData = data; + this.mainGridTotal = data.length; + }); + } + + ngOnInit() { + this.maingridcolumns = [ + { field: '', width: 100, title: '加急', template: this.cell2 }, + { + field: 'DDRQ', + width: 200, + title: '单据日期' + }, + { field: 'DDBH', width: 200, title: '订单编号', template: this.cell3, sortable: true }, + { field: 'KHMC', width: 200, title: '客户名称', sortable: true }, + { field: 'KHBM', width: 200, title: '客户别名', }, + { field: 'BM', width: 200, title: '部门' }, + { field: 'YWY', width: 200, title: '业务员' }, + { field: 'ZJE', width: 100, title: '总金额', sortable: true }, + { field: 'BZ', width: 100, title: '币种' }, + { + title: '管理', + width: 200, + align: 'center', + hAlign: 'center' + } + ]; + } + + getBadgeCls(rowIndex) { + const result = rowIndex % 6; + let cls = ''; + switch (result) { + case 0: + cls = '-info'; + break; + case 1: + cls = '-success'; + break; + case 2: + cls = '-warning'; + break; + case 3: + cls = '-danger'; + break; + case 4: + cls = '-continue'; + break; + default: + cls = '-primary'; + } + return 'badge badge-arrow-left' + cls; } - return 'badge badge-arrow-left' + cls; - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.spec.ts index 2d0479d7d071a5e6d19a74d195ff34b2edeb5616..8bdbad8cd600661bdcd32031c63e2f08dc986251 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { HeaderComponent } from './header.component'; describe('HeaderComponent', () => { - let component: HeaderComponent; - let fixture: ComponentFixture; + let component: HeaderComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ HeaderComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeaderComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(HeaderComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.ts index 43ba5cbdc14f7e37871b2a925f16ab2f5e15882e..5e44508c7423ef80c871d67429aa0199c01257df 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/header/header.component.ts @@ -1,117 +1,125 @@ import { Component, OnInit, Input } from '@angular/core'; @Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.css'] + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.css'] }) export class HeaderComponent implements OnInit { - private _type = 'list'; - @Input() - set type(typeStr: string) { - switch (typeStr) { - case 'card': - this.title = this._cardTitle; - this.toolbarData=[].concat(this._cardToolbar); - break; - default: - this.title = this._listTitle; - this.toolbarData = [].concat(this._listToolbar); - } - } - get type() { - return this._type; - } - // 卡片标题 - private _cardTitle = "销售详情"; - // 列表标题 - private _listTitle = "销售列表"; - // 卡片-工具栏数据 - private _cardToolbar = [ - { - id: 'cardtoolbar-001', - text: '引入银行交易明细', - class: '', - disabled: false - }, - { - id: 'cardtoolbar-002', - text: '引入存款变动通知', - disabled: true - }, - { - id: 'cardtoolbar-003', - text: '编辑', - disabled: true - }, - { - id: 'cardtoolbar-004', - text: '保存', - class: 'btn-primary', - disabled: false - }, - { - id: 'cardtoolbar-005', - text: '取消', - disabled: false - }, - { - id: 'cardtoolbar-006', - text: '提交', - disabled: true - }, - { - id: 'cardtoolbar-007', - text: '撤回', - disabled: true - }, - { - id: 'cardtoolbar-008', - text: '电子影像', - disabled: false - }, - { - id: 'cardtoolbar-009', - text: '关闭', - disabled: false + private _type = 'list'; + + @Input() + set type(typeStr: string) { + switch (typeStr) { + case 'card': + this.title = this._cardTitle; + this.toolbarData=[].concat(this._cardToolbar); + break; + default: + this.title = this._listTitle; + this.toolbarData = [].concat(this._listToolbar); + } } - ]; - // 列表-工具栏数据 - private _listToolbar = [ - { - id: 'toolbar-001', - text: '新增', - class: 'btn-primary', - disabled: true - }, - { - id: 'toolbar-002', - text: '编辑', - disabled: false - }, - { - id: 'toolbar-003', - text: '查看', - disabled: false - }, - { - id: 'toolbar-004', - text: '删除', - disabled: true - }, - { - id: 'toolbar-005', - text: '关闭', - disabled: false + get type() { + return this._type; } - ]; - // 初始化 - title = this._listTitle; - toolbarData = this._listToolbar - constructor() { } - ngOnInit() { - } + // 卡片标题 + private _cardTitle = "销售详情"; + + // 列表标题 + private _listTitle = "销售列表"; + + // 卡片-工具栏数据 + private _cardToolbar = [ + { + id: 'cardtoolbar-001', + text: '引入银行交易明细', + class: '', + disabled: false + }, + { + id: 'cardtoolbar-002', + text: '引入存款变动通知', + disabled: true + }, + { + id: 'cardtoolbar-003', + text: '编辑', + disabled: true + }, + { + id: 'cardtoolbar-004', + text: '保存', + class: 'btn-primary', + disabled: false + }, + { + id: 'cardtoolbar-005', + text: '取消', + disabled: false + }, + { + id: 'cardtoolbar-006', + text: '提交', + disabled: true + }, + { + id: 'cardtoolbar-007', + text: '撤回', + disabled: true + }, + { + id: 'cardtoolbar-008', + text: '电子影像', + disabled: false + }, + { + id: 'cardtoolbar-009', + text: '关闭', + disabled: false + } + ]; + + // 列表-工具栏数据 + private _listToolbar = [ + { + id: 'toolbar-001', + text: '新增', + class: 'btn-primary', + disabled: true + }, + { + id: 'toolbar-002', + text: '编辑', + disabled: false + }, + { + id: 'toolbar-003', + text: '查看', + disabled: false + }, + { + id: 'toolbar-004', + text: '删除', + disabled: true + }, + { + id: 'toolbar-005', + text: '关闭', + disabled: false + } + ]; + + // 初始化 + title = this._listTitle; + + toolbarData = this._listToolbar; + + constructor() { } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.spec.ts index e00be8d832c7e1dabcbb2565419f6239fa8486e3..b9f6933dde38ac18f04948e4ee2d4d52430c1f98 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SchemeComponent } from './scheme.component'; describe('SchemeComponent', () => { - let component: SchemeComponent; - let fixture: ComponentFixture; + let component: SchemeComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SchemeComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SchemeComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SchemeComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SchemeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.ts index dcf770b855b2fd864ef2c89a1db49f0129ba0f2c..9ed4844f9b1e0aa67135df66ef8759ddd4033094 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/common/scheme/scheme.component.ts @@ -1,15 +1,15 @@ import { Component, OnInit } from '@angular/core'; @Component({ - selector: 'app-scheme', - templateUrl: './scheme.component.html', - styleUrls: ['./scheme.component.css'] + selector: 'app-scheme', + templateUrl: './scheme.component.html', + styleUrls: ['./scheme.component.css'] }) export class SchemeComponent implements OnInit { - constructor() { } + constructor() { } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.spec.ts index ab8d9c2a78863f4cba74e683eec73480035d7635..5f0022c3b4e166063d9e8cea9ce99b17c701056f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.spec.ts @@ -1,25 +1,25 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FrameworTabsetComponent } from './framewor-tabset.component'; +import { FrameworkTabsetComponent } from './framework-tabset.component'; describe('FrameworTabsetComponent', () => { - let component: FrameworTabsetComponent; - let fixture: ComponentFixture; + let component: FrameworkTabsetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ FrameworTabsetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ FrameworkTabsetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(FrameworTabsetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(FrameworkTabsetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.ts index 85c7773b5494972ee601ec603d4713cdf531901a..e41b20e2da6df6c477af570a993da625031869e2 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/framework-tabset/framework-tabset.component.ts @@ -1,42 +1,45 @@ +/* eslint-disable no-empty */ import { Component, OnInit, Output, EventEmitter } from "@angular/core"; import { PageService } from '../service/page.service'; @Component({ - selector: "app-framework-tabset", - templateUrl: "./framework-tabset.component.html", - styleUrls: ["./framework-tabset.component.css"] + selector: "app-framework-tabset", + templateUrl: "./framework-tabset.component.html", + styleUrls: ["./framework-tabset.component.css"] }) export class FrameworkTabsetComponent implements OnInit { - // 临时赋值 - allTabs = []; - // 页面服务 - constructor(private pgService: PageService) { - this.allTabs = this.pgService.getTabList(); - } + // 临时赋值 + allTabs = []; - ngOnInit() { } + // 页面服务 + constructor(private pgService: PageService) { + this.allTabs = this.pgService.getTabList(); + } + + ngOnInit() { } - // tslint:disable - ngAfterViewInit() { } + // tslint:disable + ngAfterViewInit() { } - removeTabHandler(app) { } + removeTabHandler(app) { } - /** + /** * 关闭所有,除了首页 */ - removeAllTabs(arg: any) { - if (arg && arg === "closeAllTabs") { + removeAllTabs(arg: any) { + if (arg && arg === "closeAllTabs") { + } } - } - /** - * - * @param app + + /** + * + * @param app */ - selectTabHandler(app) { - this.pgService.updataSelectedTabId(app.tabId); - } + selectTabHandler(app) { + this.pgService.updataSelectedTabId(app.tabId); + } - /** + /** * header hide mode: * 1. header hide * 2. tabs hide @@ -44,7 +47,7 @@ export class FrameworkTabsetComponent implements OnInit { * 4. home page hide * 7. header、tabs、dashboard hide */ - private headerHide(): void { + private headerHide(): void { // const hideMode = this.frmConfig.headerHideMode(); // if (!!hideMode) { // switch (hideMode) { @@ -60,11 +63,11 @@ export class FrameworkTabsetComponent implements OnInit { // default: break; // } // } - } + } - private hideStyle(elementId: string): void { - if (!!document.getElementById(elementId)) { - document.getElementById(elementId).style.display = "none"; + private hideStyle(elementId: string): void { + if (document.getElementById(elementId)) { + document.getElementById(elementId).style.display = "none"; + } } - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.spec.ts index ea7657e627a6b3331604544bbc19f51c5887c157..e3ff5753ee6baa6ecb039bf19ff210d3a1aa2f9a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { IndexTmplComponent } from './index-tmpl.component'; describe('IndexTmplComponent', () => { - let component: IndexTmplComponent; - let fixture: ComponentFixture; + let component: IndexTmplComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ IndexTmplComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ IndexTmplComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(IndexTmplComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(IndexTmplComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.ts index 98c799907713cbd185a803aaf7a9f43affe989cb..d4b15eafa8525213e89abf1febd19e367d915eb4 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/index-tmpl/index-tmpl.component.ts @@ -2,119 +2,125 @@ import { Component, AfterViewInit, HostBinding } from '@angular/core'; import { Router } from '@angular/router'; @Component({ - selector: 'app-index-tmpl', - templateUrl: './index-tmpl.component.html', - styleUrls: ['./index-tmpl.component.css'] + selector: 'app-index-tmpl', + templateUrl: './index-tmpl.component.html', + styleUrls: ['./index-tmpl.component.css'] }) export class IndexTmplComponent implements AfterViewInit { - @HostBinding("class.f-utils-absolute-all") cls = true; - @HostBinding("class.f-utils-flex-column") cls1 = true; - isStylesReady = false; - themeName: string; - themeSize: string; - //widgetName: string; - colorTheme: string; - // typographyClass: string; - - constructor(private router: Router) { - const THEME_POSITION = 2; - const COLOR_THEME_POSITION = 3; - //url:/preview-page/farris/green-default - const urlParts = this.router.url.split('/'); - this.themeName = urlParts[THEME_POSITION]; - let tColorTheme = urlParts[COLOR_THEME_POSITION].split('-'); - if (tColorTheme.length > 1) { - this.colorTheme = tColorTheme[0]; - this.themeSize = tColorTheme[1]; - } else { - this.colorTheme = tColorTheme[0]; - this.themeSize = 'default'; + @HostBinding("class.f-utils-absolute-all") cls = true; + + @HostBinding("class.f-utils-flex-column") cls1 = true; + + isStylesReady = false; + + themeName: string; + + themeSize: string; + + // widgetName: string; + colorTheme: string; + // typographyClass: string; + + constructor(private router: Router) { + const THEME_POSITION = 2; + const COLOR_THEME_POSITION = 3; + // url:/preview-page/farris/green-default + const urlParts = this.router.url.split('/'); + this.themeName = urlParts[THEME_POSITION]; + const tColorTheme = urlParts[COLOR_THEME_POSITION].split('-'); + if (tColorTheme.length > 1) { + this.colorTheme = tColorTheme[0]; + this.themeSize = tColorTheme[1]; + } else { + this.colorTheme = tColorTheme[0]; + this.themeSize = 'default'; + } + console.log("预览模板的构造方法内,获取 ——themeName:" + this.themeName + "——colorTheme" + this.colorTheme + "——themeSize" + this.themeSize); } - console.log("预览模板的构造方法内,获取 ——themeName:" + this.themeName + "——colorTheme" + this.colorTheme + "——themeSize" + this.themeSize); - } - receiveMessage(e: any): void { - if (e.data && e.data['name']) { - console.log("预览模板的响应message事件"); - // 根据内容 - this.addHeadStyles(e.data.css, e.data.name); - // themeSize在framework和Farris下都会有 - this.themeSize = e.data.themeSize; + + receiveMessage(e: any): void { + if (e.data && e.data.name) { + console.log("预览模板的响应message事件"); + // 根据内容 + this.addHeadStyles(e.data.css, e.data.name); + // themeSize在framework和Farris下都会有 + this.themeSize = e.data.themeSize; + } } - // if (e.data.widget) { - // this.widgetName = e.data.widget; - // } - } - /** + + /** * 追加通过变量生成的样式 * - * @param css + * @param css */ - addHeadStyles(css: string, themeName: string): void { - const head = document.getElementsByTagName('head')[0]; - const style = document.createElement('style'); - const DYNAMIC_STYLES_ID = 'dynamic-styles-' + themeName; + addHeadStyles(css: string, themeName: string): void { + const head = document.getElementsByTagName('head')[0]; + const style = document.createElement('style'); + const DYNAMIC_STYLES_ID = 'dynamic-styles-' + themeName; - const dynamicStylesElement = document.getElementById(DYNAMIC_STYLES_ID); + const dynamicStylesElement = document.getElementById(DYNAMIC_STYLES_ID); - if (!css&&dynamicStylesElement || dynamicStylesElement) { - dynamicStylesElement.parentNode.removeChild(dynamicStylesElement); - } - if (css) { - style.type = 'text/css'; - style.id = DYNAMIC_STYLES_ID; - - // 可以再次调整已生成的样式 - // css = css - // .replace(//gi, 'content/css/icons/dxicons') - - style.appendChild(document.createTextNode(css)); - head.appendChild(style); - // 当样式已经加载成功 - this.isStylesReady = true; - } - } - private insterAfter(newElement, targetElement) { - var parent = targetElement.parentNode; - if (parent.lastChild == targetElement) { - parent.appendChild(newElement); + if (!css&&dynamicStylesElement || dynamicStylesElement) { + dynamicStylesElement.parentNode.removeChild(dynamicStylesElement); + } + if (css) { + style.type = 'text/css'; + style.id = DYNAMIC_STYLES_ID; + + // 可以再次调整已生成的样式 + // css = css + // .replace(//gi, 'content/css/icons/dxicons') + + style.appendChild(document.createTextNode(css)); + head.appendChild(style); + // 当样式已经加载成功 + this.isStylesReady = true; + } } - else { - parent.insertBefore(newElement, targetElement.nextSibling); + + private insterAfter(newElement, targetElement) { + const parent = targetElement.parentNode; + if (parent.lastChild === targetElement) { + parent.appendChild(newElement); + } + else { + parent.insertBefore(newElement, targetElement.nextSibling); + } } - } - /** + + /** * 添加link比追加css方式节省性能 */ - private addHeadLinks(linkId, insertAfterId): void { - if (this.colorTheme != 'default' || (this.themeSize != 'default' && linkId == 'dynamic-farris')) { - const head = document.getElementsByTagName('head')[0]; - const linkEl = document.createElement('link'); - const DYNAMIC_LINKS_ID = linkId; - // 应该不存在这种场景 - const dynamicLinksElement = document.getElementById(DYNAMIC_LINKS_ID); - if (dynamicLinksElement) { - dynamicLinksElement.parentNode.removeChild(dynamicLinksElement); - } - linkEl.rel = 'stylesheet'; - linkEl.id = DYNAMIC_LINKS_ID; - if (linkId == 'dynamic-framework') { - linkEl.href = "assets/framework/themes/" + this.colorTheme + "/gsp-cloud-web.css"; - } else { - linkEl.href = "assets/themes/" + this.colorTheme + "/" + this.themeSize + "/farris-all.css"; - } - this.insterAfter(linkEl, head.querySelector('#' + insertAfterId)); + private addHeadLinks(linkId, insertAfterId): void { + if (this.colorTheme !== 'default' || (this.themeSize !== 'default' && linkId === 'dynamic-farris')) { + const head = document.getElementsByTagName('head')[0]; + const linkEl = document.createElement('link'); + const DYNAMIC_LINKS_ID = linkId; + // 应该不存在这种场景 + const dynamicLinksElement = document.getElementById(DYNAMIC_LINKS_ID); + if (dynamicLinksElement) { + dynamicLinksElement.parentNode.removeChild(dynamicLinksElement); + } + linkEl.rel = 'stylesheet'; + linkEl.id = DYNAMIC_LINKS_ID; + if (linkId === 'dynamic-framework') { + linkEl.href = "assets/framework/themes/" + this.colorTheme + "/gsp-cloud-web.css"; + } else { + linkEl.href = "assets/themes/" + this.colorTheme + "/" + this.themeSize + "/farris-all.css"; + } + this.insterAfter(linkEl, head.querySelector('#' + insertAfterId)); + } + } + + ngAfterViewInit(): void { + this.addHeadLinks('dynamic-farris', 'farrisThemeLink'); + this.addHeadLinks('dynamic-framework', 'frameworkThemeLink'); + const messageListener = this.receiveMessage.bind(this); + window.removeEventListener('message', messageListener); + // 捕获到message事件的时候,执行style的加载方法 + window.addEventListener('message', messageListener, false); + // 通知父级,关闭loading + window.parent.postMessage({ hideLoading: true }, window.parent.location.href); } - } - - ngAfterViewInit(): void { - this.addHeadLinks('dynamic-farris', 'farrisThemeLink'); - this.addHeadLinks('dynamic-framework', 'frameworkThemeLink'); - const messageListener = this.receiveMessage.bind(this); - window.removeEventListener('message', messageListener); - // 捕获到message事件的时候,执行style的加载方法 - window.addEventListener('message', messageListener, false); - // 通知父级,关闭loading - window.parent.postMessage({ hideLoading: true }, window.parent.location.href); - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.spec.ts index 74b5a028e370215e0c322042b3c34d748a40991c..90315b60b468ccd9596b43db412b2b8c7ea48643 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { LeftgridRightcardTmplComponent } from './leftgrid-rightcard-tmpl.component'; describe('LeftgridRightcardTmplComponent', () => { - let component: LeftgridRightcardTmplComponent; - let fixture: ComponentFixture; + let component: LeftgridRightcardTmplComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ LeftgridRightcardTmplComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LeftgridRightcardTmplComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(LeftgridRightcardTmplComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(LeftgridRightcardTmplComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.ts index 59df77af6b439696138f5221d8a6a49c894ee8dc..cfb00ced165bcc3933c9d8e8f172612d2e4f7a29 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/leftgrid-rightcard-tmpl/leftgrid-rightcard-tmpl.component.ts @@ -1,194 +1,208 @@ +/* eslint-disable no-prototype-builtins */ import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core'; import { mockdata } from './mockdata/mockList'; import { PageService } from '../service/page.service'; import { BehaviorSubject } from 'rxjs'; @Component({ - selector: 'app-leftgrid-rightcard-tmpl', - templateUrl: './leftgrid-rightcard-tmpl.component.html', - styleUrls: ['./leftgrid-rightcard-tmpl.component.css'] + selector: 'app-leftgrid-rightcard-tmpl', + templateUrl: './leftgrid-rightcard-tmpl.component.html', + styleUrls: ['./leftgrid-rightcard-tmpl.component.css'] }) export class LeftgridRightcardTmplComponent implements OnInit { - mainGridColumns=[]; - mainGridData=[]; - mainGridTotal=0; - - // 主表卡片数据 - mainCardData = null; - subGridColumnA = []; - subGridDataA = []; - subGridDataTotalA = 0; - subGridColumnB = []; - subGridDataB = []; - subGridDataTotalB = 0; - // 子表Tab标签按钮 - subGridToolbarA = { - position: "inHead", - contents: [ - { - id: "a", - disabled: false, - title: "新增", - click: "addRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "b", - disabled: false, - title: "删除", - click: "deleteRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "c", - disabled: false, - title: "更新", - click: "updateRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "d", - disabled: true, - title: "查询", - click: "selectRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: false - } - ] - }; - subGridToolbarB = { - position: "inHead", - contents: [ - { - id: "a", - disabled: false, - title: "新增", - click: "addRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "b", - disabled: false, - title: "删除", - click: "deleteRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - } - ] - }; - // Tab 处理按钮的禁用状态 - subGridBtnStates = new BehaviorSubject({}); - // 处理下拉 - valObj = { id: '9', text: '中国4' }; - listItemsDropDown = [ - { "id": '1', "text": "中国" }, - { "id": '2', "text": "俄罗斯" }, - { "id": '3', "text": "菲律宾" }, - { "id": '4', "text": "越南" }, - { "id": '5', "text": "老挝" }, - { "id": '6', "text": "中国1" }, - { "id": '7', "text": "中国2" }, - { "id": '8', "text": "中国3" }, - { "id": '9', "text": "中国4" } - ]; - constructor(private orderService: PageService) { - // 主表数据 - this.orderService.viewList().subscribe((data: any) => { - this.mainGridData = data; - this.mainGridTotal = data.length; - }); - // 卡片取数 - this.orderService.viewCard().subscribe((data: any) => { - if (!data) { - return; - } - this.mainCardData = data; - }); - // 从表一取数 - this.orderService.viewMaterial().subscribe((data: any) => { - this.subGridDataA = data; - this.subGridDataTotalA = this.subGridDataA.length; - }); - } - - - ngOnInit() { - this.mainGridColumns = [ - { - field: 'DDRQ', - width: 200, - title: '单据日期' - }, - { field: 'DDBH', width: 200, title: '订单编号' }, - { field: 'KHMC', width: 200, title: '客户名称' }, - { field: 'ZJE', width: 100, title: '总金额' } - ]; + mainGridColumns=[]; - let stateResults = {}; - [this.subGridToolbarA.contents, this.subGridToolbarB.contents].forEach((item, index) => { - item.forEach((btnInfo) => { - if (!stateResults.hasOwnProperty(btnInfo.id)) { - stateResults[btnInfo.id] = true; - } - }); - - }); - this.subGridBtnStates.next(stateResults); - // 从表一 列配置 - this.subGridColumnA = [ - { field: 'WLBH', width: 180, title: '物料编号' }, - { field: 'WLMC', width: 180, title: '物料名称' }, - { field: 'WLMS', width: 180, title: '物料描述' }, - { field: 'WLTZ', width: 180, title: '物料特征' }, - { field: 'WLBM', width: 180, title: '物料别名' }, - { field: 'KHBH', width: 200, title: '客户物料编号' }, - { field: 'ZSL', width: 180, title: '主数量' }, - { field: 'ZDW', width: 180, title: '主单位' }, - { field: 'ZHZDJ', width: 200, title: '折前主单价' }, - { field: 'ZDJ', width: 200, title: '主单价' }, - { field: 'FSL', width: 200, title: '辅数量' }, - { field: 'FDW', width: 200, title: '辅单位' }, - { field: 'ZQFDJ', width: 200, title: '折前辅单价' }, - { field: 'FDJ', width: 180, title: '辅单价' } - ]; - // 从表二 列配置 - this.subGridColumnB = [ - { field: '', width: 180, title: '送达方' }, - { field: '', width: 180, title: '送货地址' }, - { field: '', width: 180, title: '收货人' }, - { field: '', width: 180, title: '收货电话' }, - { field: '', width: 180, title: '收获地区' }, - { field: '', width: 200, title: '工厂' }, - { field: '', width: 180, title: '发货库存组织' }, - { field: '', width: 180, title: '发货仓库' }, - { field: '', width: 200, title: '发货条件' }, - { field: '', width: 200, title: '物流组织' }, - { field: '', width: 200, title: '计划交货日期' }, - { field: '', width: 200, title: '客户要求交货日期' }, - { field: '', width: 200, title: '货位' }, - { field: '', width: 180, title: '允许不足交货' }, - { field: '', width: 180, title: '不足交货容差(%)' }, - { field: '', width: 180, title: '允许超量交货' }, - { field: '', width: 180, title: '超量交货容差(%)' }, - { field: '', width: 180, title: '交货相关' }, - { field: '', width: 180, title: '补货相关' } + mainGridData=[]; + + mainGridTotal=0; + + // 主表卡片数据 + mainCardData = null; + + subGridColumnA = []; + + subGridDataA = []; + + subGridDataTotalA = 0; + + subGridColumnB = []; + + subGridDataB = []; + + subGridDataTotalB = 0; + + // 子表Tab标签按钮 + subGridToolbarA = { + position: "inHead", + contents: [ + { + id: "a", + disabled: false, + title: "新增", + click: "addRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "b", + disabled: false, + title: "删除", + click: "deleteRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "c", + disabled: false, + title: "更新", + click: "updateRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "d", + disabled: true, + title: "查询", + click: "selectRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: false + } + ] + }; + + subGridToolbarB = { + position: "inHead", + contents: [ + { + id: "a", + disabled: false, + title: "新增", + click: "addRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "b", + disabled: false, + title: "删除", + click: "deleteRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + } + ] + }; + + // Tab 处理按钮的禁用状态 + subGridBtnStates = new BehaviorSubject({}); + + // 处理下拉 + valObj = { id: '9', text: '中国4' }; + + listItemsDropDown = [ + { "id": '1', "text": "中国" }, + { "id": '2', "text": "俄罗斯" }, + { "id": '3', "text": "菲律宾" }, + { "id": '4', "text": "越南" }, + { "id": '5', "text": "老挝" }, + { "id": '6', "text": "中国1" }, + { "id": '7', "text": "中国2" }, + { "id": '8', "text": "中国3" }, + { "id": '9', "text": "中国4" } ]; - } + + constructor(private orderService: PageService) { + // 主表数据 + this.orderService.viewList().subscribe((data: any) => { + this.mainGridData = data; + this.mainGridTotal = data.length; + }); + // 卡片取数 + this.orderService.viewCard().subscribe((data: any) => { + if (!data) { + return; + } + this.mainCardData = data; + }); + // 从表一取数 + this.orderService.viewMaterial().subscribe((data: any) => { + this.subGridDataA = data; + this.subGridDataTotalA = this.subGridDataA.length; + }); + } + + ngOnInit() { + this.mainGridColumns = [ + { + field: 'DDRQ', + width: 200, + title: '单据日期' + }, + { field: 'DDBH', width: 200, title: '订单编号' }, + { field: 'KHMC', width: 200, title: '客户名称' }, + { field: 'ZJE', width: 100, title: '总金额' } + ]; + + const stateResults = {}; + [this.subGridToolbarA.contents, this.subGridToolbarB.contents].forEach((item, index) => { + item.forEach((btnInfo) => { + if (!stateResults.hasOwnProperty(btnInfo.id)) { + stateResults[btnInfo.id] = true; + } + }); + + }); + this.subGridBtnStates.next(stateResults); + // 从表一 列配置 + this.subGridColumnA = [ + { field: 'WLBH', width: 180, title: '物料编号' }, + { field: 'WLMC', width: 180, title: '物料名称' }, + { field: 'WLMS', width: 180, title: '物料描述' }, + { field: 'WLTZ', width: 180, title: '物料特征' }, + { field: 'WLBM', width: 180, title: '物料别名' }, + { field: 'KHBH', width: 200, title: '客户物料编号' }, + { field: 'ZSL', width: 180, title: '主数量' }, + { field: 'ZDW', width: 180, title: '主单位' }, + { field: 'ZHZDJ', width: 200, title: '折前主单价' }, + { field: 'ZDJ', width: 200, title: '主单价' }, + { field: 'FSL', width: 200, title: '辅数量' }, + { field: 'FDW', width: 200, title: '辅单位' }, + { field: 'ZQFDJ', width: 200, title: '折前辅单价' }, + { field: 'FDJ', width: 180, title: '辅单价' } + ]; + // 从表二 列配置 + this.subGridColumnB = [ + { field: '', width: 180, title: '送达方' }, + { field: '', width: 180, title: '送货地址' }, + { field: '', width: 180, title: '收货人' }, + { field: '', width: 180, title: '收货电话' }, + { field: '', width: 180, title: '收获地区' }, + { field: '', width: 200, title: '工厂' }, + { field: '', width: 180, title: '发货库存组织' }, + { field: '', width: 180, title: '发货仓库' }, + { field: '', width: 200, title: '发货条件' }, + { field: '', width: 200, title: '物流组织' }, + { field: '', width: 200, title: '计划交货日期' }, + { field: '', width: 200, title: '客户要求交货日期' }, + { field: '', width: 200, title: '货位' }, + { field: '', width: 180, title: '允许不足交货' }, + { field: '', width: 180, title: '不足交货容差(%)' }, + { field: '', width: 180, title: '允许超量交货' }, + { field: '', width: 180, title: '超量交货容差(%)' }, + { field: '', width: 180, title: '交货相关' }, + { field: '', width: 180, title: '补货相关' } + ]; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.spec.ts index 6ed5a989af4eae9dbf52593631d8fb363cf6dc37..047e0c14ca14087131af1d99b5029c867f98b563 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { MasterSlaveTmplComponent } from './master-slave-tmpl.component'; describe('MasterSlaveTmplComponent', () => { - let component: MasterSlaveTmplComponent; - let fixture: ComponentFixture; + let component: MasterSlaveTmplComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ MasterSlaveTmplComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MasterSlaveTmplComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(MasterSlaveTmplComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(MasterSlaveTmplComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.ts index bc064463a0acc503b18569ca42f0ededdb18d65c..7bd78e354f46219757124e9d980a7db5708c2565 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/master-slave-tmpl/master-slave-tmpl.component.ts @@ -1,170 +1,184 @@ +/* eslint-disable no-prototype-builtins */ import { Component, OnInit } from "@angular/core"; import { PageService } from "../service/page.service"; import { BehaviorSubject } from 'rxjs'; @Component({ - selector: "app-master-slave-tmpl", - templateUrl: "./master-slave-tmpl.component.html", - styleUrls: ["./master-slave-tmpl.component.css"] + selector: "app-master-slave-tmpl", + templateUrl: "./master-slave-tmpl.component.html", + styleUrls: ["./master-slave-tmpl.component.css"] }) export class MasterSlaveTmplComponent implements OnInit { - // 主表卡片数据 - mainCardData = null; - subGridColumnA = []; - subGridDataA = []; - subGridDataTotalA = 0; - subGridColumnB = []; - subGridDataB = []; - subGridDataTotalB = 0; - // 子表Tab标签按钮 - subGridToolbarA = { - position: "inHead", - contents: [ - { - id: "a", - disabled: false, - title: "新增", - click: "addRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "b", - disabled: false, - title: "删除", - click: "deleteRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "c", - disabled: false, - title: "更新", - click: "updateRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "d", - disabled: true, - title: "查询", - click: "selectRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: false - } - ] - }; - subGridToolbarB = { - position: "inHead", - contents: [ - { - id: "a", - disabled: false, - title: "新增", - click: "addRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - }, - { - id: "b", - disabled: false, - title: "删除", - click: "deleteRecord", - appearance: { - class: "btn btn-primary f-btn-ml" - }, - visible: true - } - ] - }; - // Tab 处理按钮的禁用状态 - subGridBtnStates = new BehaviorSubject({}); - // 处理下拉 - valObj = { id: '9', text: '中国4' }; - listItemsDropDown = [ - { "id": '1', "text": "中国" }, - { "id": '2', "text": "俄罗斯" }, - { "id": '3', "text": "菲律宾" }, - { "id": '4', "text": "越南" }, - { "id": '5', "text": "老挝" }, - { "id": '6', "text": "中国1" }, - { "id": '7', "text": "中国2" }, - { "id": '8', "text": "中国3" }, - { "id": '9', "text": "中国4" } - ]; - constructor(private orderService: PageService) { - // 卡片取数 - this.orderService.viewCard().subscribe((data: any) => { - if (!data) { - return; - } - this.mainCardData = data; - }); - // 从表一取数 - this.orderService.viewMaterial().subscribe((data: any) => { - this.subGridDataA = data; - this.subGridDataTotalA = this.subGridDataA.length; - }); - } - ngOnInit() { - let stateResults = {}; - [this.subGridToolbarA.contents, this.subGridToolbarB.contents].forEach((item, index) => { - item.forEach((btnInfo) => { - if (!stateResults.hasOwnProperty(btnInfo.id)) { - stateResults[btnInfo.id] = false; - } - }); + // 主表卡片数据 + mainCardData = null; - }); - this.subGridBtnStates.next(stateResults); - // 从表一 列配置 - this.subGridColumnA = [ - { field: 'WLBH', width: 180, title: '物料编号' }, - { field: 'WLMC', width: 180, title: '物料名称' }, - { field: 'WLMS', width: 180, title: '物料描述' }, - { field: 'WLTZ', width: 180, title: '物料特征' }, - { field: 'WLBM', width: 180, title: '物料别名' }, - { field: 'KHBH', width: 200, title: '客户物料编号' }, - { field: 'ZSL', width: 180, title: '主数量' }, - { field: 'ZDW', width: 180, title: '主单位' }, - { field: 'ZHZDJ', width: 200, title: '折前主单价' }, - { field: 'ZDJ', width: 200, title: '主单价' }, - { field: 'FSL', width: 200, title: '辅数量' }, - { field: 'FDW', width: 200, title: '辅单位' }, - { field: 'ZQFDJ', width: 200, title: '折前辅单价' }, - { field: 'FDJ', width: 180, title: '辅单价' } - ]; - // 从表二 列配置 - this.subGridColumnB = [ - { field: '', width: 180, title: '送达方' }, - { field: '', width: 180, title: '送货地址' }, - { field: '', width: 180, title: '收货人' }, - { field: '', width: 180, title: '收货电话' }, - { field: '', width: 180, title: '收获地区' }, - { field: '', width: 200, title: '工厂' }, - { field: '', width: 180, title: '发货库存组织' }, - { field: '', width: 180, title: '发货仓库' }, - { field: '', width: 200, title: '发货条件' }, - { field: '', width: 200, title: '物流组织' }, - { field: '', width: 200, title: '计划交货日期' }, - { field: '', width: 200, title: '客户要求交货日期' }, - { field: '', width: 200, title: '货位' }, - { field: '', width: 180, title: '允许不足交货' }, - { field: '', width: 180, title: '不足交货容差(%)' }, - { field: '', width: 180, title: '允许超量交货' }, - { field: '', width: 180, title: '超量交货容差(%)' }, - { field: '', width: 180, title: '交货相关' }, - { field: '', width: 180, title: '补货相关' } + subGridColumnA = []; + + subGridDataA = []; + + subGridDataTotalA = 0; + + subGridColumnB = []; + + subGridDataB = []; + + subGridDataTotalB = 0; + + // 子表Tab标签按钮 + subGridToolbarA = { + position: "inHead", + contents: [ + { + id: "a", + disabled: false, + title: "新增", + click: "addRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "b", + disabled: false, + title: "删除", + click: "deleteRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "c", + disabled: false, + title: "更新", + click: "updateRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "d", + disabled: true, + title: "查询", + click: "selectRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: false + } + ] + }; + + subGridToolbarB = { + position: "inHead", + contents: [ + { + id: "a", + disabled: false, + title: "新增", + click: "addRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + }, + { + id: "b", + disabled: false, + title: "删除", + click: "deleteRecord", + appearance: { + class: "btn btn-primary f-btn-ml" + }, + visible: true + } + ] + }; + + // Tab 处理按钮的禁用状态 + subGridBtnStates = new BehaviorSubject({}); + + // 处理下拉 + valObj = { id: '9', text: '中国4' }; + + listItemsDropDown = [ + { "id": '1', "text": "中国" }, + { "id": '2', "text": "俄罗斯" }, + { "id": '3', "text": "菲律宾" }, + { "id": '4', "text": "越南" }, + { "id": '5', "text": "老挝" }, + { "id": '6', "text": "中国1" }, + { "id": '7', "text": "中国2" }, + { "id": '8', "text": "中国3" }, + { "id": '9', "text": "中国4" } ]; - } + + constructor(private orderService: PageService) { + // 卡片取数 + this.orderService.viewCard().subscribe((data: any) => { + if (!data) { + return; + } + this.mainCardData = data; + }); + // 从表一取数 + this.orderService.viewMaterial().subscribe((data: any) => { + this.subGridDataA = data; + this.subGridDataTotalA = this.subGridDataA.length; + }); + } + + ngOnInit() { + const stateResults = {}; + [this.subGridToolbarA.contents, this.subGridToolbarB.contents].forEach((item, index) => { + item.forEach((btnInfo) => { + if (!stateResults.hasOwnProperty(btnInfo.id)) { + stateResults[btnInfo.id] = false; + } + }); + + }); + this.subGridBtnStates.next(stateResults); + // 从表一 列配置 + this.subGridColumnA = [ + { field: 'WLBH', width: 180, title: '物料编号' }, + { field: 'WLMC', width: 180, title: '物料名称' }, + { field: 'WLMS', width: 180, title: '物料描述' }, + { field: 'WLTZ', width: 180, title: '物料特征' }, + { field: 'WLBM', width: 180, title: '物料别名' }, + { field: 'KHBH', width: 200, title: '客户物料编号' }, + { field: 'ZSL', width: 180, title: '主数量' }, + { field: 'ZDW', width: 180, title: '主单位' }, + { field: 'ZHZDJ', width: 200, title: '折前主单价' }, + { field: 'ZDJ', width: 200, title: '主单价' }, + { field: 'FSL', width: 200, title: '辅数量' }, + { field: 'FDW', width: 200, title: '辅单位' }, + { field: 'ZQFDJ', width: 200, title: '折前辅单价' }, + { field: 'FDJ', width: 180, title: '辅单价' } + ]; + // 从表二 列配置 + this.subGridColumnB = [ + { field: '', width: 180, title: '送达方' }, + { field: '', width: 180, title: '送货地址' }, + { field: '', width: 180, title: '收货人' }, + { field: '', width: 180, title: '收货电话' }, + { field: '', width: 180, title: '收获地区' }, + { field: '', width: 200, title: '工厂' }, + { field: '', width: 180, title: '发货库存组织' }, + { field: '', width: 180, title: '发货仓库' }, + { field: '', width: 200, title: '发货条件' }, + { field: '', width: 200, title: '物流组织' }, + { field: '', width: 200, title: '计划交货日期' }, + { field: '', width: 200, title: '客户要求交货日期' }, + { field: '', width: 200, title: '货位' }, + { field: '', width: 180, title: '允许不足交货' }, + { field: '', width: 180, title: '不足交货容差(%)' }, + { field: '', width: 180, title: '允许超量交货' }, + { field: '', width: 180, title: '超量交货容差(%)' }, + { field: '', width: 180, title: '交货相关' }, + { field: '', width: 180, title: '补货相关' } + ]; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.spec.ts index a63c4fa7518e481ded841b048ec17cc26f229ef1..a4f79a21019d5f58b9498e4862a206b00ef51fb2 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { PageTmplComponent } from './page-tmpl.component'; describe('PageTmplComponent', () => { - let component: PageTmplComponent; - let fixture: ComponentFixture; + let component: PageTmplComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PageTmplComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PageTmplComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(PageTmplComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(PageTmplComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.ts index d44358bb352b1e512ec76da336705532472c1e88..d1d4232f7134ba2733e2cbb89679d86ef677a781 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/page-tmpl/page-tmpl.component.ts @@ -2,20 +2,21 @@ import { Component, OnInit, Input } from '@angular/core'; import { PageService } from '../service/page.service'; @Component({ - selector: 'app-page-tmpl', - templateUrl: './page-tmpl.component.html', - styleUrls: ['./page-tmpl.component.css'] + selector: 'app-page-tmpl', + templateUrl: './page-tmpl.component.html', + styleUrls: ['./page-tmpl.component.css'] }) export class PageTmplComponent implements OnInit { - // 当前选择标签页 - selectedTabId:string; - constructor(private pgService: PageService) { - this.pgService.getSelectedTabId().subscribe((tabId) => { - this.selectedTabId = tabId; - }); - } + // 当前选择标签页 + selectedTabId: string; - ngOnInit() { - } + constructor(private pgService: PageService) { + this.pgService.getSelectedTabId().subscribe((tabId) => { + this.selectedTabId = tabId; + }); + } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/preview-page.module.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/preview-page.module.ts index edaf097036c608898126f830c39c2c502b59fab3..0e72e8f31ecd11ff38879638e67261c8a1145c03 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/preview-page.module.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/preview-page.module.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule,ReactiveFormsModule } from '@angular/forms'; @@ -30,27 +31,27 @@ import { FrameworkTabsetComponent } from './framework-tabset/framework-tabset.co import { PageTmplComponent } from './page-tmpl/page-tmpl.component'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - FarrisSectionModule, - FDropdownDirectiveTypeModule, - FarrisDatePickerModule, - FarrisTabsModule, - ComboListModule, - FarrisTooltipModule, - LookupModule, - DatagridModule, - SplitterModule, - ListFilterModule, - AngularDraggableModule, - FResponseToolbarModule, - FrameworkContainerModule, - FrameworkTabsModule.forRoot() - ], - declarations: [BulkEditTmplComponent, MasterSlaveTmplComponent, LeftgridRightcardTmplComponent, SchemeComponent, HeaderComponent, FrameworkTabsetComponent, PageTmplComponent], - exports: [FrameworkTabsetComponent,PageTmplComponent], - providers: [PageService] + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + FarrisSectionModule, + FDropdownDirectiveTypeModule, + FarrisDatePickerModule, + FarrisTabsModule, + ComboListModule, + FarrisTooltipModule, + LookupModule, + DatagridModule, + SplitterModule, + ListFilterModule, + AngularDraggableModule, + FResponseToolbarModule, + FrameworkContainerModule, + FrameworkTabsModule.forRoot() + ], + declarations: [BulkEditTmplComponent, MasterSlaveTmplComponent, LeftgridRightcardTmplComponent, SchemeComponent, HeaderComponent, FrameworkTabsetComponent, PageTmplComponent], + exports: [FrameworkTabsetComponent,PageTmplComponent], + providers: [PageService] }) export class PreviewPageModule { } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.spec.ts index 52e3089168d6a25da0d6cc943548db65a7fff676..51190b9f87491149c7333c6ff8d129062260614f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.spec.ts @@ -3,10 +3,10 @@ import { TestBed } from '@angular/core/testing'; import { PageService } from './page.service'; describe('PageService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + beforeEach(() => TestBed.configureTestingModule({})); - it('should be created', () => { - const service: PageService = TestBed.get(PageService); - expect(service).toBeTruthy(); - }); + it('should be created', () => { + const service: PageService = TestBed.get(PageService); + expect(service).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.ts index 314e61be2f6469f271edebcf6a2b035bba6285ec..d51b166bacb0214e635c93651f67e0d32fa4f057 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-page/service/page.service.ts @@ -3,97 +3,105 @@ import { HttpClient } from '@angular/common/http'; import { BehaviorSubject } from 'rxjs'; @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class PageService { - private allTabData = [ - { - active: false, - appPath: "dashboard", - appType: "", - removable: false, - tabId: "defaultpage-dashboard", - title: "首页", - visible: true - }, - { - active: true, - appPath: "bo-xempattachfront", - appType: "menu", - funcId: "bulk-edit-tmpl", - mode: "spa", - removable: true, - tabId: "bulk-edit-tmpl", - title: "批量编辑列表", - visible: true - }, - { - active: false, - appPath: "bo-xempattachfront", - appType: "menu", - funcId: "master-slave-tmpl", - mode: "spa", - removable: true, - tabId: "master-slave-tmpl", - title: "主从表", - visible: true - }, - { - active: false, - appPath: "bo-xempattachfront", - appType: "menu", - funcId: "leftgrid-rightcard-tmpl", - mode: "spa", - removable: true, - tabId: "leftgrid-rightcard-tmpl", - title: "左列右卡", - visible: true + private allTabData = [ + { + active: false, + appPath: "dashboard", + appType: "", + removable: false, + tabId: "defaultpage-dashboard", + title: "首页", + visible: true + }, + { + active: true, + appPath: "bo-xempattachfront", + appType: "menu", + funcId: "bulk-edit-tmpl", + mode: "spa", + removable: true, + tabId: "bulk-edit-tmpl", + title: "批量编辑列表", + visible: true + }, + { + active: false, + appPath: "bo-xempattachfront", + appType: "menu", + funcId: "master-slave-tmpl", + mode: "spa", + removable: true, + tabId: "master-slave-tmpl", + title: "主从表", + visible: true + }, + { + active: false, + appPath: "bo-xempattachfront", + appType: "menu", + funcId: "leftgrid-rightcard-tmpl", + mode: "spa", + removable: true, + tabId: "leftgrid-rightcard-tmpl", + title: "左列右卡", + visible: true + } + ]; + + private data: any; + + // 标记 + private selectedTabIdSubject = new BehaviorSubject('bulk-edit-tmpl'); + + constructor(private http: HttpClient) { } + + // 返回Tab所有列表 + getTabList() { + return this.allTabData; } - ]; - private data: any; - // 标记 - private selectedTabIdSubject = new BehaviorSubject('bulk-edit-tmpl'); - constructor(private http: HttpClient) { } - // 返回Tab所有列表 - getTabList() { - return this.allTabData; - } - // 获取当前选中标签的动态动向 - getSelectedTabId() { - return this.selectedTabIdSubject; - } - // 更新 - updataSelectedTabId(tabId){ - this.selectedTabIdSubject.next(tabId); - } - // 卡片 - viewCard() { - return this.http.get('assets/demo/order-card-view.json'); - } - // 树 - // viewTreeGrid() { - // return this.http.get('assets/demo/order-tree.json'); - // } - // 列表 - viewList() { - return this.http.get('assets/demo/order-list.json'); - } - //物料 - viewMaterial() { - return this.http.get('assets/demo/order-material.json'); - } - // 在线演示 - // viewListOnline() { - // return this.http.get('assets/demo/sales-order-data-online.json'); - // } - // 邮件 - // viewMail() { - // return this.http.get('assets/demo/mail.json'); - // } - // 订单向导中的数据 - // viewWizardList() { - // return this.http.get('assets/demo/order.json'); - // } + // 获取当前选中标签的动态动向 + getSelectedTabId() { + return this.selectedTabIdSubject; + } + + // 更新 + updataSelectedTabId(tabId){ + this.selectedTabIdSubject.next(tabId); + } + + // 卡片 + viewCard() { + return this.http.get('assets/demo/order-card-view.json'); + } + + // 树 + // viewTreeGrid() { + // return this.http.get('assets/demo/order-tree.json'); + // } + // 列表 + viewList() { + return this.http.get('assets/demo/order-list.json'); + } + + // 物料 + viewMaterial() { + return this.http.get('assets/demo/order-material.json'); + } + // 在线演示 + // viewListOnline() { + // return this.http.get('assets/demo/sales-order-data-online.json'); + // } + // 邮件 + // viewMail() { + // return this.http.get('assets/demo/mail.json'); + // } + // 订单向导中的数据 + // viewWizardList() { + // return this.http.get('assets/demo/order.json'); + // } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.spec.ts index 150bd3f7e98ec3d96a03ebee169b84559f2e8e8d..064b9a8ec7b91a9f98758762fd95743a53c6574c 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ButtonWidgetComponent } from './button-widget.component'; describe('ButtonWidgetComponent', () => { - let component: ButtonWidgetComponent; - let fixture: ComponentFixture; + let component: ButtonWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ButtonWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ButtonWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ButtonWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.ts index e0f6f6d5bbb8f88efd2e1e36351df32c38c92536..b64ed56aff38292010bcc2e8591d2d47211c49cd 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/button-widget/button-widget.component.ts @@ -2,40 +2,41 @@ import { Component, OnInit } from '@angular/core'; import { CommonWidgetComponent } from '../common-widget/common-widget.component'; @Component({ - selector: 'app-button-widget', - templateUrl: './button-widget.component.html', - styleUrls: ['./button-widget.component.css'] + selector: 'app-button-widget', + templateUrl: './button-widget.component.html', + styleUrls: ['./button-widget.component.css'] }) export class ButtonWidgetComponent extends CommonWidgetComponent implements OnInit { - widgetTitle = "按钮"; + widgetTitle = "按钮"; - data1 = [ - { - id: 'b1', - text: '增加', - type: 'link' - }, - { - id: 'b2', - text: '删除', - type: 'link' - }, - { - id: 'b3', - text: '保存', - type: 'link' - }, - { - id: 'b4', - text: '编辑', - type: 'link' + data1 = [ + { + id: 'b1', + text: '增加', + type: 'link' + }, + { + id: 'b2', + text: '删除', + type: 'link' + }, + { + id: 'b3', + text: '保存', + type: 'link' + }, + { + id: 'b4', + text: '编辑', + type: 'link' + } + ]; + + constructor() { + super(); } - ]; - constructor() { - super(); - } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.spec.ts index d718caf1ba36ce486d0e07e4e3d454c42672a902..718c0a8690fd0616f7c5f4f33e3836e858481d6d 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CommonWidgetComponent } from './common-widget.component'; describe('CommonWidgetComponent', () => { - let component: CommonWidgetComponent; - let fixture: ComponentFixture; + let component: CommonWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ CommonWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CommonWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(CommonWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(CommonWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.ts index a379ce905e9e70f99f22063a5b78b786465e1de5..f7ec591bf72b950b510b24d08a2f55094fee2d7a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/common-widget/common-widget.component.ts @@ -1,16 +1,18 @@ import { Component, OnInit, HostBinding } from '@angular/core'; @Component({ - selector: 'app-common-widget', - templateUrl: './common-widget.component.html', - styleUrls: ['./common-widget.component.css'] + selector: 'app-common-widget', + templateUrl: './common-widget.component.html', + styleUrls: ['./common-widget.component.css'] }) export class CommonWidgetComponent implements OnInit { - @HostBinding("class.col-12") cls1=true; - @HostBinding("class.col-lg-6") cls2=true; - constructor() { } + @HostBinding("class.col-12") cls1=true; - ngOnInit() { - } + @HostBinding("class.col-lg-6") cls2=true; + + constructor() { } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.spec.ts index ba0e7a98773fe93727074813f91dad5938c3627d..4d2b9b28ad203afee200f42c81fe593fbb45937d 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { IndexWidgetComponent } from './index-widget.component'; describe('IndexWidgetComponent', () => { - let component: IndexWidgetComponent; - let fixture: ComponentFixture; + let component: IndexWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ IndexWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ IndexWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(IndexWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(IndexWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.ts index 810ae37e88c71e4c27f54c6656c2c037e3647a6c..68b2af4e7a6eef38d256089263f151874c673149 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/index-widget/index-widget.component.ts @@ -2,108 +2,115 @@ import { Component, AfterViewInit, HostBinding } from '@angular/core'; import { Router } from '@angular/router'; @Component({ - selector: 'app-index-widget', - templateUrl: './index-widget.component.html', - styleUrls: ['./index-widget.component.css'] + selector: 'app-index-widget', + templateUrl: './index-widget.component.html', + styleUrls: ['./index-widget.component.css'] }) export class IndexWidgetComponent implements AfterViewInit { - @HostBinding('class.preview-widget-layout') cls=true; + @HostBinding('class.preview-widget-layout') cls = true; + isStylesReady = false; + themeName: string; + themeSize: string; - //widgetName: string; + + // widgetName: string; colorTheme: string; // typographyClass: string; - + constructor(private router: Router) { - const THEME_POSITION = 2; - const COLOR_THEME_POSITION = 3; - //url:/preview-page/farris/green-default - const urlParts = this.router.url.split('/'); - this.themeName = urlParts[THEME_POSITION]; - let tColorTheme = urlParts[COLOR_THEME_POSITION].split('-'); - if (tColorTheme.length > 1) { - this.colorTheme = tColorTheme[0]; - this.themeSize = tColorTheme[1]; - } else { - this.colorTheme = tColorTheme[0]; - this.themeSize = 'default'; - } + const THEME_POSITION = 2; + const COLOR_THEME_POSITION = 3; + // url:/preview-page/farris/green-default + const urlParts = this.router.url.split('/'); + this.themeName = urlParts[THEME_POSITION]; + const tColorTheme = urlParts[COLOR_THEME_POSITION].split('-'); + if (tColorTheme.length > 1) { + this.colorTheme = tColorTheme[0]; + this.themeSize = tColorTheme[1]; + } else { + this.colorTheme = tColorTheme[0]; + this.themeSize = 'default'; + } } - + receiveMessage(e: any): void { - if (e.data && e.data['name']) { - this.addHeadStyles(e.data.css); - this.themeSize = e.data.themeSize; - } - // if (e.data.widget) { - // this.widgetName = e.data.widget; - // } + if (e.data && e.data.name) { + this.addHeadStyles(e.data.css); + this.themeSize = e.data.themeSize; + } + // if (e.data.widget) { + // this.widgetName = e.data.widget; + // } } + /** - * 追加通过变量生成的样式 - * - * @param css - */ + * 追加通过变量生成的样式 + * + * @param css + */ addHeadStyles(css: string): void { - const head = document.getElementsByTagName('head')[0]; - const style = document.createElement('style'); - const DYNAMIC_STYLES_ID = 'dynamic-styles'; - - const dynamicStylesElement = document.getElementById(DYNAMIC_STYLES_ID); - - if (dynamicStylesElement) { - dynamicStylesElement.parentNode.removeChild(dynamicStylesElement); - } - if(css){ - style.type = 'text/css'; - style.id = DYNAMIC_STYLES_ID; - - // css = css - // .replace(/icons\/dxicons/gi, 'content/css/icons/dxicons') - // .replace(/fonts\/Roboto/gi, 'content/css/fonts/Roboto'); - - style.appendChild(document.createTextNode(css)); - head.appendChild(style); - // 当样式已经加载成功 - this.isStylesReady = true; - } + const head = document.getElementsByTagName('head')[0]; + const style = document.createElement('style'); + const DYNAMIC_STYLES_ID = 'dynamic-styles'; + + const dynamicStylesElement = document.getElementById(DYNAMIC_STYLES_ID); + + if (dynamicStylesElement) { + dynamicStylesElement.parentNode.removeChild(dynamicStylesElement); + } + if (css) { + style.type = 'text/css'; + style.id = DYNAMIC_STYLES_ID; + + // css = css + // .replace(/icons\/dxicons/gi, 'content/css/icons/dxicons') + // .replace(/fonts\/Roboto/gi, 'content/css/fonts/Roboto'); + + style.appendChild(document.createTextNode(css)); + head.appendChild(style); + // 当样式已经加载成功 + this.isStylesReady = true; + } } + private insterAfter(newElement, targetElement) { - var parent = targetElement.parentNode; - if (parent.lastChild == targetElement) { - parent.appendChild(newElement); - } - else { - parent.insertBefore(newElement, targetElement.nextSibling); - } + const parent = targetElement.parentNode; + if (parent.lastChild === targetElement) { + parent.appendChild(newElement); + } + else { + parent.insertBefore(newElement, targetElement.nextSibling); + } } + /** - * 添加link比追加css方式节省性能 - */ - private addHeadLinks():void{ - if(this.colorTheme!='default'||this.themeSize!='default'){ - const head = document.getElementsByTagName('head')[0]; - const linkEl = document.createElement('link'); - const DYNAMIC_LINKS_ID = 'dynamic-links'; - // 应该不存在这种场景 - const dynamicLinksElement = document.getElementById(DYNAMIC_LINKS_ID); - if (dynamicLinksElement) { - dynamicLinksElement.parentNode.removeChild(dynamicLinksElement); + * 添加link比追加css方式节省性能 + */ + private addHeadLinks(): void { + if (this.colorTheme !== 'default' || this.themeSize !== 'default') { + const head = document.getElementsByTagName('head')[0]; + const linkEl = document.createElement('link'); + const DYNAMIC_LINKS_ID = 'dynamic-links'; + // 应该不存在这种场景 + const dynamicLinksElement = document.getElementById(DYNAMIC_LINKS_ID); + if (dynamicLinksElement) { + dynamicLinksElement.parentNode.removeChild(dynamicLinksElement); + } + linkEl.rel = 'stylesheet'; + linkEl.id = DYNAMIC_LINKS_ID; + linkEl.href = "assets/themes/" + this.colorTheme + "/" + this.themeSize + "/farris-all.css"; + this.insterAfter(linkEl, head.querySelector('#farrisThemeLink')); } - linkEl.rel = 'stylesheet'; - linkEl.id = DYNAMIC_LINKS_ID ; - linkEl.href="assets/themes/" + this.colorTheme + "/" + this.themeSize + "/farris-all.css"; - this.insterAfter(linkEl, head.querySelector('#farrisThemeLink')); - } } - + ngAfterViewInit(): void { - this.addHeadLinks(); - const messageListener = this.receiveMessage.bind(this); - window.removeEventListener('message', messageListener); - window.addEventListener('message', messageListener, false); - window.parent.postMessage({ hideLoading: true }, window.parent.location.href); + this.addHeadLinks(); + const messageListener = this.receiveMessage.bind(this); + window.removeEventListener('message', messageListener); + window.addEventListener('message', messageListener, false); + window.parent.postMessage({ hideLoading: true }, window.parent.location.href); } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/preview-widget.module.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/preview-widget.module.ts index a958795aa96027d7227e6dce5201723bceaf08bd..111e7ec69191b8815c18c392acb362656a078ff7 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/preview-widget.module.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/preview-widget.module.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-len */ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FarrisButtonModule } from '@farris/ui-button'; @@ -15,14 +16,14 @@ import { SimpleFilterWidgetComponent } from './simple-filter-widget/simple-filte import { ProgressWidgetComponent } from './progress-widget/progress-widget.component'; @NgModule({ - declarations: [IndexWidgetComponent, ButtonWidgetComponent, WidgetViewerComponent, CommonWidgetComponent, ProgressStepsWidgetComponent, SimpleFilterWidgetComponent, ProgressWidgetComponent], - imports: [ - CommonModule, - FarrisButtonModule, - ProgressStepModule, - FilterPanelModule, - SimpleFilterModule, - ProgressModule - ] + declarations: [IndexWidgetComponent, ButtonWidgetComponent, WidgetViewerComponent, CommonWidgetComponent, ProgressStepsWidgetComponent, SimpleFilterWidgetComponent, ProgressWidgetComponent], + imports: [ + CommonModule, + FarrisButtonModule, + ProgressStepModule, + FilterPanelModule, + SimpleFilterModule, + ProgressModule + ] }) export class PreviewWidgetModule { } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.spec.ts index 187fd08c8a530a7637ce51c60d1f6439bbd698a7..825eba39119a46e3c7506d4d373377faba5a7aed 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ProgressStepsWidgetComponent } from './progress-steps-widget.component'; describe('ProgressStepsWidgetComponent', () => { - let component: ProgressStepsWidgetComponent; - let fixture: ComponentFixture; + let component: ProgressStepsWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ProgressStepsWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ProgressStepsWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ProgressStepsWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ProgressStepsWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.ts index d582fb3c628d318a3d8ac9d9045ec14d4eb5c640..14410ffd94d2feccc5d4ba10779471f10d0460d0 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-steps-widget/progress-steps-widget.component.ts @@ -2,60 +2,60 @@ import { Component, OnInit } from '@angular/core'; import { CommonWidgetComponent } from '../common-widget/common-widget.component'; @Component({ - selector: 'app-progress-steps-widget', - templateUrl: './progress-steps-widget.component.html', - styleUrls: ['./progress-steps-widget.component.css'] + selector: 'app-progress-steps-widget', + templateUrl: './progress-steps-widget.component.html', + styleUrls: ['./progress-steps-widget.component.css'] }) export class ProgressStepsWidgetComponent extends CommonWidgetComponent implements OnInit { - widgetTitle = "步骤条"; + widgetTitle = "步骤条"; - progressData = { - "activeIndex": 3, - "stepMessages": [ - { - "id": "1", - "title": "审批中", - "description": "正在审批", - "state": "success" - }, - { - "id": "2", - "title": "待复核", - "description": "等待复核", - "hidden": true - }, - { - "id": "3", - "title": "允许发送银行", - "description": "允许发送银行的描述文字" - }, - { - "id": "4", - "title": "网银发送待确认", - "description": "网银发送待确认描述文字" - }, - { - "id": "5", - "title": "等待发送银行", - "description": "等待发送银行描述文字" - }, - { - "id": "6", - "title": "银行正在处理", - "description": "银行正在处理描述文字" - }, { - "id": "7", - "title": "银行付款成功", - "description": "银行付款成功描述文字" - } - ] - }; - - constructor() { - super(); - } + progressData = { + "activeIndex": 3, + "stepMessages": [ + { + "id": "1", + "title": "审批中", + "description": "正在审批", + "state": "success" + }, + { + "id": "2", + "title": "待复核", + "description": "等待复核", + "hidden": true + }, + { + "id": "3", + "title": "允许发送银行", + "description": "允许发送银行的描述文字" + }, + { + "id": "4", + "title": "网银发送待确认", + "description": "网银发送待确认描述文字" + }, + { + "id": "5", + "title": "等待发送银行", + "description": "等待发送银行描述文字" + }, + { + "id": "6", + "title": "银行正在处理", + "description": "银行正在处理描述文字" + }, { + "id": "7", + "title": "银行付款成功", + "description": "银行付款成功描述文字" + } + ] + }; - ngOnInit() { - } + constructor() { + super(); + } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.spec.ts index c292213e3e77af600333cd3b2d92b9f5b924455a..cdeba58266558110f9284f55f04672404b4e666b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ProgressWidgetComponent } from './progress-widget.component'; describe('ProgressWidgetComponent', () => { - let component: ProgressWidgetComponent; - let fixture: ComponentFixture; + let component: ProgressWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ProgressWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ProgressWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(ProgressWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ProgressWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.ts index 668da13e4ddd123b799c8d54b6ac8fdcbfec5475..070ef1ff0902e87ad45f6a4c503620fedbd399f5 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/progress-widget/progress-widget.component.ts @@ -2,17 +2,18 @@ import { Component, OnInit } from '@angular/core'; import { CommonWidgetComponent } from '../common-widget/common-widget.component'; @Component({ - selector: 'app-progress-widget', - templateUrl: './progress-widget.component.html', - styleUrls: ['./progress-widget.component.css'] + selector: 'app-progress-widget', + templateUrl: './progress-widget.component.html', + styleUrls: ['./progress-widget.component.css'] }) export class ProgressWidgetComponent extends CommonWidgetComponent implements OnInit { - widgetTitle = "进度条"; - constructor() { - super(); - } + widgetTitle = "进度条"; - ngOnInit() { - } + constructor() { + super(); + } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.spec.ts index c31225c3a727375c246667e5e81ea6ad90e03940..651a020e134a5782da0ff2d2d19982c5b7dc8e28 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { SimpleFilterWidgetComponent } from './simple-filter-widget.component'; describe('SimpleFilterWidgetComponent', () => { - let component: SimpleFilterWidgetComponent; - let fixture: ComponentFixture; + let component: SimpleFilterWidgetComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SimpleFilterWidgetComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SimpleFilterWidgetComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(SimpleFilterWidgetComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(SimpleFilterWidgetComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.ts index 035fb80d9f13bb0b6436e91c74bd5c7c39e3a7b0..4a7606c30fdabfc455c3392a9abaca0fefcca6fc 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/simple-filter-widget/simple-filter-widget.component.ts @@ -1,273 +1,277 @@ import { Component, OnInit } from '@angular/core'; import { CommonWidgetComponent } from '../common-widget/common-widget.component'; + @Component({ - selector: 'app-simple-filter-widget', - templateUrl: './simple-filter-widget.component.html', - styleUrls: ['./simple-filter-widget.component.css'] + selector: 'app-simple-filter-widget', + templateUrl: './simple-filter-widget.component.html', + styleUrls: ['./simple-filter-widget.component.css'] }) -export class SimpleFilterWidgetComponent extends CommonWidgetComponent implements OnInit { - widgetTitle = "简单筛选"; - // 前置任务列表 - preTaskList = [ - { - "id": "text", - "labelCode": "text", - "code": "text", - "name": "用户编号", - "control": { - "controltype": "text", - "placeholder": "请输入用户编号", - // "required": true - } - }, - { - "id": "text1", - "labelCode": "text1", - "code": "text1", - "name": "用户姓名", - "control": { - "controltype": "text", - "placeholder": "请输入用户姓名", - // "required": true - } - } - ]; - // 任务 - listFilterData=[ - { - "id": "text1", - "labelCode": "text1", - "code": "text1", - "name": "文本", - "control": { - "controltype": "text", - }, - "placeHolder": "请输入" - }, - { - "id": "8df4bbdf-b1e2-4a26-befe-feb837f13aa9", - "labelCode": "boolcheckbox", - "code": "boolcheckbox", - "name": "是否支持", - "control": { - "controltype": "bool-check", - "isExtend": false, - //"required": true, +export class SimpleFilterWidgetComponent extends CommonWidgetComponent implements OnInit { + widgetTitle = "简单筛选"; + + // 前置任务列表 + preTaskList = [ + { + "id": "text", + "labelCode": "text", + "code": "text", + "name": "用户编号", + "control": { + "controltype": "text", + "placeholder": "请输入用户编号", + // "required": true + } }, - "value":{ - "value":[false] + { + "id": "text1", + "labelCode": "text1", + "code": "text1", + "name": "用户姓名", + "control": { + "controltype": "text", + "placeholder": "请输入用户姓名", + // "required": true + } } - }, - { - "id": "flexibleDate", - "labelCode": "flexibleDate", - "code": "flexibleDate", - "name": "可变日期", - "control": { - "controltype": "flexibleDate", - "single": false, - //"showType": 3, - "format": "yyyy年MM月dd日", - // "isExtend": true, - // "required": true - //"showTime": true + ]; + + // 任务 + listFilterData = [ + { + "id": "text1", + "labelCode": "text1", + "code": "text1", + "name": "文本", + "control": { + "controltype": "text", + }, + "placeHolder": "请输入" }, - "value":{ - "value": "2021-08-19", - "startValue": "2020-08-13", - "endValue": "2020-08-17" + { + "id": "8df4bbdf-b1e2-4a26-befe-feb837f13aa9", + "labelCode": "boolcheckbox", + "code": "boolcheckbox", + "name": "是否支持", + "control": { + "controltype": "bool-check", + "isExtend": false, + // "required": true, + }, + "value": { + "value": [false] + } }, - "placeHolder": "请输入", - "beginPlaceHolder": '起始日期1', - "endPlaceHolder": "结束日期1" - }, - { - "id": "flexibleNumber", - "labelCode": "flexibleNumber", - "code": "flexibleNumber", - "name": "可变数值", - "control": { - "controltype": "flexibleNumber", - "bigNumber": false, - "single": false, - "isExtend": true, - // "required": true + { + "id": "flexibleDate", + "labelCode": "flexibleDate", + "code": "flexibleDate", + "name": "可变日期", + "control": { + "controltype": "flexibleDate", + "single": false, + // "showType": 3, + "format": "yyyy年MM月dd日", + // "isExtend": true, + // "required": true + // "showTime": true + }, + "value": { + "value": "2021-08-19", + "startValue": "2020-08-13", + "endValue": "2020-08-17" + }, + "placeHolder": "请输入", + "beginPlaceHolder": '起始日期1', + "endPlaceHolder": "结束日期1" }, - // "value":{ - // "value": 20, - // "startValue": 11, - // "endValue": 123 - // }, - "placeHolder": "请输入", - "beginPlaceHolder": '起始数值', - "endPlaceHolder": "结束数值" - }, - { - "id": "1111", - "labelCode": "radio", - "name": "种类", - "control": { - "controltype": "radio", - "enumValues": [ - { - "value": "aa", - "name": "足球" - }, - { - "value": "bb", - "name": "篮球" - }, - { - "value": "cc", - "name": "乒乓球" - }, - { - "value": "dd", - "name": "其他" - } - ], - "isExtend": true + { + "id": "flexibleNumber", + "labelCode": "flexibleNumber", + "code": "flexibleNumber", + "name": "可变数值", + "control": { + "controltype": "flexibleNumber", + "bigNumber": false, + "single": false, + "isExtend": true, + // "required": true + }, + // "value":{ + // "value": 20, + // "startValue": 11, + // "endValue": 123 + // }, + "placeHolder": "请输入", + "beginPlaceHolder": '起始数值', + "endPlaceHolder": "结束数值" }, - // "value": { - // "value": "bb" - // }, - }, - { - "id": "1", - "labelCode": "search", - "code": "search", - "name": "搜索条", - "control": { - "controltype": "search", - "isExtend": true + { + "id": "1111", + "labelCode": "radio", + "name": "种类", + "control": { + "controltype": "radio", + "enumValues": [ + { + "value": "aa", + "name": "足球" + }, + { + "value": "bb", + "name": "篮球" + }, + { + "value": "cc", + "name": "乒乓球" + }, + { + "value": "dd", + "name": "其他" + } + ], + "isExtend": true + }, + // "value": { + // "value": "bb" + // }, }, - //"value": {"value":"搜索结果"}, - "placeHolder": '111' - }, - { - "id": "dropdown001", - "labelCode": "dropdown", - "code": "dropdown1", - "name": "下拉选择", - "control": { - "controltype": "dropdown", - // "placeholder": "请选择", - "enumValues": [ - { - "value": "yx", - "name": "有效" - }, - { - "value": "wx", - "name": "无效" - } - ], - "isExtend": true - // "required": true + { + "id": "1", + "labelCode": "search", + "code": "search", + "name": "搜索条", + "control": { + "controltype": "search", + "isExtend": true + }, + // "value": {"value":"搜索结果"}, + "placeHolder": '111' }, - "placeHolder": '请选择' - // "value": "yx" - }, - { - "id": "singledate", - "labelCode": "singledate", - "code": "singledate", - "name": "日期", - "control": { - "controltype": "singleDate", - //"placeholder": "请选择日期", - "format": "yyyy年MM月dd日", - "isExtend": true - // "required": true + { + "id": "dropdown001", + "labelCode": "dropdown", + "code": "dropdown1", + "name": "下拉选择", + "control": { + "controltype": "dropdown", + // "placeholder": "请选择", + "enumValues": [ + { + "value": "yx", + "name": "有效" + }, + { + "value": "wx", + "name": "无效" + } + ], + "isExtend": true + // "required": true + }, + "placeHolder": '请选择' + // "value": "yx" }, - "placeHolder": '444' - // "value":"2020-07-02" - }, - { - "id": "date", - "labelCode": "date", - "code": "date", - "name": "日期范围区间", - "control": { - "controltype": "date", - //"placeholder": "请选择日期范围", - "isExtend": true, - "format": "yyyy年MM月dd日" - // "required": true - // "required": true + { + "id": "singledate", + "labelCode": "singledate", + "code": "singledate", + "name": "日期", + "control": { + "controltype": "singleDate", + // "placeholder": "请选择日期", + "format": "yyyy年MM月dd日", + "isExtend": true + // "required": true + }, + "placeHolder": '444' + // "value":"2020-07-02" }, - "beginPlaceHolder": '起始日期', - "endPlaceHolder": "结束日期", - // "placeHolder":'555' - "value": { - "startTime": '2020-08-13', - "endTime": '2020-08-17' - } - }, - { - "id": "datetime", - "labelCode": "datetime", - "code": "datetime", - "name": "日期时间范围", - "control": { - "controltype": "datetime", - //"placeholder": "请选择日期范围和时间", - // "format": "yyyy年MM月dd日 HH:mm:ss", - // "required": true - // "required": true + { + "id": "date", + "labelCode": "date", + "code": "date", + "name": "日期范围区间", + "control": { + "controltype": "date", + // "placeholder": "请选择日期范围", + "isExtend": true, + "format": "yyyy年MM月dd日" + // "required": true + // "required": true + }, + "beginPlaceHolder": '起始日期', + "endPlaceHolder": "结束日期", + // "placeHolder":'555' + "value": { + "startTime": '2020-08-13', + "endTime": '2020-08-17' + } }, - "beginPlaceHolder": '起始日期时间', - "endPlaceHolder": "结束日期时间", - // "placeHolder":'666' - "value":{ - "startTime": "2020-07-01 15:00:00", - "endTime": "2020-07-02 15:00:00" - } - }, - { - "id": "number", - "labelCode": "number", - "code": "number2", - "name": "数字", - "control": { - "controltype": "number", - //"placeholder": "请输入", - "precision": 0, - "isExtend": true - // "required": true + { + "id": "datetime", + "labelCode": "datetime", + "code": "datetime", + "name": "日期时间范围", + "control": { + "controltype": "datetime", + // "placeholder": "请选择日期范围和时间", + // "format": "yyyy年MM月dd日 HH:mm:ss", + // "required": true + // "required": true + }, + "beginPlaceHolder": '起始日期时间', + "endPlaceHolder": "结束日期时间", + // "placeHolder":'666' + "value": { + "startTime": "2020-07-01 15:00:00", + "endTime": "2020-07-02 15:00:00" + } }, - "beginPlaceHolder": "开始数值", - "endPlaceHolder": "结束数值", - // "placeHolder":'777' - // "value": { - // "startValue": 20, - // "endValue": 30 - // } - }, - { - "id": "checkboxGroup", - "labelCode": "checkboxGroup", - "code": "checkboxGroup", - "name": "复选组", - "control": { - "controltype": "checkboxgroup", - "enumValues": [ - { "value": "aa", "name": "标签一" }, - { "value": "bb", "name": "标签二" }, - { "value": "cc", "name": "标签三" }, - { "value": "dd", "name": "标签四" } - ], - "isExtend": true + { + "id": "number", + "labelCode": "number", + "code": "number2", + "name": "数字", + "control": { + "controltype": "number", + // "placeholder": "请输入", + "precision": 0, + "isExtend": true + // "required": true + }, + "beginPlaceHolder": "开始数值", + "endPlaceHolder": "结束数值", + // "placeHolder":'777' + // "value": { + // "startValue": 20, + // "endValue": 30 + // } }, - // "placeHolder":'888' - // "value": ['aa','cc'] + { + "id": "checkboxGroup", + "labelCode": "checkboxGroup", + "code": "checkboxGroup", + "name": "复选组", + "control": { + "controltype": "checkboxgroup", + "enumValues": [ + { "value": "aa", "name": "标签一" }, + { "value": "bb", "name": "标签二" }, + { "value": "cc", "name": "标签三" }, + { "value": "dd", "name": "标签四" } + ], + "isExtend": true + }, + // "placeHolder":'888' + // "value": ['aa','cc'] + } + ]; + + constructor() { + super(); } -]; - constructor() { - super(); - } - ngOnInit() { - } + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.spec.ts index f8f0408f3681c6985197de90a19acc0035b6e6d2..bdb4a9b9166d7a033f0aee07a8c3bb6fd54a27bb 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.spec.ts @@ -3,23 +3,23 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { WidgetViewerComponent } from './widget-viewer.component'; describe('WidgetViewerComponent', () => { - let component: WidgetViewerComponent; - let fixture: ComponentFixture; + let component: WidgetViewerComponent; + let fixture: ComponentFixture; - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ WidgetViewerComponent ] - }) - .compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WidgetViewerComponent ] + }) + .compileComponents(); + })); - beforeEach(() => { - fixture = TestBed.createComponent(WidgetViewerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(WidgetViewerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.ts index 1080cd585168d13028933d24b8755cb9bfae9bfc..f39f336eb1103058f73fa54899117167d058291a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/preview-widget/widget-viewer/widget-viewer.component.ts @@ -1,16 +1,17 @@ import { Component, OnInit, Input } from '@angular/core'; @Component({ - selector: 'docs-widget-viewer', - templateUrl: './widget-viewer.component.html', - styleUrls: ['./widget-viewer.component.css'] + selector: 'docs-widget-viewer', + templateUrl: './widget-viewer.component.html', + styleUrls: ['./widget-viewer.component.css'] }) export class WidgetViewerComponent implements OnInit { - // 标题 - @Input() title=""; - constructor() { } + // 标题 + @Input() title=""; - ngOnInit() { - } + constructor() { } + + ngOnInit() { + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.spec.ts index 1c8b1a5a1fd827c55d4065dd88a850107412a398..2e7512959dcaadb7c88186d2fd2d76aee9dcd72b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.spec.ts @@ -3,10 +3,10 @@ import { TestBed } from '@angular/core/testing'; import { BuildThemeService } from './build-theme.service'; describe('BuildThemeService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + beforeEach(() => TestBed.configureTestingModule({})); - it('should be created', () => { - const service: BuildThemeService = TestBed.get(BuildThemeService); - expect(service).toBeTruthy(); - }); + it('should be created', () => { + const service: BuildThemeService = TestBed.get(BuildThemeService); + expect(service).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.ts index 68e45893655fc5f7e3c15412f3a0a959a744f89f..cc93893f48da3d9d8d80651af019a54c58751465 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/build-theme.service.ts @@ -6,31 +6,33 @@ import { Theme } from '../models/theme'; import { Metadata } from '../models/metadata'; @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class BuildThemeService { - private url="http://localhost:3000"; + private url="http://localhost:3000"; - constructor(private http: HttpClient) {} + constructor(private http: HttpClient) {} - private build(theme: Theme, config: BuilderConfig): Promise { - // 比如 config.baseTheme='generic.light' - config.baseTheme = theme.name + '.' + theme.colorScheme.replace(/-/g, '.'); - // 根据配置信息,发起请求获取当前主题当前颜色下的具体定义; - // 其中items是修改变量的集合 [{"key":"$base-border-radius","value":"8"}] - const postBuilder: Promise = this.http.post(`${this.url}/buildtheme`, config).toPromise(); - return postBuilder; - } - /** - * + private build(theme: Theme, config: BuilderConfig): Promise { + // 比如 config.baseTheme='generic.light' + config.baseTheme = theme.name + '.' + theme.colorScheme.replace(/-/g, '.'); + // 根据配置信息,发起请求获取当前主题当前颜色下的具体定义; + // 其中items是修改变量的集合 [{"key":"$base-border-radius","value":"8"}] + const postBuilder: Promise = this.http.post(`${this.url}/buildtheme`, config).toPromise(); + return postBuilder; + } + + /** + * * @param theme 比如{colorScheme: "light", name: "generic"} * @param config 比如 {"makeSwatch":false,"items":[],"widgets":[],"noClean":true} */ - buildTheme(theme, config: BuilderConfig): Promise { - return this.build(theme, config); - } - /** + buildTheme(theme, config: BuilderConfig): Promise { + return this.build(theme, config); + } + + /** * 获取元数据信息 * 元数据的返回结构形如 * generic和material两类主题 @@ -44,10 +46,10 @@ export class BuildThemeService { * { * Key:"$base-border-radius-small", * Name:"70. Border radius", 这个70不知道何用 - * Type:"text" + * Type:"text" * } * ], - * material:[结构同generic], + * material:[结构同generic], * themes:[{ * themeId:1, * name:"generic", @@ -66,8 +68,8 @@ export class BuildThemeService { * version:"21.2.3" * } */ - getMetadata(): Promise { - const promise = this.http.get(`${this.url}/metadata`).toPromise() as Promise; - return promise; - } + getMetadata(): Promise { + const promise = this.http.get(`${this.url}/metadata`).toPromise() as Promise; + return promise; + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/import-export.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/import-export.service.spec.ts index 608480f97ebd4f5cef1b56fe405c68fb42307217..e84844726feaaec5d81cae8aabaddb88dad05e47 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/import-export.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/import-export.service.spec.ts @@ -3,10 +3,10 @@ import { TestBed } from '@angular/core/testing'; import { ImportExportService } from './import-export.service'; describe('ImportExportService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + beforeEach(() => TestBed.configureTestingModule({})); - it('should be created', () => { - const service: ImportExportService = TestBed.get(ImportExportService); - expect(service).toBeTruthy(); - }); + it('should be created', () => { + const service: ImportExportService = TestBed.get(ImportExportService); + expect(service).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.spec.ts index b6518ad6038a517cbf5029d82ce0746ba387f93c..6feee8135ccb56723d5432e7da9c691d1e086f6f 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.spec.ts @@ -3,10 +3,10 @@ import { TestBed } from '@angular/core/testing'; import { LoadingService } from './loading.service'; describe('LoadingService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + beforeEach(() => TestBed.configureTestingModule({})); - it('should be created', () => { - const service: LoadingService = TestBed.get(LoadingService); - expect(service).toBeTruthy(); - }); + it('should be created', () => { + const service: LoadingService = TestBed.get(LoadingService); + expect(service).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.ts index e0189a0ca3d35f7a79dfb3438599e1d6da8a5dab..2e120df708043a31056f74d95b7687a8015881a5 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/loading.service.ts @@ -2,25 +2,27 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class LoadingService { - constructor() { } - busy = new BehaviorSubject(false); - stack = []; + constructor() { } - toggle(show: boolean): void { - if(show) this.stack.push(true); - else this.stack.pop(); - this.busy.next(!!this.stack.length); - } + busy = new BehaviorSubject(false); - show(): void { - this.toggle(true); - } + stack = []; - hide(): void { - this.toggle(false); - } + toggle(show: boolean): void { + if (show) this.stack.push(true); + else this.stack.pop(); + this.busy.next(!!this.stack.length); + } + + show(): void { + this.toggle(true); + } + + hide(): void { + this.toggle(false); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/metadata.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/metadata.service.spec.ts index 7e65ba74e897c9b6b59dda1c595e2051476f3c6f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/metadata.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/metadata.service.spec.ts @@ -1,12 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { MetadataService } from './metadata.service'; - -describe('MetadataService', () => { - beforeEach(() => TestBed.configureTestingModule({})); - - it('should be created', () => { - const service: MetadataService = TestBed.get(MetadataService); - expect(service).toBeTruthy(); - }); -}); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.spec.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.spec.ts index fb42a6ab17ac1144c7c17d63b4239b9bba736c0e..604bfae455ecfc6577b8d6a6f3ba877e50edc58b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.spec.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.spec.ts @@ -3,10 +3,10 @@ import { TestBed } from '@angular/core/testing'; import { SearchNameService } from './search-name.service'; describe('SearchNameService', () => { - beforeEach(() => TestBed.configureTestingModule({})); + beforeEach(() => TestBed.configureTestingModule({})); - it('should be created', () => { - const service: SearchNameService = TestBed.get(SearchNameService); - expect(service).toBeTruthy(); - }); + it('should be created', () => { + const service: SearchNameService = TestBed.get(SearchNameService); + expect(service).toBeTruthy(); + }); }); diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.ts index 54257d820b4c8cfa9ee6e58502de44cc2edb9ad2..7c12280e3b6094facb49e318b688adce7737447b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/search-name.service.ts @@ -2,57 +2,63 @@ import { Injectable } from '@angular/core'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { MenuItem } from "../models/left-menu-item"; import { BehaviorSubject } from 'rxjs'; + @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class SearchNameService { - constructor(private sanitizer: DomSanitizer) { } - - // 标记导航数据 - private navDatas = new BehaviorSubject([]); - private filterDatas= new BehaviorSubject([]); - - private ORDER_REGEX = /^(\d+).\s/; - - /** 01. 说明文字 经过转化后变成 =》 说明文字 */ - getRealName(orderedName): string { - return orderedName.replace(this.ORDER_REGEX, ''); - } - /**标黄 */ - getHighlightedForLeftMenuName(orderedName, searchText): SafeHtml { - const text = this.getRealName(orderedName); - if (!searchText) return text; - - const highlightedText = text.replace(new RegExp(`(${searchText})`, 'ig'), '$1'); - - return this.sanitizer.bypassSecurityTrustHtml(highlightedText); - } - /**排序 */ - sortNames(name1, name2): number { - const redix = 10; - return Number.parseInt(name1, redix) - Number.parseInt(name2, redix); - } - - getNavDatas() { - return this.navDatas; - } - /** - * 用于 rapid-settings 传递已归集的变量数据 + constructor(private sanitizer: DomSanitizer) { } + + // 标记导航数据 + private navDatas = new BehaviorSubject([]); + + private filterDatas = new BehaviorSubject([]); + + private ORDER_REGEX = /^(\d+).\s/; + + /** 01. 说明文字 经过转化后变成 =》 说明文字 */ + getRealName(orderedName): string { + return orderedName.replace(this.ORDER_REGEX, ''); + } + + /** 标黄 */ + getHighlightedForLeftMenuName(orderedName, searchText): SafeHtml { + const text = this.getRealName(orderedName); + if (!searchText) return text; + + const highlightedText = text.replace(new RegExp(`(${searchText})`, 'ig'), '$1'); + + return this.sanitizer.bypassSecurityTrustHtml(highlightedText); + } + + /** 排序 */ + sortNames(name1, name2): number { + const redix = 10; + return Number.parseInt(name1, redix) - Number.parseInt(name2, redix); + } + + getNavDatas() { + return this.navDatas; + } + + /** + * 用于 rapid-settings 传递已归集的变量数据 */ - updateNavDatas(datas: MenuItem[]) { - this.navDatas.next(datas); - } - - getFilterDatas(){ - return this.filterDatas; - } - /** + updateNavDatas(datas: MenuItem[]) { + this.navDatas.next(datas); + } + + getFilterDatas() { + return this.filterDatas; + } + + /** * 用于 search-name 传递过滤的数据 - * @param datas + * @param datas */ - updateFilterDatas(datas: MenuItem[]) { - this.filterDatas.next(datas); - } + updateFilterDatas(datas: MenuItem[]) { + this.filterDatas.next(datas); + } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-extend-css.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-extend-css.service.ts index c2e6d76801721a3baeb04f1e58ecdd6c13891bdf..3a90a3bdcc4b767c0a64b69ea689e24205ca1ebb 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-extend-css.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-extend-css.service.ts @@ -7,12 +7,15 @@ import { BehaviorSubject } from 'rxjs'; export class ThemeExtendCSSService { private extendCSS = ''; + constructor() { } + getCSS() { return this.extendCSS; } + updateCSS(cssStr) { this.extendCSS = cssStr; } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-route-change.service.ts b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-route-change.service.ts index baddf6de912e9187bddf0b67a80a27f4ae6da97d..8f649d01aca554ad0fc08122124a646783a83bcb 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-route-change.service.ts +++ b/packages/f-theme-editor/farris-theme-builder-site/src/app/service/theme-route-change.service.ts @@ -3,112 +3,128 @@ import { Theme } from '../models/theme'; import { BehaviorSubject } from 'rxjs'; @Injectable({ - providedIn: 'root' + providedIn: 'root' }) export class ThemeRouteChangeService { - // 当前主题名称 - private themeName = "farris"; - // 当前主题大小 - private themeSize = "default"; - // 当前主题颜色 - private themeColor = "default"; - // 修改的类型 - private viewType = 'preview-page'; - private urlChangeState = new BehaviorSubject(''); - - constructor() { - this.updateFormatUrl(); - } - // 更新主题名称 - updateThemeName(str) { - if (str != this.themeName) { - this.themeName = str; - this.updateFormatUrl(); + // 当前主题名称 + private themeName = "farris"; + + // 当前主题大小 + private themeSize = "default"; + + // 当前主题颜色 + private themeColor = "default"; + + // 修改的类型 + private viewType = 'preview-page'; + + private urlChangeState = new BehaviorSubject(''); + + constructor() { + this.updateFormatUrl(); + } + + // 更新主题名称 + updateThemeName(str) { + if (str !== this.themeName) { + this.themeName = str; + this.updateFormatUrl(); + } } - } - // 获取主题名称 - getThemeName() { - return this.themeName; - } - - //更新主题大小 - updateThemeSize(str) { - if (str != this.themeSize) { - this.themeSize = str; - this.updateFormatUrl(); + + // 获取主题名称 + getThemeName() { + return this.themeName; + } + + // 更新主题大小 + updateThemeSize(str) { + if (str !== this.themeSize) { + this.themeSize = str; + this.updateFormatUrl(); + } } - } - getThemeSize() { - return this.themeSize; - } - updateThemeColor(str) { - if (str != this.themeColor) { - this.themeColor = str; - this.updateFormatUrl(); + + getThemeSize() { + return this.themeSize; } - } - getThemeColor() { - return this.themeColor; - } - // 更新预览类型 - updateViewType(str) { - if (str != this.viewType) { - this.viewType = str; - this.updateFormatUrl(); + + updateThemeColor(str) { + if (str !== this.themeColor) { + this.themeColor = str; + this.updateFormatUrl(); + } + } + + getThemeColor() { + return this.themeColor; } - } - getViewType() { - return this.viewType; - } - // 获取Url更新 - getUrlChange() { - return this.urlChangeState; - } - // 获取默认主题 - getDefaultTheme() { - return { name: this.themeName, colorScheme: this.themeColor + '-' + this.themeSize }; - } - private updateFormatUrl() { - let tUrl = '' + this.themeName + '/' + this.themeColor + '-' + this.themeSize; - this.urlChangeState.next(tUrl); - } - getFormatUrl() { - let tUrl = this.themeName + '/' + this.themeColor + '-' + this.themeSize; - return tUrl; - } - /** + + // 更新预览类型 + updateViewType(str) { + if (str !== this.viewType) { + this.viewType = str; + this.updateFormatUrl(); + } + } + + getViewType() { + return this.viewType; + } + + // 获取Url更新 + getUrlChange() { + return this.urlChangeState; + } + + // 获取默认主题 + getDefaultTheme() { + return { name: this.themeName, colorScheme: this.themeColor + '-' + this.themeSize }; + } + + private updateFormatUrl() { + const tUrl = '' + this.themeName + '/' + this.themeColor + '-' + this.themeSize; + this.urlChangeState.next(tUrl); + } + + getFormatUrl() { + const tUrl = this.themeName + '/' + this.themeColor + '-' + this.themeSize; + return tUrl; + } + + /** * 获取主题配置 */ - getThemSettings(themeType = '') { - let themeSettings = { - "farris": { - "themeColor": [{ - "type": "default", - "color": "default", - "name": "默认主题" - }, { - "type": "green", - "color": "green", - "name": "清新绿" - }, { - "type": "red", - "color": "red", - "name": "中国红" - }], - "themeSize": [{ - "type": "default", - "size": "default", - "name": "紧凑版" - }, { - "type": "loose", - "size": "loose", - "name": "宽松版" - }] - } - }; - if (themeType == '') { - themeType = this.themeName; + getThemSettings(themeType = '') { + const themeSettings = { + "farris": { + "themeColor": [{ + "type": "default", + "color": "default", + "name": "默认主题" + }, { + "type": "green", + "color": "green", + "name": "清新绿" + }, { + "type": "red", + "color": "red", + "name": "中国红" + }], + "themeSize": [{ + "type": "default", + "size": "default", + "name": "紧凑版" + }, { + "type": "loose", + "size": "loose", + "name": "宽松版" + }] + } + }; + if (themeType === '') { + themeType = this.themeName; + } + return themeSettings[themeType]; } - return themeSettings[themeType]; - } } diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/docs/style.css b/packages/f-theme-editor/farris-theme-builder-site/src/assets/docs/style.css index 0260b3ef64c4a24547c836b307b7e7d7c2403aa3..feadd22cad60c5eef9b053e0dff01290b463dbfa 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/docs/style.css +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/docs/style.css @@ -1,6 +1,5 @@ @charset "UTF-8"; -/* You can add global styles to this file, and also import other style files */ .tool-layout { display: flex; flex-direction: row; diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.css b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.css index 5bdbc286a2e42e7f23771554eb6b4d4ca59f124c..8c09940b4f3446935b14abc337739a296d17a3fb 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.css +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.css @@ -1,4 +1,5 @@ @charset "UTF-8"; + /*Tabset */ .g-main { top: 0; @@ -7,30 +8,38 @@ right: 0; left: 0; margin: 0 auto; - font-size: 0.875rem; } + font-size: 0.875rem; +} .font-size-13 { - font-size: 0.8125rem !important; } + font-size: 0.8125rem !important; +} .font-size-14 { - font-size: 0.875rem !important; } + font-size: 0.875rem !important; +} .font-size-normal { - font-size: 1rem !important; } + font-size: 1rem !important; +} .font-size-middle { - font-size: 1.5rem !important; } + font-size: 1.5rem !important; +} .font-size-lg { - font-size: 3rem !important; } + font-size: 3rem !important; +} .flex-auto { flex-grow: 1; flex-shrink: 1; - flex-basis: auto; } + flex-basis: auto; +} .g-pointer { - cursor: pointer; } + cursor: pointer; +} .gw-page-wrapper { overflow: hidden; @@ -40,14 +49,17 @@ bottom: 0; right: 0; display: flex; - flex-direction: column; } + flex-direction: column; +} -.gw-page-header > .row { - overflow: hidden; } +.gw-page-header>.row { + overflow: hidden; +} .wrapper-content { margin: 0; - position: relative; } + position: relative; +} .themestitle { display: inline-block; @@ -55,20 +67,23 @@ text-align: center; font-family: PingFangSC-Light; font-size: 14px; - color: rgba(0, 0, 0, 0.85); } + color: rgba(0, 0, 0, 0.85); +} .themesheader { margin-left: 25px; margin-bottom: 25px; font-family: PingFangSC-Regular; font-size: 16px; - color: rgba(0, 0, 0, 0.85); } + color: rgba(0, 0, 0, 0.85); +} .themesd { display: inline-block; vertical-align: middle; margin-top: -20px; - margin-bottom: 10px; } + margin-bottom: 10px; +} .themesdefault { width: 50px; @@ -76,14 +91,16 @@ border-radius: 5px; cursor: pointer; margin-top: 5px; - position: relative; } + position: relative; +} .themesdefault:hover { width: 50px; height: 50px; border-radius: 5px; cursor: pointer; - margin-top: 5px; } + margin-top: 5px; +} .themesred { width: 50px; @@ -92,7 +109,8 @@ cursor: pointer; margin-top: 5px; background-color: #D9262C; - position: relative; } + position: relative; +} .themesred:hover { width: 50px; @@ -100,7 +118,8 @@ border-radius: 5px; cursor: pointer; margin-top: 5px; - background-color: #DF464B; } + background-color: #DF464B; +} .themesgreen { width: 50px; @@ -109,7 +128,8 @@ cursor: pointer; margin-top: 5px; background-color: #00C0DE; - position: relative; } + position: relative; +} .themesgreen:hover { width: 50px; @@ -117,22 +137,26 @@ border-radius: 5px; cursor: pointer; margin-top: 5px; - background-color: #30CFE8; } + background-color: #30CFE8; +} .themesinimg { padding-left: 17px; padding-top: 19px; - display: flex; } + display: flex; +} .themesoutimg { padding-left: 17px; padding-top: 19px; - display: none; } + display: none; +} .themessize { display: flex; padding-left: 7px; - padding-top: 10px; } + padding-top: 10px; +} .themebanIn { background: #000; @@ -141,7 +165,8 @@ border-radius: 5px; cursor: pointer; opacity: 0.25; - margin-top: -40px; } + margin-top: -40px; +} .themebanOut { background: #000; @@ -151,22 +176,27 @@ cursor: pointer; opacity: 0.25; margin-top: -40px; - display: none; } + display: none; +} .themesizeIn { margin-top: -52px; - position: absolute; } + position: absolute; +} .applicationhome { border-right: 1px solid rgba(255, 255, 255, 0.3) !important; - padding-right: 13px !important; } + padding-right: 13px !important; +} .gw-header--caption { - margin: 0 0 0 20px; } + margin: 0 0 0 20px; +} .gw-header--caption-img { display: block; - max-height: 38px; } + max-height: 38px; +} .collection-10 { display: inline-block; @@ -178,7 +208,8 @@ margin: 2px -5px; line-height: 18px !important; padding: 0 6px !important; - font-family: arial, sans-serif; } + font-family: arial, sans-serif; +} .collection-100 { display: inline-block; @@ -190,7 +221,8 @@ margin: 2px -11px; line-height: 18px !important; padding: 0 6px !important; - font-family: arial, sans-serif; } + font-family: arial, sans-serif; +} .collection-max { display: inline-block; @@ -202,7 +234,8 @@ margin: 2px -13px; line-height: 18px !important; padding: 0 6px !important; - font-family: arial, sans-serif; } + font-family: arial, sans-serif; +} .subcount-info { color: rgba(0, 0, 0, 0.25) !important; @@ -210,7 +243,8 @@ padding: 0 7px; cursor: pointer; display: inline-block; - line-height: 28px !important; } + line-height: 28px !important; +} .subcount-info .label { line-height: 14px; @@ -218,10 +252,12 @@ position: absolute; right: 2px; top: 1px; - font-size: 0.625rem; } + font-size: 0.625rem; +} .subcount-info .material-icons { - display: block; } + display: block; +} #search:-moz-placeholder { font-family: PingFangSC-Regular; @@ -229,7 +265,8 @@ color: rgba(0, 0, 0, 0.25); letter-spacing: 0; line-height: 20px; - align-items: center; } + align-items: center; +} #search::-moz-placeholder { font-family: PingFangSC-Regular; @@ -237,7 +274,8 @@ color: rgba(0, 0, 0, 0.25); letter-spacing: 0; line-height: 20px; - align-items: center; } + align-items: center; +} #search::-webkit-input-placeholder { font-family: PingFangSC-Regular; @@ -245,7 +283,8 @@ color: rgba(0, 0, 0, 0.25); letter-spacing: 0; line-height: 20px; - align-items: center; } + align-items: center; +} /******************************* 登录页面 @@ -257,7 +296,8 @@ app-login-container { left: 0; bottom: 0; right: 0; - overflow: auto; } + overflow: auto; +} .login-logo { width: 26.69rem; @@ -265,7 +305,8 @@ app-login-container { overflow: hidden; margin-right: 4.5rem; background: url(../../../img/login-logo@2x.png) no-repeat 0 0; - background-size: 427px 288px; } + background-size: 427px 288px; +} .login-logo h1 { font-family: PingFangSC, 'Segoe UI', 'microsoft yahei', sans-serif; @@ -273,21 +314,25 @@ app-login-container { line-height: 2.5rem; padding: 9.5rem 0 0 5rem; color: #666560; - margin: 0; } + margin: 0; +} .login-logo .logo-en { - font-size: 1.375rem; } + font-size: 1.375rem; +} .login-section { width: 24.31rem; padding-left: 2.56rem; position: relative; - float: left; } + float: left; +} .login-section h2 { font-size: 1.75rem; color: #333; - margin: 0.25rem 0 1.31rem; } + margin: 0.25rem 0 1.31rem; +} .login-form .custom-select, .login-form .form-control { @@ -297,106 +342,138 @@ app-login-container { border-radius: 0.25rem; padding-top: 0.3125rem; padding-bottom: 0.3125rem; - height: 32px; } + height: 32px; +} .btn-login { background: #24abe9; color: #fff; height: 3.25rem; - font-size: 1rem; } + font-size: 1rem; +} .btn-regist { padding: 1.25rem 0 0; - font-size: 0.875rem; } + font-size: 0.875rem; +} .btn-regist a { border-bottom: 1px solid #24abe9; color: #24abe9; - padding: 0 0 0.125rem; } + padding: 0 0 0.125rem; +} .btn-regist a:hover { - text-decoration: none; } + text-decoration: none; +} .remember-info { - padding: 0 0 0 1.25rem; } + padding: 0 0 0 1.25rem; +} .login-lg { display: inline-block; width: 1.88rem; height: 1.31rem; background: url(../../../img/language@2x.png) no-repeat 0 0; - background-size: 30px auto; } + background-size: 30px auto; +} .lg-en { - background-position: 0 0; } + background-position: 0 0; +} .lg-zh-cn { - background-position: 0 -24px; } + background-position: 0 -24px; +} .login-lg-text { - color: #373d41; } + color: #373d41; +} .auth-form-container { - padding: 6.56rem 0 0; } + padding: 6.56rem 0 0; +} .login-lg-area { position: absolute; top: -5rem; - right: -65%; } + right: -65%; +} .login-lg-dropdown .btn:active, .login-lg-dropdown .btn:focus { - outline: 0; } + outline: 0; +} .login-lg-dropdown .dropdown-menu { right: 0; - left: auto; } + left: auto; +} .login-log-container { - flex-direction: row-reverse !important; } + flex-direction: row-reverse !important; +} @media (max-width: 1200px) { .login-lg-area { - right: 0; } } + right: 0; + } +} @media (max-width: 992px) { .login-logo { - margin: 0 auto; } + margin: 0 auto; + } + .login-section { width: 90%; padding: 0 0 0 10%; - margin: 0 auto; } } + margin: 0 auto; + } +} @media (max-width: 768px) { .login-log-container { - flex-direction: row !important; } } + flex-direction: row !important; + } +} @media (max-width: 576px) { .login-lg-area { right: 0; - top: 0.5rem; } + top: 0.5rem; + } + .auth-form-container { - padding: 1rem 0 0; } + padding: 1rem 0 0; + } + .login-section { padding: 0; float: none; - border-left: none; } } + border-left: none; + } +} /******************************* 导航条 *******************************/ .gw-header-toolbar .material-icons { - font-size: 22px; } + font-size: 22px; +} .gw-header-toolbar .count-info { color: rgba(255, 255, 255, 0.65) !important; position: relative; display: block; padding: 9px 11px; - cursor: pointer; } + cursor: pointer; +} .gw-header-toolbar .count-info:hover { - color: #fff !important; } + color: #fff !important; +} .gw-header-toolbar .count-info .label { line-height: 14px; @@ -404,13 +481,16 @@ app-login-container { position: absolute; right: 2px; top: 1px; - font-size: 0.625rem; } + font-size: 0.625rem; +} .gw-header-toolbar .count-info .material-icons { - display: block; } + display: block; +} .gw-userinfo-menu .leftMenu { - left: -100px !important; } + left: -100px !important; +} .gw-userinfo .user-profile { border: red solid thin; @@ -421,7 +501,8 @@ app-login-container { border: 1px solid #000; margin: 20px; width: 700px; - padding: 10px; } + padding: 10px; +} .gw-userinfo span.title { display: block; @@ -430,23 +511,29 @@ app-login-container { position: relative; top: -20px; text-align: center; - background: #fff; } + background: #fff; +} .gw-header-toolbar .leftMenu a { display: block; - padding: 0; } + padding: 0; +} .gw-page-header-tabscontrol { - display: none; } + display: none; +} .full-width { - width: 100% !important; } + width: 100% !important; +} .scrollbar-x-hidden { - overflow-x: hidden; } + overflow-x: hidden; +} .border-none { - border: 0 !important; } + border: 0 !important; +} /******************************* 点击导航上的搜索按钮,弹出的搜索页 @@ -455,24 +542,31 @@ app-login-container { color: #f5f5f5; padding: 0; z-index: 910; - box-shadow: 0 0 10px 0 rgba(57, 66, 100, 0.1); } - .gw-header .gw-header--exitfullscreen-wrapper { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 12px; - z-index: 900; } - .gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn { - display: block; } - .gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { - display: none; - cursor: pointer !important; - height: 18px; - width: 120px; - margin: 0 auto; - position: relative; - z-index: 2000; } + box-shadow: 0 0 10px 0 rgba(57, 66, 100, 0.1); +} + +.gw-header .gw-header--exitfullscreen-wrapper { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 12px; + z-index: 900; +} + +.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn { + display: block; +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + display: none; + cursor: pointer !important; + height: 18px; + width: 120px; + margin: 0 auto; + position: relative; + z-index: 2000; +} .gw-header--toast { background: #333333; @@ -484,7 +578,8 @@ app-login-container { height: 46px; width: 256px; margin: 46px auto; - display: none; } + display: none; +} .gw-header--toast-show { display: block; @@ -496,34 +591,48 @@ app-login-container { animation-fill-mode: both; position: fixed; left: 50%; - margin-left: -128px; } + margin-left: -128px; +} @-webkit-keyframes exitFullScreenToastFadeInDown { 0% { opacity: 0; - transform: translate3d(0, -100%, 0); } + transform: translate3d(0, -100%, 0); + } + 50% { opacity: 1; - transform: translateZ(0); } + transform: translateZ(0); + } + to { opacity: 0; - transform: translate3d(0, -100%, 0); } } + transform: translate3d(0, -100%, 0); + } +} @keyframes exitFullScreenToastFadeInDown { 0% { opacity: 0; - transform: translate3d(0, -100%, 0); } + transform: translate3d(0, -100%, 0); + } + 50% { opacity: 1; - transform: translateZ(0); } + transform: translateZ(0); + } + to { opacity: 0; - transform: translate3d(0, -100%, 0); } } + transform: translate3d(0, -100%, 0); + } +} .gw-header--wrapper { display: flex; flex-direction: row; - align-items: center; } + align-items: center; +} .gw-header--application-icon-container { position: relative; @@ -531,29 +640,48 @@ app-login-container { height: 40px; color: #fff; text-align: center; - cursor: pointer; } - .gw-header--application-icon-container::after { - position: absolute; - content: ''; - width: 1px; - height: 16px; - right: 0; - top: 50%; - margin-top: -8px; - background-color: rgba(255, 255, 255, 0.3); } - .gw-header--application-icon-container .f-icon { - font-size: 1rem; - line-height: 38px; } - .gw-header--application-icon-container .application-icon-active { - display: none; } - .gw-header--application-icon-container:hover, .gw-header--application-icon-container.f-state-active { - color: #fff; } - .gw-header--application-icon-container:hover::after, .gw-header--application-icon-container.f-state-active::after { - display: none; } - .gw-header--application-icon-container:hover .application-icon-active, .gw-header--application-icon-container.f-state-active .application-icon-active { - display: inline-block; } - .gw-header--application-icon-container:hover .application-icon, .gw-header--application-icon-container.f-state-active .application-icon { - display: none; } + cursor: pointer; +} + +.gw-header--application-icon-container::after { + position: absolute; + content: ''; + width: 1px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; + background-color: rgba(255, 255, 255, 0.3); +} + +.gw-header--application-icon-container .f-icon { + font-size: 1rem; + line-height: 38px; +} + +.gw-header--application-icon-container .application-icon-active { + display: none; +} + +.gw-header--application-icon-container:hover, +.gw-header--application-icon-container.f-state-active { + color: #fff; +} + +.gw-header--application-icon-container:hover::after, +.gw-header--application-icon-container.f-state-active::after { + display: none; +} + +.gw-header--application-icon-container:hover .application-icon-active, +.gw-header--application-icon-container.f-state-active .application-icon-active { + display: inline-block; +} + +.gw-header--application-icon-container:hover .application-icon, +.gw-header--application-icon-container.f-state-active .application-icon { + display: none; +} /* .gw-header-top .custome-search { @@ -766,14 +894,16 @@ app-login-container { }*/ .gw-header-toolbar--list { display: flex; - align-items: center; } + align-items: center; +} .gw-header-toolbar--content { display: block; height: 40px; padding: 0 11px; line-height: 40px; - cursor: pointer; } + cursor: pointer; +} .gw-apps-management-wrapper { background: #fff; @@ -782,11 +912,13 @@ app-login-container { display: flex; flex-direction: column; margin: 0 70px 0 0; - position: relative; } + position: relative; +} .gw-apps-management-wrapper .header { padding: 11px 0 17px 20px; - height: 56px; } + height: 56px; +} .gw-apps-management-wrapper .header .intro { font-weight: 700; @@ -794,14 +926,16 @@ app-login-container { font-size: 18px; color: #333; text-align: left; - display: inline-block; } + display: inline-block; +} .gw-apps-management-wrapper .header .searce { float: right; margin-right: 21px; position: relative; top: 0; - height: 28px; } + height: 28px; +} .gw-apps-management-wrapper .header .searce .searce-img1 { width: 14px; @@ -809,20 +943,24 @@ app-login-container { right: 8px; top: 7px; cursor: pointer; - float: left; } + float: left; +} .gw-apps-management-wrapper .header .searce .setup-img { position: relative; top: -1px; - margin-left: 9px; } + margin-left: 9px; +} -.last-app-group > .app-group { +.last-app-group>.app-group { min-height: calc(100vh - 171px); - margin-bottom: 25px !important; } + margin-bottom: 25px !important; +} .searce .select-show-mode { display: inline-block; - margin: 0 -2px 0 -3px; } + margin: 0 -2px 0 -3px; +} .searce .select-show-mode .show-mode { display: inline-block; @@ -831,67 +969,82 @@ app-login-container { background: #eaeaea; position: relative; top: 8px; - cursor: pointer; } + cursor: pointer; +} .searce .select-show-mode .show-mode img { width: 14px; height: 14px; position: relative; top: 6px; - left: 8px; } + left: 8px; +} .searce .select-show-mode .show-mode .default-img { - display: block; } + display: block; +} .searce .select-show-mode .show-mode .selected-img { - display: none; } + display: none; +} .searce .select-show-mode .magnetic-sticker-mode { border-top-left-radius: 2px; border-bottom-left-radius: 2px; margin-left: 15px; position: relative; - left: 4px; } + left: 4px; +} .searce .select-show-mode .all-app-mode { border-top-right-radius: 2px; border-bottom-right-radius: 2px; position: relative; - left: -4px; } + left: -4px; +} .searce .select-show-mode .show-mode:hover .default-img { - display: none; } + display: none; +} .searce .select-show-mode .show-mode:hover .selected-img { - display: none; } + display: none; +} .searce .select-show-mode .show-mode .hover-img { - display: none; } + display: none; +} .searce .select-show-mode .show-mode:hover .hover-img { - display: block; } + display: block; +} .searce .select-show-mode .show-mode-active .default-img { - display: none; } + display: none; +} .searce .select-show-mode .show-mode-active .selected-img { - display: block; } + display: block; +} .gw-apps-management--tabs-container { display: flex; width: 100%; position: relative; padding: 9px 0 9px 19px; - border-bottom: 1px solid rgba(0, 0, 0, 0.06); } + border-bottom: 1px solid rgba(0, 0, 0, 0.06); +} .gw-apps-management--tabs-container .tabs-container--horizontal { flex-wrap: nowrap; overflow: hidden; margin: 0; - cursor: pointer; } + cursor: pointer; +} .gw-apps-management--tabs-container .tabs-container--horizontal-length { - margin-right: 65px; } + margin-right: 65px; +} .gw-apps-management--tabs-container .tabs-container--item { margin-top: 1px; @@ -908,11 +1061,13 @@ app-login-container { border-radius: 15px; border-radius: 15px; padding: 0 19px; - color: #333333; } + color: #333333; +} .gw-apps-management--tabs-container .tabs-container--item.active { color: #fff; - box-shadow: 0 4px 4px 0 rgba(25, 76, 164, 0.09); } + box-shadow: 0 4px 4px 0 rgba(25, 76, 164, 0.09); +} .jianyin { width: 30px; @@ -921,7 +1076,8 @@ app-login-container { background: linear-gradient(to bottom, #fff, #f6f6f6); position: absolute; right: 52px; - opacity: 0; } + opacity: 0; +} .btn-nav-all-dropdown { flex: none; @@ -929,16 +1085,20 @@ app-login-container { background-color: #f6f6f6; line-height: 1; height: 30px; - padding-top: 2px; } + padding-top: 2px; +} .btn-nav-all-dropdown:focus { - box-shadow: none; } + box-shadow: none; +} .btn-nav-all-dropdown .active { - top: 4px; } + top: 4px; +} .tabs-container--vertical-smallscreen { - height: calc(100vh - 200px) !important; } + height: calc(100vh - 200px) !important; +} .tabs-container--vertical { display: none; @@ -947,85 +1107,111 @@ app-login-container { background: #fff; box-shadow: 0 0 6px 0 rgba(139, 139, 139, 0.27); z-index: 1000; - overflow: auto; } - .tabs-container--vertical::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .tabs-container--vertical::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .tabs-container--vertical::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .tabs-container--vertical.show { - display: flex; - display: flex; - position: absolute; - right: 25px; - top: 51px; } - .tabs-container--vertical .list-group { - flex: auto; } - .tabs-container--vertical .list-group .list-group-item { - border: none; - color: #333; - padding-top: 8px; - padding-bottom: 8px; - cursor: pointer; } - .tabs-container--vertical .list-group .list-group-item::after { - position: absolute; - content: ''; - left: 0; - right: 0; - bottom: 0; - height: 1px; - transform: scaleY(0.0001); - opacity: 0; - transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); } - .tabs-container--vertical .list-group .list-group-item:hover { - background-image: linear-gradient(144deg, #EEF4FF 0%, #F6FCFF 100%); } - .tabs-container--vertical .list-group .list-group-item.active { - background-image: linear-gradient(144deg, #EEF4FF 0%, #F6FCFF 100%); } - .tabs-container--vertical .list-group .list-group-item.active::after { - transform: scaleY(1); - opacity: 1; } - .tabs-container--vertical .list-group .list-group-item:first-child { - border-radius: 0; } - -.down-arrow { - display: inline-block; - position: relative; - width: 28px; - height: 30px; } + overflow: auto; +} -.down-arrow::after { - display: inline-block; - content: " "; - height: 9px; - width: 9px; - border-width: 0 2px 2px 0; - border-color: #999; - border-style: solid; - transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); - transform-origin: center; - transition: transform .3s; - position: absolute; - top: 50%; - right: 10px; - margin-top: -10px; } +.tabs-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.tabs-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.tabs-container--vertical::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.tabs-container--vertical.show { + display: flex; + display: flex; + position: absolute; + right: 25px; + top: 51px; +} + +.tabs-container--vertical .list-group { + flex: auto; +} + +.tabs-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer; +} + +.tabs-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(0.0001); + opacity: 0; + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); +} + +.tabs-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(144deg, #EEF4FF 0%, #F6FCFF 100%); +} + +.tabs-container--vertical .list-group .list-group-item.active { + background-image: linear-gradient(144deg, #EEF4FF 0%, #F6FCFF 100%); +} + +.tabs-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1; +} + +.tabs-container--vertical .list-group .list-group-item:first-child { + border-radius: 0; +} + +.down-arrow { + display: inline-block; + position: relative; + width: 28px; + height: 30px; +} + +.down-arrow::after { + display: inline-block; + content: " "; + height: 9px; + width: 9px; + border-width: 0 2px 2px 0; + border-color: #999; + border-style: solid; + transform: matrix(0.71, 0.71, -0.71, 0.71, 0, 0); + transform-origin: center; + transition: transform .3s; + position: absolute; + top: 50%; + right: 10px; + margin-top: -10px; +} .down-arrow.active::after { transform-origin: center; transform: rotate(-135deg); - transition: transform .3s; } + transition: transform .3s; +} .set-up { cursor: pointer; @@ -1035,35 +1221,45 @@ app-login-container { position: relative; right: 0; top: 15px; - margin-left: 16px; } + margin-left: 16px; +} .set-up .set-up-img { - display: block; } + display: block; +} .set-up .set-up-img-hover { - display: none; } + display: none; +} .set-up .set-up-img-down { - display: none; } + display: none; +} .set-up img { width: 14px; - height: 14px; } + height: 14px; +} .set-up:hover .set-up-img { - display: none; } + display: none; +} .set-up:hover .set-up-img-hover { - display: block; } + display: block; +} .setUpMousedown .set-up-img { - display: none !important; } + display: none !important; +} .setUpMousedown .set-up-img-hover { - display: none !important; } + display: none !important; +} .setUpMousedown .set-up-img-down { - display: block !important; } + display: block !important; +} .searce .searce-input { border: none; @@ -1077,26 +1273,31 @@ app-login-container { position: relative; right: -20px; float: left; - top: 0px; } + top: 0px; +} .searce input::-webkit-input-placeholder { font-size: 12px; color: #999; - text-align: left; } + text-align: left; +} .searce input::-ms-input-placeholder { font-size: 12px; color: #999; - text-align: left; } + text-align: left; +} gsp-list-index { - background-color: #fff; } + background-color: #fff; +} .tips { display: inline-block; width: 0; position: relative; - margin: 0 -2px; } + margin: 0 -2px; +} .tips .tips-content { position: absolute; @@ -1114,43 +1315,54 @@ gsp-list-index { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; - user-select: none; } + user-select: none; +} .tips .magnetic-sticker-mode-tips { - left: -47px; } + left: -47px; +} .tips .list-mode-tips { - left: -51px; } + left: -51px; +} .tips .all-app-mode-tips { - left: -55px; } + left: -55px; +} .select-show-mode:hover .tips-content { - display: block !important; } + display: block !important; +} .international-nav-container .nav a { padding: 0 19px; - margin-right: 2px; } + margin-right: 2px; +} .last-app-group /deep/ .app-group .content { - min-height: calc(100vh - 235px); } + min-height: calc(100vh - 235px); +} .last-app-group .last-app-group-height { - min-height: calc(100vh - 165px); } + min-height: calc(100vh - 165px); +} .search-fra { background: #FFFFFF !important; border: 1px solid #E0E0E0 !important; - border-radius: 4px !important; } + border-radius: 4px !important; +} .search-fra:focus { background: #FFFFFF !important; border: 1px solid rgba(0, 104, 243, 0.3) !important; border: 1px solid #0068F3 !important; - border-radius: 4px !important; } + border-radius: 4px !important; +} input::-webkit-calendar-picker-indicator { - display: none; } + display: none; +} .tabs-container--dropdown { position: absolute; @@ -1160,41 +1372,53 @@ input::-webkit-calendar-picker-indicator { height: 36px; background: #fff; box-shadow: -1px 0 1px 0 rgba(0, 0, 0, 0.12); - cursor: pointer; } - .tabs-container--dropdown .f-icon { - width: 36px; - height: 36px; - line-height: 36px; - text-align: center; - font-size: 18px; - color: rgba(0, 0, 0, 0.5); } - .tabs-container--dropdown.active .f-icon { - transform: rotate(180deg); - transition: transform 0.2s; } + cursor: pointer; +} + +.tabs-container--dropdown .f-icon { + width: 36px; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: rgba(0, 0, 0, 0.5); +} + +.tabs-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform 0.2s; +} .keyApplication1, .keyApplication2, .keyApplication3 { - display: none; } + display: none; +} .module { height: calc(100vh - 246px); - display: none; } + display: none; +} .keyApplication-header-wrapper, .keyApplication { - padding: 0 24px; } + padding: 0 24px; +} .keyApplication-header-wrapper .module-head .module-header--content, .keyApplication .module { - margin-right: 54px; } + margin-right: 54px; +} .keyApplication-header-wrapper .module-head { - flex-shrink: 0; } - .keyApplication-header-wrapper .module-head .module-header--icon { - width: 20px; - height: 20px; - margin-right: 10px; } + flex-shrink: 0; +} + +.keyApplication-header-wrapper .module-head .module-header--icon { + width: 20px; + height: 20px; + margin-right: 10px; +} .keyApplication { display: flex; @@ -1207,314 +1431,410 @@ input::-webkit-calendar-picker-indicator { width: 100%; align-content: flex-start; align-items: flex-start; - overflow: auto; } - .keyApplication .keyApplication::-webkit-scrollbar { - width: 7px !important; - height: 7px !important; - background-color: #8e8e8e; } - .keyApplication .module { - position: relative; - display: flex; - flex-direction: column; - flex-wrap: wrap; - align-content: flex-start; - align-items: flex-start; - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; } - .keyApplication .module .module-title { - position: absolute; - top: -33px; - width: 100%; - height: 31px; - border-bottom: 1px solid #d2deea; - font-size: 16px; - color: #333; } - .keyApplication .group { - width: 200px; - margin-bottom: 5px; - margin-top: 14px; } - .keyApplication .group .group-title { - font-size: 14px; - color: #999; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - display: flex; - align-items: center; - padding-bottom: 14px; } - .keyApplication .group .group-title .group-title--icon-container { - display: flex; - flex-direction: row; - align-items: center; - flex-wrap: nowrap; - width: 18px; - height: 9px; - margin: 0 0.375rem 0 0; - padding-left: 3px; } - .keyApplication .group .group-title .group-title--icon-container .group-title--icon { - display: block; - width: 4px; - height: 10px; - transform: skewX(22deg); - -webkit-transform: skewX(-22deg); - /*兼容-webkit-引擎浏览器*/ - -moz-transform: skewX(-22deg); - /*兼容-moz-引擎浏览器*/ } - .keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { - margin-left: 4px; } - .keyApplication .group .group-title .group-title--text { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - font-size: 14px; - color: rgba(0, 0, 0, 0.65); } - .keyApplication .group .module--list { - padding-left: 0; - margin-bottom: 0; } - .keyApplication .group .module--list .module--list-item { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - list-style: none; - font-size: 14px; - padding: 5px 33px 5px 10px; - margin-right: 24px; - position: relative; - color: rgba(0, 0, 0, 0.85); } - .keyApplication .group .module--list .module--list-item::after { - position: absolute; - content: ""; - left: 0; - right: 0; - bottom: 0; - height: 1px; - opacity: 0; } - .keyApplication .group .module--list .module--list-item:hover { - cursor: pointer; - box-shadow: 0 2px 4px 0 rgba(3, 62, 125, 0.08); } - .keyApplication .group .module--list .module--list-item:hover::after { - opacity: 1; } - .keyApplication .group .module--list .module--list-item:hover .module--list-collect { - display: block; } - .keyApplication .group .module--list .module--list-text { - font-size: 14px; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - cursor: pointer; } - .keyApplication .group .module--list .module--list-collect { - display: none; - position: absolute; - right: 4px; - top: 5px; - width: 20px; - height: 20px; - text-align: center; - cursor: pointer; - color: #FFC43B; } - .keyApplication .group .module--list .module--list-collect .f-icon { - font-size: 15px; - line-height: 20px; } - .keyApplication .group .module--list.f-state-collected .module--list-collect { - display: block; } - .keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before { - content: '\e303'; } - -.keyApplication-active { - display: flex; } + overflow: auto; +} -.keyApplication-background-show-right { - background-image: url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg); - background-position: 97% 92%; - background-repeat: no-repeat; } +.keyApplication .keyApplication::-webkit-scrollbar { + width: 7px !important; + height: 7px !important; + background-color: #8e8e8e; +} -.listview--nav-horizontal { - overflow: hidden; - padding-left: 24px; - padding-right: 24px; - height: 52px; - width: 100%; - background-color: #fff; +.keyApplication .module { position: relative; - top: -8px; - border-bottom: 2px solid #ebebeb; - margin-bottom: 12px; - flex-wrap: nowrap; - display: flex; } - .listview--nav-horizontal .listview--nav-link { - display: inline-block; - height: 14px; - margin-right: 16px; - text-decoration: none; } - .listview--nav-horizontal .listview--nav-link .keyApplicationName { - font-size: 16px; - color: grey; - text-align: center; - padding: 0 17px 0 20px; - height: 40px; - line-height: 40px; - margin-left: 5px; - margin-right: 5px; - position: relative; - top: 11px; - border-top-left-radius: 2px; - white-space: nowrap; } - .listview--nav-horizontal .active .keyApplicationName { - color: #fff; } - .listview--nav-horizontal .active .tab-img { - display: block; } - .listview--nav-horizontal .tab-img { - float: right; - height: 40px; - position: relative; - top: -45px; - left: 3px; - display: none; } - -.imgyinying { - background: url(../../../img/矩形@2x.png); - width: 8px; } - -.out-keyApplication { - overflow: hidden; display: flex; flex-direction: column; + flex-wrap: wrap; + align-content: flex-start; + align-items: flex-start; flex-grow: 1; flex-shrink: 1; - flex-basis: 0; } - .out-keyApplication .module-head { - position: relative; } - .out-keyApplication .module-head .module-header--content { - display: flex; - flex-direction: row; - align-items: center; - padding: 10px 0; - border-bottom: 1px solid #e5e5e5; } - .out-keyApplication .module-head .module-title-img { - display: block; - width: 16px; - height: 16px; - margin-right: 10px; } - .out-keyApplication .module-head .module-title { - width: 200px; - font-size: 15px; - color: rgba(0, 0, 0, 0.85); - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0; } + flex-basis: 0; +} -.international-nav .nav-a .keyApplicationName { - font-size: 14px; - padding: 0 18px 0 20px; } +.keyApplication .module .module-title { + position: absolute; + top: -33px; + width: 100%; + height: 31px; + border-bottom: 1px solid #d2deea; + font-size: 16px; + color: #333; +} -.international-content .keyApplication .module-head .module-title { +.keyApplication .group { + width: 200px; + margin-bottom: 5px; + margin-top: 14px; +} + +.keyApplication .group .group-title { font-size: 14px; - position: relative; - top: 2px; - max-width: 240px; + color: #999; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; } + white-space: nowrap; + display: flex; + align-items: center; + padding-bottom: 14px; +} -.international-content .keyApplication .group { - width: auto; - padding-right: 10px; } - .international-content .keyApplication .group .group-title { - max-width: 240px; } +.keyApplication .group .group-title .group-title--icon-container { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + width: 18px; + height: 9px; + margin: 0 0.375rem 0 0; + padding-left: 3px; +} -.international-content .keyApplication .module .module--list-item { - font-size: 12px; - max-width: 240px; +.keyApplication .group .group-title .group-title--icon-container .group-title--icon { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + /*兼容-webkit-引擎浏览器*/ + -moz-transform: skewX(-22deg); + /*兼容-moz-引擎浏览器*/ +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + margin-left: 4px; +} + +.keyApplication .group .group-title .group-title--text { + white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; } + font-size: 14px; + color: rgba(0, 0, 0, 0.65); +} -.listview--nav-container { - display: flex; - width: 100%; - position: relative; - padding-right: 22px; - overflow: auto; } - .listview--nav-container .nav { - flex-wrap: nowrap; - overflow: hidden; } +.keyApplication .group .module--list { + padding-left: 0; + margin-bottom: 0; +} -.listview---nav-vertical { - display: none; - width: 247px; - height: 556px; - background: #fff; - box-shadow: 0 0 6px 0 rgba(139, 139, 139, 0.27); - z-index: 1000; } - .listview---nav-vertical::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .listview---nav-vertical::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .listview---nav-vertical::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .listview---nav-vertical.show { - display: flex; - display: flex; - position: absolute; - right: 25px; - top: 45px; } - .listview---nav-vertical .list-group { - flex: auto; } - .listview---nav-vertical .list-group .list-group-item { - border: none; - color: #333; - padding-top: 8px; - padding-bottom: 8px; } - .listview---nav-vertical .list-group .list-group-item.active, .listview---nav-vertical .list-group .list-group-item:hover { - background: #ddecff; } - .listview---nav-vertical .list-group .list-group-item:first-child { - border-radius: 0; } +.keyApplication .group .module--list .module--list-item { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + list-style: none; + font-size: 14px; + padding: 5px 33px 5px 10px; + margin-right: 24px; + position: relative; + color: rgba(0, 0, 0, 0.85); +} -.jianyin { - width: 30px; - height: 30px; - background-color: #f6f6f6; - background: linear-gradient(to bottom, #fff, #f6f6f6); +.keyApplication .group .module--list .module--list-item::after { position: absolute; - right: 52px; - opacity: 0; } + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0; +} -.btn-nav-all-dropdown { - flex: none; - padding: 1px; +.keyApplication .group .module--list .module--list-item:hover { + cursor: pointer; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, 0.08); +} + +.keyApplication .group .module--list .module--list-item:hover::after { + opacity: 1; +} + +.keyApplication .group .module--list .module--list-item:hover .module--list-collect { + display: block; +} + +.keyApplication .group .module--list .module--list-text { + font-size: 14px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer; +} + +.keyApplication .group .module--list .module--list-collect { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + text-align: center; + cursor: pointer; + color: #FFC43B; +} + +.keyApplication .group .module--list .module--list-collect .f-icon { + font-size: 15px; + line-height: 20px; +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect { + display: block; +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before { + content: '\e303'; +} + +.keyApplication-active { + display: flex; +} + +.keyApplication-background-show-right { + background-image: url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg); + background-position: 97% 92%; + background-repeat: no-repeat; +} + +.listview--nav-horizontal { + overflow: hidden; + padding-left: 24px; + padding-right: 24px; + height: 52px; + width: 100%; + background-color: #fff; + position: relative; + top: -8px; + border-bottom: 2px solid #ebebeb; + margin-bottom: 12px; + flex-wrap: nowrap; + display: flex; +} + +.listview--nav-horizontal .listview--nav-link { + display: inline-block; + height: 14px; + margin-right: 16px; + text-decoration: none; +} + +.listview--nav-horizontal .listview--nav-link .keyApplicationName { + font-size: 16px; + color: grey; + text-align: center; + padding: 0 17px 0 20px; + height: 40px; + line-height: 40px; + margin-left: 5px; + margin-right: 5px; + position: relative; + top: 11px; + border-top-left-radius: 2px; + white-space: nowrap; +} + +.listview--nav-horizontal .active .keyApplicationName { + color: #fff; +} + +.listview--nav-horizontal .active .tab-img { + display: block; +} + +.listview--nav-horizontal .tab-img { + float: right; + height: 40px; + position: relative; + top: -45px; + left: 3px; + display: none; +} + +.imgyinying { + background: url(../../../img/矩形@2x.png); + width: 8px; +} + +.out-keyApplication { + overflow: hidden; + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; +} + +.out-keyApplication .module-head { + position: relative; +} + +.out-keyApplication .module-head .module-header--content { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid #e5e5e5; +} + +.out-keyApplication .module-head .module-title-img { + display: block; + width: 16px; + height: 16px; + margin-right: 10px; +} + +.out-keyApplication .module-head .module-title { + width: 200px; + font-size: 15px; + color: rgba(0, 0, 0, 0.85); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0; +} + +.international-nav .nav-a .keyApplicationName { + font-size: 14px; + padding: 0 18px 0 20px; +} + +.international-content .keyApplication .module-head .module-title { + font-size: 14px; + position: relative; + top: 2px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.international-content .keyApplication .group { + width: auto; + padding-right: 10px; +} + +.international-content .keyApplication .group .group-title { + max-width: 240px; +} + +.international-content .keyApplication .module .module--list-item { + font-size: 12px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.listview--nav-container { + display: flex; + width: 100%; + position: relative; + padding-right: 22px; + overflow: auto; +} + +.listview--nav-container .nav { + flex-wrap: nowrap; + overflow: hidden; +} + +.listview---nav-vertical { + display: none; + width: 247px; + height: 556px; + background: #fff; + box-shadow: 0 0 6px 0 rgba(139, 139, 139, 0.27); + z-index: 1000; +} + +.listview---nav-vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.listview---nav-vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.listview---nav-vertical::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.listview---nav-vertical.show { + display: flex; + display: flex; + position: absolute; + right: 25px; + top: 45px; +} + +.listview---nav-vertical .list-group { + flex: auto; +} + +.listview---nav-vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; +} + +.listview---nav-vertical .list-group .list-group-item.active, +.listview---nav-vertical .list-group .list-group-item:hover { + background: #ddecff; +} + +.listview---nav-vertical .list-group .list-group-item:first-child { + border-radius: 0; +} + +.jianyin { + width: 30px; + height: 30px; + background-color: #f6f6f6; + background: linear-gradient(to bottom, #fff, #f6f6f6); + position: absolute; + right: 52px; + opacity: 0; +} + +.btn-nav-all-dropdown { + flex: none; + padding: 1px; background-color: #f6f6f6; line-height: 1; height: 30px; padding-top: 2px; position: absolute; right: 20px; - top: 10px; } + top: 10px; +} .btn-nav-all-dropdown:focus { - box-shadow: none; } + box-shadow: none; +} .btn-nav-all-dropdown .active { - top: 4px; } + top: 4px; +} .down-arrow { display: inline-block; position: relative; width: 28px; - height: 30px; } + height: 30px; +} .down-arrow::after { display: inline-block; @@ -1530,12 +1850,14 @@ input::-webkit-calendar-picker-indicator { position: absolute; top: 50%; right: 10px; - margin-top: -10px; } + margin-top: -10px; +} .down-arrow.active::after { transform-origin: center; transform: rotate(-135deg); - transition: transform .3s; } + transition: transform .3s; +} .double-slash { font-family: PingFangSC-Regular; @@ -1550,10 +1872,12 @@ input::-webkit-calendar-picker-indicator { background-size: 50% 50%; display: flex; align-items: center; - padding-left: 33px; } + padding-left: 33px; +} .module-title2 { - margin-bottom: 10px; } + margin-bottom: 10px; +} .gw-apps-management--listview { flex-grow: 1; @@ -1561,14 +1885,17 @@ input::-webkit-calendar-picker-indicator { flex-basis: 0; display: flex; flex-direction: column; - overflow: hidden; } - .gw-apps-management--listview .listview--keyapp-list { - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; - display: flex; - flex-direction: column; - overflow: hidden; } + overflow: hidden; +} + +.gw-apps-management--listview .listview--keyapp-list { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column; + overflow: hidden; +} .gw-apps-management--tileview { display: flex; @@ -1578,116 +1905,146 @@ input::-webkit-calendar-picker-indicator { flex-grow: 1; flex-shrink: 1; flex-basis: 0; - overflow: hidden; } - .gw-apps-management--tileview .tileview--nav { - width: 230px; - background: rgba(247, 249, 250, 0.8); - border-right: 1px solid rgba(0, 0, 0, 0.06); - overflow-y: auto; } - .gw-apps-management--tileview .tileview--nav::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .gw-apps-management--tileview .tileview--content { - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; - padding: 0 0 24px 30px; - background: #fff; - overflow-y: auto; } - .gw-apps-management--tileview .tileview--content::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .gw-apps-management--tileview .tileview--app-wrapper { - padding: 0; - margin: 0.875rem 1rem 0 0; } + overflow: hidden; +} -.tileview--menu-item-height-default { - height: 37px; } +.gw-apps-management--tileview .tileview--nav { + width: 230px; + background: rgba(247, 249, 250, 0.8); + border-right: 1px solid rgba(0, 0, 0, 0.06); + overflow-y: auto; +} -.menu-submenu--title-height-default { - height: 45px; } +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} -.tileview--menu-item, -.menu-submenu--title { - padding: 0 0 0 63px; - position: relative; - cursor: pointer; } +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} -.tileview--menu-item .menu-item--icon, -.menu-submenu--title .menu-item--icon { - position: absolute; - top: 12px; - left: 29px; - line-height: 21px; - overflow: hidden; } +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} -.tileview--menu-item .menu-item--icon img, +.gw-apps-management--tileview .tileview--content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding: 0 0 24px 30px; + background: #fff; + overflow-y: auto; +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.gw-apps-management--tileview .tileview--app-wrapper { + padding: 0; + margin: 0.875rem 1rem 0 0; +} + +.tileview--menu-item-height-default { + height: 37px; +} + +.menu-submenu--title-height-default { + height: 45px; +} + +.tileview--menu-item, +.menu-submenu--title { + padding: 0 0 0 63px; + position: relative; + cursor: pointer; +} + +.tileview--menu-item .menu-item--icon, +.menu-submenu--title .menu-item--icon { + position: absolute; + top: 12px; + left: 29px; + line-height: 21px; + overflow: hidden; +} + +.tileview--menu-item .menu-item--icon img, .menu-submenu--title .menu-item--icon .gw-icon { - font-size: 16px; } + font-size: 16px; +} .menu-submenu--title .menu-item--right { display: none; line-height: 24px; transform: rotate(90deg); right: 1.2rem; - top: 0.95rem; } + top: 0.95rem; +} .menu-submenu--title .menu-item--right-selected { display: none !important; line-height: 24px; transform: rotate(90deg); right: 1.2rem; - top: 0.95rem; } + top: 0.95rem; +} .tileview--menu-item .menu-item--text-length, .menu-submenu--title .menu-item--text-length { white-space: nowrap; overflow: hidden; width: 127px; - text-overflow: ellipsis; } + text-overflow: ellipsis; +} .tileview--menu-item .menu-item--text, .menu-submenu--title .menu-item--text { display: block; line-height: 21px; font-size: 15px; - color: rgba(0, 0, 0, 0.85); } + color: rgba(0, 0, 0, 0.85); +} .menu-submenu--title .menu-item--text { - padding: 0.75rem 0; } + padding: 0.75rem 0; +} .tileview--menu-item .menu-item--text { - padding: 0.5rem 0; } + padding: 0.5rem 0; +} .tileview--menu-item:hover .menu-item--right, .menu-submenu--title:hover .menu-item--right { @@ -1695,7 +2052,8 @@ input::-webkit-calendar-picker-indicator { line-height: 24px; transform: rotate(90deg); right: 1.2rem; - top: 0.95rem; } + top: 0.95rem; +} .tileview--menu-item:hover .menu-item--right-selected, .menu-submenu--title:hover .menu-item--right-selected { @@ -1703,7 +2061,8 @@ input::-webkit-calendar-picker-indicator { line-height: 24px; transform: rotate(270deg) !important; right: 1.65rem; - top: 0.95rem; } + top: 0.95rem; +} .tileview--menu-item::after { position: absolute; @@ -1714,39 +2073,49 @@ input::-webkit-calendar-picker-indicator { height: 1px; transform: scaleY(0.0001); opacity: 0; - transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); } + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); +} .tileview--menu-item-selected::after { transform: scaleY(1) !important; - opacity: 1 !important; } + opacity: 1 !important; +} .tileview--menu-top { - margin-top: 1px; } + margin-top: 1px; +} .tileview--menu .menu-list-item--arrow { display: none; position: absolute; top: 0.75rem; - right: 1.375rem; } + right: 1.375rem; +} .tileview--menu .tileview--menu-item-selected .menu-list-item--arrow { - display: block; } + display: block; +} -.tileview--menu-submenu-open > .menu-submenu--title .menu-item--text { - color: #000; } +.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text { + color: #000; +} .tileview--menu-sub { - transition: all 0.1s linear; } + transition: all 0.1s linear; +} .tileview--menu-submenu-open .tileview--menu-sub { - height: 100%; } + height: 100%; +} .tileview--menu-image { - transform: translateX(-20px); } + transform: translateX(-20px); +} /*头部*/ .application-wrapper--header { - padding: 0 0 4px 0; } + padding: 0 0 4px 0; +} .application-wrapper--header-title { display: flex; @@ -1756,11 +2125,13 @@ input::-webkit-calendar-picker-indicator { line-height: 1.3125rem; color: rgba(0, 0, 0, 0.85); margin: 0; - font-weight: 600; } + font-weight: 600; +} .application-wrapper--header-title span { display: inline-block; - vertical-align: middle; } + vertical-align: middle; +} /*图片临时*/ .application-list--header-title--icon { @@ -1771,33 +2142,42 @@ input::-webkit-calendar-picker-indicator { width: 18px; height: 9px; margin: 0 0.375rem 0 0; - padding-left: 3px; } - .application-list--header-title--icon .header-title--icon-item { - display: block; - width: 4px; - height: 10px; - transform: skewX(22deg); - -webkit-transform: skewX(-22deg); - /*兼容-webkit-引擎浏览器*/ - -moz-transform: skewX(-22deg); - /*兼容-moz-引擎浏览器*/ } - .application-list--header-title--icon .header-title--icon-item-right { - margin-left: 4px; } + padding-left: 3px; +} + +.application-list--header-title--icon .header-title--icon-item { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + /*兼容-webkit-引擎浏览器*/ + -moz-transform: skewX(-22deg); + /*兼容-moz-引擎浏览器*/ +} + +.application-list--header-title--icon .header-title--icon-item-right { + margin-left: 4px; +} .application-wrapper--content { - padding: 0 0 16px 0; } + padding: 0 0 16px 0; +} .application-wrapper--list-title { margin-top: 8px; - margin-bottom: 18px; } + margin-bottom: 18px; +} .application-wrapper--list { - padding: 0 0 0 14px; } + padding: 0 0 0 14px; +} .application-wrapper--list:after { content: ""; display: block; - clear: both; } + clear: both; +} .application-wrapper--list-item { position: relative; @@ -1805,102 +2185,129 @@ input::-webkit-calendar-picker-indicator { float: left; padding: 5px 10px 5px 10px; margin: 0 2px 0 0; - list-style: none; } - .application-wrapper--list-item .application-wrapper--list-item-text { - font-size: 14px; - color: rgba(0, 0, 0, 0.85); - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - cursor: pointer; } - .application-wrapper--list-item .application-wrapper--list-item-tip { - padding: 0px 6px; - white-space: nowrap; - background: #FFFFFF; - border: 1px solid #D6D6D6; - box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.15); - font-family: PingFangSC-Regular; - font-size: 12px; - color: #313131; - line-height: 20px; } - .application-wrapper--list-item .application-wrapper--list-item-tip-top { - width: 12px; - height: 12px; - transform: rotate(45deg); - position: absolute; - margin-top: 7px; - top: -1px; - background: #FFFFFF; - border: 1px solid #D6D6D6; - border-radius: 2px; } - .application-wrapper--list-item .application-wrapper--list-item-tip-top-frame { - width: 12px; - height: 10px; - overflow: hidden; - position: absolute; - top: -9px; - left: 12px; } - .application-wrapper--list-item .application-wrapper--list-item-tip-top-border { - top: 38px; - left: 70%; - position: absolute; - justify-content: center; - transform: translate(-50%, 0); - z-index: 500; - display: none; - transition: all 0s linear 0.7s; } - .application-wrapper--list-item .application-wrapper--list-item-start { - display: none; - position: absolute; - right: 4px; - top: 5px; - width: 20px; - height: 20px; - cursor: pointer; } - .application-wrapper--list-item .application-wrapper--list-item-start .f-icon { - display: block; - margin: 0 auto; - font-size: 15px; - line-height: 20px; - color: #FFC43B; } - .application-wrapper--list-item::after { - position: absolute; - content: ""; - left: 0; - right: 0; - bottom: 0; - height: 1px; - opacity: 0; } - .application-wrapper--list-item:hover { - display: block; - box-shadow: 0 2px 4px 0 rgba(3, 62, 125, 0.08); } - .application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border { - top: 38px; - left: 70%; - position: absolute; - justify-content: center; - transform: translate(-50%, 0); - z-index: 500; - display: flex; } - .application-wrapper--list-item:hover::after { - opacity: 1; } + list-style: none; +} + +.application-wrapper--list-item .application-wrapper--list-item-text { + font-size: 14px; + color: rgba(0, 0, 0, 0.85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer; +} + +.application-wrapper--list-item .application-wrapper--list-item-tip { + padding: 0px 6px; + white-space: nowrap; + background: #FFFFFF; + border: 1px solid #D6D6D6; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.15); + font-family: PingFangSC-Regular; + font-size: 12px; + color: #313131; + line-height: 20px; +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top { + width: 12px; + height: 12px; + transform: rotate(45deg); + position: absolute; + margin-top: 7px; + top: -1px; + background: #FFFFFF; + border: 1px solid #D6D6D6; + border-radius: 2px; +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame { + width: 12px; + height: 10px; + overflow: hidden; + position: absolute; + top: -9px; + left: 12px; +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: none; + transition: all 0s linear 0.7s; +} + +.application-wrapper--list-item .application-wrapper--list-item-start { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + cursor: pointer; +} + +.application-wrapper--list-item .application-wrapper--list-item-start .f-icon { + display: block; + margin: 0 auto; + font-size: 15px; + line-height: 20px; + color: #FFC43B; +} + +.application-wrapper--list-item::after { + position: absolute; + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0; +} + +.application-wrapper--list-item:hover { + display: block; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, 0.08); +} + +.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: flex; +} + +.application-wrapper--list-item:hover::after { + opacity: 1; +} .talk_con { - background: #f9f9f9; } + background: #f9f9f9; +} .talk_show { border: 1px solid #666; margin: 10px auto 0; overflow: auto; height: 400px; - width: auto; } + width: auto; +} .talk_input { - margin: 10px auto 0; } + margin: 10px auto 0; +} .whotalk { float: left; - outline: 0; } + outline: 0; +} .talk_word { padding: 0; @@ -1908,50 +2315,60 @@ input::-webkit-calendar-picker-indicator { outline: 0; text-indent: 10px; width: 350px; - height: 30px; } + height: 30px; +} .talk_sub { float: right; - margin-left: 10px; } + margin-left: 10px; +} .atalk { - margin: 10px; } + margin: 10px; +} .atalk span { display: inline-block; background: #0181cc; border-radius: 10px; color: #fff; - padding: 5px 10px; } + padding: 5px 10px; +} .btalk { margin: 10px; - text-align: right; } + text-align: right; +} .btalk span { display: inline-block; background: #ef8201; border-radius: 10px; color: #fff; - padding: 5px 10px; } + padding: 5px 10px; +} .custom-class { - float: right; } + float: right; +} .modal-dialog { position: absolute; right: 0; bottom: 0; - margin: 0; } + margin: 0; +} :host { display: flex; - flex-direction: column; } + flex-direction: column; +} .notactive { - position: relative; } + position: relative; +} -.borderactive + li > a { +.borderactive+li>a { padding-right: 10px; padding-left: 12px; font-family: PingFangSC-Regular; @@ -1961,13 +2378,16 @@ input::-webkit-calendar-picker-indicator { border-right: 0 !important; border-bottom: 0 !important; border-left: 0 !important; - border-top-left-radius: 0 !important; } + border-top-left-radius: 0 !important; +} .notinimg { - visibility: hidden; } + visibility: hidden; +} .noimghover { - visibility: visible; } + visibility: visible; +} .btn-nav-all-dropdown2 { flex: none; @@ -1977,19 +2397,23 @@ input::-webkit-calendar-picker-indicator { height: 30px; padding-top: 2px; position: absolute; - right: 20px; } + right: 20px; +} .btn-nav-all-dropdown2:focus { - box-shadow: none; } + box-shadow: none; +} .btn-nav-all-dropdown2 .active { - top: 4px; } + top: 4px; +} .down-arrow { display: inline-block; position: relative; width: 28px; - height: 32px; } + height: 32px; +} .down-arrow::after { display: inline-block; @@ -2005,315 +2429,444 @@ input::-webkit-calendar-picker-indicator { position: absolute; top: 50%; right: 10px; - margin-top: -10px; } + margin-top: -10px; +} .down-arrow.active::after { transform-origin: center; transform: rotate(-135deg); - transition: transform 0.3s; } + transition: transform 0.3s; +} .list-group-items { height: 32px; border: none; color: #333; padding-top: 8px; - padding-bottom: 8px; } + padding-bottom: 8px; +} .list-group-items:hover { - background: #ddecff; } + background: #ddecff; +} .list-group-items.active { - background: #c8e0ff; } + background: #c8e0ff; +} .list-group-items:first-child { - border-radius: 0; } + border-radius: 0; +} .tabset--nav-container { display: flex; width: 100%; - position: relative; } - .tabset--nav-container .active-bg { - display: none; } - .tabset--nav-container .tabset--tab-content { - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; - display: flex; - flex-direction: column; } - .tabset--nav-container .nav { - flex-wrap: nowrap; - overflow: inherit; - border: none; } - .tabset--nav-container .tabset-container--dropdown { - position: absolute; - height: 36px; - line-height: 36px; - border-right: 1px solid #f0f0f0; - color: rgba(0, 0, 0, 0.45); - z-index: 10; - cursor: pointer; - right: 0; - top: 0; - display: flex; - flex-direction: row; - align-items: center; } - .tabset--nav-container .tabset-container--dropdown .f-icon { - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - font-size: 18px; } - .tabset--nav-container .tabset-container--dropdown.active .f-icon { - transform: rotate(180deg); - transition: transform 0.2s; } - .tabset--nav-container .tabset-container--vertical { - display: none; - width: 247px; - background: #fff; - box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); - z-index: 1000; - overflow: auto; } - .tabset--nav-container .tabset-container--vertical .nav-link-close { - font-size: 14px; - color: rgba(0, 0, 0, 0.15); - vertical-align: inherit; } - .tabset--nav-container .tabset-container--vertical .nav-link-close::before { - content: "\e11b"; } - .tabset--nav-container .tabset-container--vertical .nav-link-close:hover { - color: #f74242 !important; } - .tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before { - content: "\e11d"; } - .tabset--nav-container .tabset-container--vertical .list-group-header { - padding: 14px 24px 6px; - display: flex; - align-items: center; - justify-content: space-between; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title { - font-size: 16px; - color: rgba(0, 0, 0, 0.95); - margin: 0; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper { - font-size: 14px; - display: flex; - align-items: center; - cursor: pointer; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon { - width: 14px; - height: 14px; - margin: 0 6px 0 0; - background: #d1d5db; - border-radius: 2px; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon { - color: #fff; - font-size: 14px; - display: block; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before { - content: "\e11b"; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text { - color: rgba(0, 0, 0, 0.85); } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon { - background: #ff6060; } - .tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon { - background: #f94c4c; } - .tabset--nav-container .tabset-container--vertical.show { - display: flex; - position: fixed; - right: 1px; - top: 80px; - bottom: 1px; } - .tabset--nav-container .tabset-container--vertical::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .tabset--nav-container .tabset-container--vertical .list-group { - flex: auto; - padding-left: 0px; - width: 247px; } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item { - border: none; - color: #333; - padding-top: 8px; - padding-bottom: 8px; - display: flex; - align-items: center; - justify-content: space-between; - cursor: pointer; } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { - position: absolute; - content: ''; - left: 0; - right: 0; - bottom: 0; - height: 1px; - transform: scaleY(0.0001); - opacity: 0; - transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover { - background-image: linear-gradient(144deg, #eef4ff 0%, #f6fcff 100%); } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active { - background-image: linear-gradient(144deg, #eef4ff 0%, #f6fcff 100%); } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after { - transform: scaleY(1); - opacity: 1; } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child { - border-radius: 0; } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps { - display: none; } - -.newdh:hover .gjdh { - display: none; } + position: relative; +} -.newdh:hover .gjdh2 { - display: inline; } +.tabset--nav-container .active-bg { + display: none; +} -.gjdh2 { - display: none; } +.tabset--nav-container .tabset--tab-content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column; +} -.tabshow { - display: inline; } +.tabset--nav-container .nav { + flex-wrap: nowrap; + overflow: inherit; + border: none; +} -.tabhid { - display: none; } +.tabset--nav-container .tabset-container--dropdown { + position: absolute; + height: 36px; + line-height: 36px; + border-right: 1px solid #f0f0f0; + color: rgba(0, 0, 0, 0.45); + z-index: 10; + cursor: pointer; + right: 0; + top: 0; + display: flex; + flex-direction: row; + align-items: center; +} -.tabset--nav-container { - position: relative; } - .tabset--nav-container .nav { - flex-wrap: nowrap; - overflow: inherit; - line-height: 16px; - text-align: center; - margin-right: 60px; } - .tabset--nav-container .nav .tabset--nav-item { - flex-shrink: 0; - position: relative; - /*标签页之间的分割竖线*/ } - .tabset--nav-container .nav .tabset--nav-item.nav-item--home::before { - left: 3px; } - .tabset--nav-container .nav .tabset--nav-item::after { - position: absolute; - content: ''; - background: #CCD2E1; - width: 1px; - right: 0; - z-index: 100; - height: 14px; - top: 50%; - margin-top: -7px; - opacity: 0.38; } - .tabset--nav-container .nav .tabset--nav-item:last-child::after { - display: none; } - .tabset--nav-container .nav .tabset--nav-item:hover::after { - display: none; } - .tabset--nav-container .nav .tabset--nav-link { - border: none; - display: flex; - flex-direction: row; - align-items: center; } - .tabset--nav-container .nav .tabset--nav-link-text { - display: block; - max-width: 110px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .tabset--nav-container .nav .tabset--nav-link-overlay, - .tabset--nav-container .nav .tabset--nav-link-overlay-active { - bottom: 0; - width: 15px; - height: 15.45px; - position: relative; - float: left; - margin-left: -14px; } - .tabset--nav-container .nav .tabset--nav-link-overlay { - background: linear-gradient(top, rgba(255, 255, 255, 0), whitesmoke); - filter: progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff, endColorstr=whitesmoke, GradientType=0; } - .tabset--nav-container .nav .tabset--nav-link-overlay-active { - background: linear-gradient(top, rgba(255, 255, 255, 0), #fafbfc); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0); } - .tabset--nav-container .nav .nav-link-close { - width: 15px; - height: 15px; - color: #d8d8d8; - margin-left: 24px; } - .tabset--nav-container .nav .nav-link-close .f-icon { - vertical-align: top; - font-size: 12px; - line-height: 15px; } - .tabset--nav-container .nav .nav-link-close:hover { - color: #f74242 !important; } - .tabset--nav-container .nav .nav-link-close:hover .f-icon::before { - font-size: 15px; - content: "\e11d"; } - .tabset--nav-container .nav .spanlib { - display: inline-block; - white-space: nowrap; - max-width: 230px; - overflow: hidden; } - .tabset--nav-container .nav .tabset--nav-link.active { - box-shadow: inset 0 0 1px 0 rgba(0, 0, 0, 0.1); - z-index: 11; } - .tabset--nav-container .nav .nav-item--home .tabset--nav-link { - padding: 0 19px 0 20px; - height: 38px; - line-height: 38px; } - .tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close { - display: none; } - .tabset--nav-container .nav .nav-item--home .nav-item--home-icon { - display: inline-block; - width: 16px; - height: 16px; - background: url("../../../launcher/home-icon.svg") no-repeat center center; } - .tabset--nav-container .nav .nav-item--apps { - display: none; } - .tabset--nav-container .nav .nav-item--apps .nav-link-close { - display: none; } +.tabset--nav-container .tabset-container--dropdown .f-icon { + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + font-size: 18px; +} -.workarea { - overflow: hidden; - background-color: #f4f6f9; } +.tabset--nav-container .tabset-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform 0.2s; +} -/** 6月6日修改**/ -.gw-header--menu-panel-wrapper { - position: fixed; - width: 90%; - top: 40px; - left: 0; - bottom: 0; - z-index: 980; - max-width: none; - transform: translateX(-120%); - box-shadow: 0 2px 26px 0 rgba(0, 0, 0, 0.3); } +.tabset--nav-container .tabset-container--vertical { + display: none; + width: 247px; + background: #fff; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); + z-index: 1000; + overflow: auto; +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close { + font-size: 14px; + color: rgba(0, 0, 0, 0.15); + vertical-align: inherit; +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close::before { + content: "\e11b"; +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover { + color: #f74242 !important; +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before { + content: "\e11d"; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header { + padding: 14px 24px 6px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title { + font-size: 16px; + color: rgba(0, 0, 0, 0.95); + margin: 0; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper { + font-size: 14px; + display: flex; + align-items: center; + cursor: pointer; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon { + width: 14px; + height: 14px; + margin: 0 6px 0 0; + background: #d1d5db; + border-radius: 2px; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon { + color: #fff; + font-size: 14px; + display: block; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before { + content: "\e11b"; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text { + color: rgba(0, 0, 0, 0.85); +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon { + background: #ff6060; +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon { + background: #f94c4c; +} + +.tabset--nav-container .tabset-container--vertical.show { + display: flex; + position: fixed; + right: 1px; + top: 80px; + bottom: 1px; +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.tabset--nav-container .tabset-container--vertical .list-group { + flex: auto; + padding-left: 0px; + width: 247px; +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(0.0001); + opacity: 0; + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(144deg, #eef4ff 0%, #f6fcff 100%); +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active { + background-image: linear-gradient(144deg, #eef4ff 0%, #f6fcff 100%); +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1; +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child { + border-radius: 0; +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps { + display: none; +} + +.newdh:hover .gjdh { + display: none; +} + +.newdh:hover .gjdh2 { + display: inline; +} + +.gjdh2 { + display: none; +} + +.tabshow { + display: inline; +} + +.tabhid { + display: none; +} + +.tabset--nav-container { + position: relative; +} + +.tabset--nav-container .nav { + flex-wrap: nowrap; + overflow: inherit; + line-height: 16px; + text-align: center; + margin-right: 60px; +} + +.tabset--nav-container .nav .tabset--nav-item { + flex-shrink: 0; + position: relative; + /*标签页之间的分割竖线*/ +} + +.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before { + left: 3px; +} + +.tabset--nav-container .nav .tabset--nav-item::after { + position: absolute; + content: ''; + background: #CCD2E1; + width: 1px; + right: 0; + z-index: 100; + height: 14px; + top: 50%; + margin-top: -7px; + opacity: 0.38; +} + +.tabset--nav-container .nav .tabset--nav-item:last-child::after { + display: none; +} + +.tabset--nav-container .nav .tabset--nav-item:hover::after { + display: none; +} + +.tabset--nav-container .nav .tabset--nav-link { + border: none; + display: flex; + flex-direction: row; + align-items: center; +} + +.tabset--nav-container .nav .tabset--nav-link-text { + display: block; + max-width: 110px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tabset--nav-container .nav .tabset--nav-link-overlay, +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + bottom: 0; + width: 15px; + height: 15.45px; + position: relative; + float: left; + margin-left: -14px; +} + +.tabset--nav-container .nav .tabset--nav-link-overlay { + background: linear-gradient(top, rgba(255, 255, 255, 0), whitesmoke); + filter: progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff, endColorstr=whitesmoke, GradientType=0; +} + +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + background: linear-gradient(top, rgba(255, 255, 255, 0), #fafbfc); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0); +} + +.tabset--nav-container .nav .nav-link-close { + width: 15px; + height: 15px; + color: #d8d8d8; + margin-left: 24px; +} + +.tabset--nav-container .nav .nav-link-close .f-icon { + vertical-align: top; + font-size: 12px; + line-height: 15px; +} + +.tabset--nav-container .nav .nav-link-close:hover { + color: #f74242 !important; +} + +.tabset--nav-container .nav .nav-link-close:hover .f-icon::before { + font-size: 15px; + content: "\e11d"; +} + +.tabset--nav-container .nav .spanlib { + display: inline-block; + white-space: nowrap; + max-width: 230px; + overflow: hidden; +} + +.tabset--nav-container .nav .tabset--nav-link.active { + box-shadow: inset 0 0 1px 0 rgba(0, 0, 0, 0.1); + z-index: 11; +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link { + padding: 0 19px 0 20px; + height: 38px; + line-height: 38px; +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close { + display: none; +} + +.tabset--nav-container .nav .nav-item--home .nav-item--home-icon { + display: inline-block; + width: 16px; + height: 16px; + background: url("../../../launcher/home-icon.svg") no-repeat center center; +} + +.tabset--nav-container .nav .nav-item--apps { + display: none; +} + +.tabset--nav-container .nav .nav-item--apps .nav-link-close { + display: none; +} + +.workarea { + overflow: hidden; + background-color: #f4f6f9; +} + +/** 6月6日修改**/ +.gw-header--menu-panel-wrapper { + position: fixed; + width: 90%; + top: 40px; + left: 0; + bottom: 0; + z-index: 980; + max-width: none; + transform: translateX(-120%); + box-shadow: 0 2px 26px 0 rgba(0, 0, 0, 0.3); +} @media (min-width: 1600px) { .gw-header--menu-panel-wrapper { width: 70%; - max-width: none; } } + max-width: none; + } +} .gw-header--menu-panel-wrapper.f-state-show { - transform: translateX(0%); } + transform: translateX(0%); +} .gw-header--menu-panel-wrapper.f-state-hidden { - transform: translateX(-500%); } + transform: translateX(-500%); +} .gw-header--menu-panel-mask-top { - top: 40px !important; } + top: 40px !important; +} .gw-header--menu-panel-mask-bottom { bottom: calc(100vh - 40px) !important; - background-color: transparent !important; } + background-color: transparent !important; +} .gw-header--menu-panel-mask { overflow: hidden; @@ -2325,13 +2878,16 @@ input::-webkit-calendar-picker-indicator { z-index: 970; transform: translateX(-120%); background-color: #000; - opacity: 0.4; } + opacity: 0.4; +} .gw-header--menu-panel-mask.f-state-show { - transform: translateX(0%); } + transform: translateX(0%); +} .gw-header--menu-panel-mask.f-state-hidden { - transform: translateX(-120%); } + transform: translateX(-120%); +} .gw-header--menu-panel { min-width: 600px; @@ -2339,15 +2895,18 @@ input::-webkit-calendar-picker-indicator { margin: 0; z-index: 982; position: relative; - background: #fff; } + background: #fff; +} .gw-header--menu-panel .gw-apps-management { top: 0; position: absolute; - background: transparent; } + background: transparent; +} .gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper { - margin: 0; } + margin: 0; +} .gw-header--menu-panel .menu-panel--close { position: absolute; @@ -2359,148 +2918,202 @@ input::-webkit-calendar-picker-indicator { right: 0; display: flex; align-items: center; - justify-content: center; } - .gw-header--menu-panel .menu-panel--close::before { - background: rgba(0, 0, 0, 0.06); - border-radius: 0.5px; - border-radius: 0.5px; - position: absolute; - left: 0; - width: 1px; - height: 14px; - content: ''; - top: 50%; - margin-top: -7px; } - .gw-header--menu-panel .menu-panel--close .menu-panel--close-area { - width: 22px; - height: 22px; - text-align: center; - background: rgba(0, 0, 0, 0.1); - border-radius: 11px; - color: rgba(0, 0, 0, 0.5); } - .gw-header--menu-panel .menu-panel--close .f-icon { - font-size: 14px; - line-height: 22px; } - .gw-header--menu-panel .menu-panel--close:hover { - background: #F6F6F6; } - .gw-header--menu-panel .menu-panel--close:hover::before { - display: none; } - .gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area { - color: #fff; - background: #FF6060; } + justify-content: center; +} + +.gw-header--menu-panel .menu-panel--close::before { + background: rgba(0, 0, 0, 0.06); + border-radius: 0.5px; + border-radius: 0.5px; + position: absolute; + left: 0; + width: 1px; + height: 14px; + content: ''; + top: 50%; + margin-top: -7px; +} + +.gw-header--menu-panel .menu-panel--close .menu-panel--close-area { + width: 22px; + height: 22px; + text-align: center; + background: rgba(0, 0, 0, 0.1); + border-radius: 11px; + color: rgba(0, 0, 0, 0.5); +} + +.gw-header--menu-panel .menu-panel--close .f-icon { + font-size: 14px; + line-height: 22px; +} + +.gw-header--menu-panel .menu-panel--close:hover { + background: #F6F6F6; +} + +.gw-header--menu-panel .menu-panel--close:hover::before { + display: none; +} + +.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area { + color: #fff; + background: #FF6060; +} .menu-userinfo-wrapper { display: flex; flex-direction: row; align-items: center; - line-height: 38px; } - .menu-userinfo-wrapper::after { - display: none; } - .menu-userinfo-wrapper.active, .menu-userinfo-wrapper.hover { - background-color: #075EBB; } - .menu-userinfo-wrapper .menu-userinfo--item { - display: flex; - flex-direction: row; - align-items: center; - line-height: 38px; } - .menu-userinfo-wrapper .menu-userinfo--item::after { - display: none; } - .menu-userinfo-wrapper .menu-userinfo--item-avatar { - display: inline-block; - width: 20px; - height: 20px; - border-radius: 100%; - margin-right: 4px; } - .menu-userinfo-wrapper .menu-userinfo--item-name { - font-size: 14px; - color: #fff; - position: relative; - opacity: .8; } - .menu-userinfo-wrapper .menu-userinfo--item-name::after { - content: ''; - position: absolute; - right: -7px; - bottom: 8px; - width: 0; - height: 0; - border-left: 3px solid transparent; - border-top: 3px solid transparent; - border-bottom: 3px solid #fff; - border-right: 3px solid #fff; } + line-height: 38px; +} + +.menu-userinfo-wrapper::after { + display: none; +} + +.menu-userinfo-wrapper.active, +.menu-userinfo-wrapper.hover { + background-color: #075EBB; +} + +.menu-userinfo-wrapper .menu-userinfo--item { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px; +} + +.menu-userinfo-wrapper .menu-userinfo--item::after { + display: none; +} + +.menu-userinfo-wrapper .menu-userinfo--item-avatar { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + margin-right: 4px; +} + +.menu-userinfo-wrapper .menu-userinfo--item-name { + font-size: 14px; + color: #fff; + position: relative; + opacity: .8; +} + +.menu-userinfo-wrapper .menu-userinfo--item-name::after { + content: ''; + position: absolute; + right: -7px; + bottom: 8px; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-top: 3px solid transparent; + border-bottom: 3px solid #fff; + border-right: 3px solid #fff; +} .menu-userinfo--detail { right: 0; min-width: 220px; box-shadow: 0px 2px 10px 0px rgba(0, 0, 0, 0.1); border-radius: 2px; - padding-top: 2px; } - .menu-userinfo--detail-content { - background-color: #fff; } + padding-top: 2px; +} + +.menu-userinfo--detail-content { + background-color: #fff; +} .detail-content--item, .detail-content--user { white-space: nowrap; overflow: hidden; - text-align: left; } + text-align: left; +} .detail-content--user { display: flex; flex-direction: row; align-items: center; - padding: 12px 10px; } - .detail-content--user .detail-content--user-avatar-container { - margin-right: 10px; } - .detail-content--user .detail-content--user-avatar { - display: block; - width: 38px; - height: 38px; - border-radius: 100%; } - .detail-content--user .detail-content--user-info { - line-height: 20px; } - .detail-content--user .detail-content--user-info-sub { - font-size: 13px; - margin-top: 2px; } + padding: 12px 10px; +} + +.detail-content--user .detail-content--user-avatar-container { + margin-right: 10px; +} + +.detail-content--user .detail-content--user-avatar { + display: block; + width: 38px; + height: 38px; + border-radius: 100%; +} + +.detail-content--user .detail-content--user-info { + line-height: 20px; +} + +.detail-content--user .detail-content--user-info-sub { + font-size: 13px; + margin-top: 2px; +} .detail-content--item { line-height: 20px; font-size: 14px; color: rgba(0, 0, 0, 0.85); padding: 0 10px; - cursor: pointer; } - .detail-content--item:hover { - color: #247AEC; } - .detail-content--item .detail-content--icon { - width: 20px; - margin-right: 10px; - margin-left: 9px; - font-size: 20px; } - .detail-content--item-content { - display: flex; - flex-direction: row; - align-items: center; - padding: 12px 0; } + cursor: pointer; +} + +.detail-content--item:hover { + color: #247AEC; +} + +.detail-content--item .detail-content--icon { + width: 20px; + margin-right: 10px; + margin-left: 9px; + font-size: 20px; +} + +.detail-content--item-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 0; +} .dialog-user-edit { display: flex; flex-direction: row; align-items: center; padding: 16px 26px; - padding-left: 18px !important; } + padding-left: 18px !important; +} .dialog-user-edit .dialog-user-edit-icon { margin-right: 12px; font-size: 22px; - color: #f49730; } + color: #f49730; +} .dialog-user-edit .dialog-user-edit-text { font-size: 16px; - color: #000; } + color: #000; +} .gw-user-edit-dialog { - display: none; } + display: none; +} .gw-user-edit-dialog.show { - display: block; } + display: block; +} .gw-user-edit-modal { position: fixed; @@ -2510,14 +3123,16 @@ input::-webkit-calendar-picker-indicator { left: 0; z-index: 1050; overflow: hidden; - outline: 0; } + outline: 0; +} .gw-user-edit-modal .modal-dialog { transform: translate(0, 0); width: 420px; height: 180px; margin-left: -210px !important; - margin-top: -90px !important; } + margin-top: -90px !important; +} .edit-modal-dialog { position: absolute; @@ -2526,7 +3141,8 @@ input::-webkit-calendar-picker-indicator { left: 50%; top: 50%; margin-left: -210px; - margin-top: -90px; } + margin-top: -90px; +} .edit-modal-content { position: relative; @@ -2538,7 +3154,8 @@ input::-webkit-calendar-picker-indicator { border: 0 solid rgba(0, 0, 0, 0.2); border-radius: 2px; box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.2); - outline: 0; } + outline: 0; +} .edit-modal-header { display: flex; @@ -2550,46 +3167,55 @@ input::-webkit-calendar-picker-indicator { flex-shrink: 0; background: #fff; color: #000; - padding: 12px 8px 12px 18px; } + padding: 12px 8px 12px 18px; +} .edit-modal-title { margin-bottom: 0; line-height: 22px; - font-size: 16px; } + font-size: 16px; +} .edit-modal-actions { flex: 1; margin: -4px 0; display: flex; - justify-content: flex-end; } + justify-content: flex-end; +} .edit-modal-actions-close { padding: 2px; color: #bfbfbf; - cursor: pointer; } + cursor: pointer; +} .edit-modal-actions-close:hover { - color: rgba(0, 0, 0, 0.85); } + color: rgba(0, 0, 0, 0.85); +} .edit-modal-body { height: auto; - overflow: hidden; } + overflow: hidden; +} .edit-modal-footer { display: flex; align-items: center; justify-content: flex-end; flex-shrink: 0; - padding: 16px 20px 20px; } + padding: 16px 20px 20px; +} .edit-modal-footer .btn { margin-right: 8px; padding: 4px 15px; line-height: 20px !important; - font-size: 14px; } + font-size: 14px; +} .edit-modal-footer .btn:last-child { - margin-right: 0; } + margin-right: 0; +} .gw-user-edit-modal-backdrop { position: fixed; @@ -2598,10 +3224,12 @@ input::-webkit-calendar-picker-indicator { bottom: 0; left: 0; z-index: 1040; - background-color: rgba(0, 0, 0, 0.15); } + background-color: rgba(0, 0, 0, 0.15); +} .user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input { - border: 0; } + border: 0; +} .setdefault { border-radius: 10px; @@ -2619,7 +3247,8 @@ input::-webkit-calendar-picker-indicator { white-space: nowrap; justify-content: flex-end; flex-direction: row; - align-self: start; } + align-self: start; +} .setdefault:hover { border-radius: 10px; @@ -2637,7 +3266,8 @@ input::-webkit-calendar-picker-indicator { white-space: nowrap; justify-content: flex-end; flex-direction: row; - align-self: start; } + align-self: start; +} .curtenant { border-radius: 10px; @@ -2655,7 +3285,8 @@ input::-webkit-calendar-picker-indicator { white-space: nowrap; justify-content: flex-end; flex-direction: row; - align-self: start; } + align-self: start; +} .tenant-title { font-family: PingFangSC-Regular; @@ -2673,40 +3304,48 @@ input::-webkit-calendar-picker-indicator { justify-content: flex-start; flex-direction: row; align-self: start; - margin-right: 20px; } + margin-right: 20px; +} .name-space { - height: 38px; } + height: 38px; +} .gw-navbar-user-dropdown { position: relative; padding: 0 16px 0 14px; - cursor: pointer; } + cursor: pointer; +} .gw-navbar-user-dropdown.active.gw-navbar-user-name { - opacity: 1; } + opacity: 1; +} .gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail { - display: block !important; } + display: block !important; +} .gw-navbar-user-info { display: flex; flex-direction: row; align-items: center; - line-height: 38px; } + line-height: 38px; +} .gw-navbar-user-avatar { display: inline-block; width: 20px; height: 20px; border-radius: 100%; - margin-right: 4px; } + margin-right: 4px; +} .gw-navbar-user-name { font-size: 14px; color: #fff; position: relative; - opacity: .8; } + opacity: .8; +} .gw-navbar-user-name::after { content: ''; @@ -2718,24 +3357,28 @@ input::-webkit-calendar-picker-indicator { border-left: 3px solid transparent; border-top: 3px solid transparent; border-bottom: 3px solid #fff; - border-right: 3px solid #fff; } + border-right: 3px solid #fff; +} .gw-navbar-user-info-detail { position: absolute; right: 0; top: calc(100% + 1px); z-index: 1000; - min-width: 220px; } + min-width: 220px; +} .gw-navbar-user-info-content { background-color: #fff; box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1); border: 1px solid rgba(56, 138, 255, 0.2); - border-radius: 2px; } + border-radius: 2px; +} .gw-navbar-user-info-content--menu { background-color: #fff; - border-radius: 2px; } + border-radius: 2px; +} .gw-navbar-user-info-content-list-item { line-height: 20px; @@ -2744,82 +3387,99 @@ input::-webkit-calendar-picker-indicator { white-space: nowrap; overflow: hidden; text-align: left; - cursor: pointer; } + cursor: pointer; +} .gw-navbar-user-info-content-list-item .user-item-icon { width: 20px; margin-right: 10px; margin-left: 9px; - font-size: 18px; } + font-size: 18px; +} .gw-navbar-user-info-content-list-item .user-item-icon::before { - vertical-align: bottom; } + vertical-align: bottom; +} .gw-navbar-user-info-content-list-msg { display: flex; flex-direction: row; align-items: center; - padding: 12px 10px; } + padding: 12px 10px; +} .gw-navbar-user-info-content-list-msg .user-item-img { width: 38px; height: 38px; - margin-right: 10px; } + margin-right: 10px; +} .gw-navbar-user-info-content-list-msg .user-item-img img { display: block; width: 38px; height: 38px; - border-radius: 100%; } + border-radius: 100%; +} .gw-navbar-user-info-content-list-msg .user-item-data { font-size: 14px; font-weight: 400; - color: rgba(0, 0, 0, 0.8); } + color: rgba(0, 0, 0, 0.8); +} .gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section { font-size: 13px; - margin-top: 2px; } + margin-top: 2px; +} .gw-navbar-user-info-content-list-item.item-setting-list { color: rgba(0, 0, 0, 0.85); - padding: 0 14px; } + padding: 0 14px; +} .gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { display: flex; flex-direction: row; align-items: center; - padding: 12px 0; } + padding: 12px 0; +} .gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size { width: 14px; - height: 14px; } + height: 14px; +} .gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { width: 14px; - height: 14px; } + height: 14px; +} .dialog-user-edit { display: flex; flex-direction: row; align-items: center; padding: 16px 26px; - padding-left: 18px !important; } + padding-left: 18px !important; +} .dialog-user-edit .dialog-user-edit-icon { margin-right: 12px; font-size: 22px; - color: #f49730; } + color: #f49730; +} .dialog-user-edit .dialog-user-edit-text { font-size: 16px; - color: #000; } + color: #000; +} .gw-user-edit-dialog { - display: none; } + display: none; +} .gw-user-edit-dialog.show { - display: block; } + display: block; +} .gw-user-edit-modal { position: fixed; @@ -2829,14 +3489,16 @@ input::-webkit-calendar-picker-indicator { left: 0; z-index: 1050; overflow: hidden; - outline: 0; } + outline: 0; +} .gw-user-edit-modal .modal-dialog { transform: translate(0, 0); width: 420px; height: 180px; margin-left: -210px !important; - margin-top: -90px !important; } + margin-top: -90px !important; +} .edit-modal-dialog { position: absolute; @@ -2845,7 +3507,8 @@ input::-webkit-calendar-picker-indicator { left: 50%; top: 50%; margin-left: -210px; - margin-top: -90px; } + margin-top: -90px; +} .edit-modal-content { position: relative; @@ -2857,7 +3520,8 @@ input::-webkit-calendar-picker-indicator { border: 0 solid rgba(0, 0, 0, 0.2); border-radius: 2px; box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.2); - outline: 0; } + outline: 0; +} .edit-modal-header { display: flex; @@ -2869,46 +3533,55 @@ input::-webkit-calendar-picker-indicator { flex-shrink: 0; background: #fff; color: #000; - padding: 12px 8px 12px 18px; } + padding: 12px 8px 12px 18px; +} .edit-modal-title { margin-bottom: 0; line-height: 22px; - font-size: 16px; } + font-size: 16px; +} .edit-modal-actions { flex: 1; margin: -4px 0; display: flex; - justify-content: flex-end; } + justify-content: flex-end; +} .edit-modal-actions-close { padding: 2px; color: #bfbfbf; - cursor: pointer; } + cursor: pointer; +} .edit-modal-actions-close:hover { - color: rgba(0, 0, 0, 0.85); } + color: rgba(0, 0, 0, 0.85); +} .edit-modal-body { height: auto; - overflow: hidden; } + overflow: hidden; +} .edit-modal-footer { display: flex; align-items: center; justify-content: flex-end; flex-shrink: 0; - padding: 16px 20px 20px; } + padding: 16px 20px 20px; +} .edit-modal-footer .btn { margin-right: 8px; padding: 4px 15px; line-height: 20px !important; - font-size: 14px; } + font-size: 14px; +} .edit-modal-footer .btn:last-child { - margin-right: 0; } + margin-right: 0; +} .gw-user-edit-modal-backdrop { position: fixed; @@ -2917,43 +3590,50 @@ input::-webkit-calendar-picker-indicator { bottom: 0; left: 0; z-index: 1040; - background-color: rgba(0, 0, 0, 0.15); } + background-color: rgba(0, 0, 0, 0.15); +} .tab-list-menu-back { background: #FDFEFF; box-shadow: 0 0 10px 0 rgba(57, 66, 100, 0.1); - border-radius: 4px; } + border-radius: 4px; +} .tab-list-menu-back-item-name { font-family: PingFangSC-Regular; font-size: 14px; letter-spacing: -0.38px; text-align: right; - z-index: 980; } + z-index: 980; +} .tab-list-menu-back-item-out { height: 37.5px; border-radius: 4px; - margin: 0 3px 0 3px; } + margin: 0 3px 0 3px; +} .tab-list-menu-back-item-out-content { display: flex; flex-direction: row; align-items: center; - line-height: 37.5px; } + line-height: 37.5px; +} .tab-list-menu-whole { position: absolute; z-index: 1000; width: auto; top: 30px !important; - display: none; } + display: none; +} .tab-list-menu-whole-menu { position: absolute; z-index: 1000; width: auto; - top: 100% !important; } + top: 100% !important; +} .tab-list-menu-whole-menu-mask { overflow: hidden; @@ -2965,669 +3645,884 @@ input::-webkit-calendar-picker-indicator { z-index: 970; transform: translateX(-120%); background-color: transparent; - opacity: 0.4; } + opacity: 0.4; +} .tab-list-menu-whole-menu-mask-state-show { - transform: translateX(0%); } + transform: translateX(0%); +} .tab-list-menu-whole-menu-mask-state-hidden { - transform: translateX(-500%); } + transform: translateX(-500%); +} .gw-view-tiled--container { display: flex; flex-direction: column; flex-shrink: 1; flex-grow: 1; - flex-basis: 0; } - .gw-view-tiled--container .gw-view-tiled--nav { - display: flex; - flex-direction: row; - align-items: center; - padding: 10px 24px 8px; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select { - position: relative; - width: 218px; - margin-right: 18px; - background: #fff; - border: 1px solid rgba(0, 0, 0, 0.08); - border-radius: 2px; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select { - position: relative; - display: flex; - flex-direction: row; - align-items: center; - height: 28px; - padding: 0 36px 0 10px; - line-height: 28px; - cursor: pointer; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text { - font-size: 15px; - color: rgba(0, 0, 0, 0.85); - margin-right: 8px; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow { - position: absolute; - right: 0; - top: 1px; - width: 30px; - height: 26px; - cursor: pointer; - font-size: 12px; - color: rgba(0, 0, 0, 0.85); } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { - display: none; - position: absolute; - left: 0; - top: 30px; - width: 218px; - z-index: 999; - background: #fff; - box-shadow: 0 4px 6px 0 rgba(139, 139, 139, 0.1); - max-height: calc(100vh - 200px); - overflow: auto; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item { - height: 36px; - padding-left: 10px; - line-height: 36px; - font-size: 14px; - color: #333; - cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { - background-color: #ECF7FF; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true { - display: block; } - .gw-view-tiled--container .gw-view-tiled--content { - flex-shrink: 1; - flex-grow: 1; - flex-basis: 0; - padding: 16px 24px; - overflow-y: auto; } - .gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item { - display: inline-block; - position: relative; - width: 240px; - height: 80px; - padding: 17px 58px 17px 14px; - margin-right: 14px; - margin-bottom: 18px; - border: 1px solid #EBEEF2; - box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, 0.06); - border-radius: 2px; - transition: all 0.2s; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner { - display: flex; - flex-direction: row; - align-items: center; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon { - flex-shrink: 0; - width: 46px; - height: 46px; - margin-right: 10px; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img { - display: block; - width: 36px; - height: 36px; - margin: 5px auto; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title { - font-size: 14px; - color: rgba(0, 0, 0, 0.85); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after { - position: absolute; - content: '\e302'; - right: 10px; - top: 10px; - display: none; - width: 20px; - height: 20px; - line-height: 20px; - text-align: center; - cursor: pointer; - font-size: 14px; - color: #FFC43B; - font-family: FarrisExtend; - text-transform: none; - display: none; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after { - display: inline-block; - content: '\e303'; } - .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { - transform: translateY(-5px); - box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, 0.06); } - -.menu-search-wrapper { - height: 40px; - transition: all 0.2s linear; - transform: translateY(-40px); - margin: 0 24px 0 0; } - .menu-search-wrapper.f-state-focus { - transform: translateY(0); } - .menu-search-wrapper .menu-search--placerholder { - position: relative; - height: 40px; - line-height: 40px; - padding-right: 22px; - text-align: right; } - .menu-search-wrapper .menu-search--placerholder .f-icon-search { - margin-right: 10px; - color: #fff; } - .menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text { - display: inline-block; - line-height: 18px; - font-size: 13px; - color: rgba(255, 255, 255, 0.49); } - .menu-search-wrapper .menu-search--placerholder::after { - content: ''; - position: absolute; - right: 0; - top: 50%; - width: 1px; - height: 16px; - margin-top: -8px; - background: rgba(255, 255, 255, 0.5); } - .menu-search-wrapper .menu-search--search { - display: flex; - flex-direction: row; - align-items: center; - flex-wrap: nowrap; - height: 40px; } - .menu-search-wrapper .menu-search--search .menu-search--search-select { - position: relative; - padding: 0 8px 0 16px; - height: 40px; - line-height: 40px; - cursor: pointer; } - .menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text { - font-size: 14px; - color: rgba(255, 255, 255, 0.85); } - .menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow { - margin-left: 5px; - font-size: 14px; - color: #fff; } - .menu-search-wrapper .menu-search--search .menu-search--search-select::after { - content: ''; - position: absolute; - right: 0; - top: 50%; - width: 1px; - height: 16px; - margin-top: -8px; - background: rgba(255, 255, 255, 0.3); } - .menu-search-wrapper .menu-search--search .menu-search--search-form { - display: flex; - flex-direction: row; - align-items: center; - flex-wrap: nowrap; - height: 40px; - padding: 0 6px; } - .menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input { - display: block; - height: 40px; - line-height: 40px; - font-size: 14px; - border: 0; - box-shadow: none; - font-size: 14px; - color: #fff; - background: transparent; } - .menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append { - padding-right: 13px; - height: 40px; - line-height: 40px; - color: #fff; - cursor: pointer; } - .menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear { - position: relative; - padding-left: 13px; - color: #fff; - cursor: pointer; } - .menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after { - content: ''; - position: absolute; - left: 0; - top: 50%; - width: 1px; - height: 16px; - margin-top: -8px; - background: rgba(255, 255, 255, 0.3); } - -.menu-colllection-wrapper .dropdown-toggle::after { - display: none; } + flex-basis: 0; +} -.menu-colllection-wrapper .menu-colllection--detail { - width: 280px; } - .menu-colllection-wrapper .menu-colllection--detail-title { - padding: 6px 16px 8px 16px; - font-size: 13px; - color: rgba(0, 0, 0, 0.6); } - .menu-colllection-wrapper .menu-colllection--detail-item { - display: flex; - flex-direction: row; - align-items: center; - padding: 11px 15px; - cursor: pointer; } - .menu-colllection-wrapper .menu-colllection--detail-item .item-img { - width: 28px; - height: 28px; } - .menu-colllection-wrapper .menu-colllection--detail-item .item-img img { - display: block; - width: 28px; - height: 28px; } - .menu-colllection-wrapper .menu-colllection--detail-item .item-content { - flex: 1; - padding-left: 14px; - overflow: hidden; } - .menu-colllection-wrapper .menu-colllection--detail-item .item-content-title { - margin-bottom: 3px; - line-height: 18px; - font-size: 13px; - color: rgba(0, 0, 0, 0.85); - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; } - .menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle { - line-height: 16px; - font-size: 12px; - color: rgba(0, 0, 0, 0.3); - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; } +.gw-view-tiled--container .gw-view-tiled--nav { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 24px 8px; +} -.gw-single-app-wrapper { +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select { position: relative; - width: 198px; - height: 116px; - padding: 12px 18px; - margin-right: 14px; - margin-bottom: 14px; - background: #FFFFFF; - border: 1px solid #EBEEF2; - box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, 0.06); + width: 218px; + margin-right: 18px; + background: #fff; + border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 2px; - transition: all 0.2s; } - .gw-single-app-wrapper:hover { - transform: translateY(-5px); - box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, 0.06); } +} -.gw-single-app--title { - padding-right: 20px; - margin-bottom: 4px; - font-size: 14px; +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + height: 28px; + padding: 0 36px 0 10px; + line-height: 28px; + cursor: pointer; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text { + font-size: 15px; color: rgba(0, 0, 0, 0.85); - overflow: hidden; + margin-right: 8px; text-overflow: ellipsis; - white-space: nowrap; } - -.gw-single-app--subtitle { - font-size: 12px; - color: rgba(0, 0, 0, 0.45); + white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } +} -.gw-single-app--icon-container { +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow { position: absolute; - right: 14px; - bottom: 12px; } - .gw-single-app--icon-container img { - width: 36px; - height: 36px; } + right: 0; + top: 1px; + width: 30px; + height: 26px; + cursor: pointer; + font-size: 12px; + color: rgba(0, 0, 0, 0.85); +} -.gw-app-group--header { - display: flex; - flex-direction: row; +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { + display: none; + position: absolute; + left: 0; + top: 30px; + width: 218px; + z-index: 999; + background: #fff; + box-shadow: 0 4px 6px 0 rgba(139, 139, 139, 0.1); + max-height: calc(100vh - 200px); + overflow: auto; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item { + height: 36px; + padding-left: 10px; + line-height: 36px; + font-size: 14px; + color: #333; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { + background-color: #ECF7FF; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true { + display: block; +} + +.gw-view-tiled--container .gw-view-tiled--content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 16px 24px; + overflow-y: auto; +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item { + display: inline-block; + position: relative; + width: 240px; + height: 80px; + padding: 17px 58px 17px 14px; + margin-right: 14px; + margin-bottom: 18px; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, 0.06); + border-radius: 2px; + transition: all 0.2s; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner { + display: flex; + flex-direction: row; + align-items: center; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon { + flex-shrink: 0; + width: 46px; + height: 46px; + margin-right: 10px; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img { + display: block; + width: 36px; + height: 36px; + margin: 5px auto; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title { + font-size: 14px; + color: rgba(0, 0, 0, 0.85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after { + position: absolute; + content: '\e302'; + right: 10px; + top: 10px; + display: none; + width: 20px; + height: 20px; + line-height: 20px; + text-align: center; + cursor: pointer; + font-size: 14px; + color: #FFC43B; + font-family: FarrisExtend; + text-transform: none; + display: none; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after { + display: inline-block; + content: '\e303'; +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, 0.06); +} + +.menu-search-wrapper { + height: 40px; + transition: all 0.2s linear; + transform: translateY(-40px); + margin: 0 24px 0 0; +} + +.menu-search-wrapper.f-state-focus { + transform: translateY(0); +} + +.menu-search-wrapper .menu-search--placerholder { + position: relative; + height: 40px; + line-height: 40px; + padding-right: 22px; + text-align: right; +} + +.menu-search-wrapper .menu-search--placerholder .f-icon-search { + margin-right: 10px; + color: #fff; +} + +.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text { + display: inline-block; + line-height: 18px; + font-size: 13px; + color: rgba(255, 255, 255, 0.49); +} + +.menu-search-wrapper .menu-search--placerholder::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, 0.5); +} + +.menu-search-wrapper .menu-search--search { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select { + position: relative; + padding: 0 8px 0 16px; + height: 40px; + line-height: 40px; + cursor: pointer; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text { + font-size: 14px; + color: rgba(255, 255, 255, 0.85); +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow { + margin-left: 5px; + font-size: 14px; + color: #fff; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, 0.3); +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px; + padding: 0 6px; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input { + display: block; + height: 40px; + line-height: 40px; + font-size: 14px; + border: 0; + box-shadow: none; + font-size: 14px; + color: #fff; + background: transparent; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append { + padding-right: 13px; + height: 40px; + line-height: 40px; + color: #fff; + cursor: pointer; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear { + position: relative; + padding-left: 13px; + color: #fff; + cursor: pointer; +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, 0.3); +} + +.menu-colllection-wrapper .dropdown-toggle::after { + display: none; +} + +.menu-colllection-wrapper .menu-colllection--detail { + width: 280px; +} + +.menu-colllection-wrapper .menu-colllection--detail-title { + padding: 6px 16px 8px 16px; + font-size: 13px; + color: rgba(0, 0, 0, 0.6); +} + +.menu-colllection-wrapper .menu-colllection--detail-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 11px 15px; + cursor: pointer; +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img { + width: 28px; + height: 28px; +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img img { + display: block; + width: 28px; + height: 28px; +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content { + flex: 1; + padding-left: 14px; + overflow: hidden; +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title { + margin-bottom: 3px; + line-height: 18px; + font-size: 13px; + color: rgba(0, 0, 0, 0.85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle { + line-height: 16px; + font-size: 12px; + color: rgba(0, 0, 0, 0.3); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.gw-single-app-wrapper { + position: relative; + width: 198px; + height: 116px; + padding: 12px 18px; + margin-right: 14px; + margin-bottom: 14px; + background: #FFFFFF; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, 0.06); + border-radius: 2px; + transition: all 0.2s; +} + +.gw-single-app-wrapper:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, 0.06); +} + +.gw-single-app--title { + padding-right: 20px; + margin-bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, 0.85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.gw-single-app--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, 0.45); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.gw-single-app--icon-container { + position: absolute; + right: 14px; + bottom: 12px; +} + +.gw-single-app--icon-container img { + width: 36px; + height: 36px; +} + +.gw-app-group--header { + display: flex; + flex-direction: row; align-items: center; padding-bottom: 14px; - margin-right: 10px; } - .gw-app-group--header .header--icon-container { - width: 20px; - height: 20px; - margin: 0 10px 0 0; - line-height: 20px; } - .gw-app-group--header .header--icon-container .header--icon { - font-size: 20px; - color: rgba(0, 0, 0, 0.45); } - .gw-app-group--header .header--title { - margin-right: 6px; - font-size: 14px; - color: rgba(0, 0, 0, 0.75); - margin-right: 6px; } - .gw-app-group--header .header--subtitle { - font-size: 12px; - color: rgba(0, 0, 0, 0.3); } + margin-right: 10px; +} + +.gw-app-group--header .header--icon-container { + width: 20px; + height: 20px; + margin: 0 10px 0 0; + line-height: 20px; +} + +.gw-app-group--header .header--icon-container .header--icon { + font-size: 20px; + color: rgba(0, 0, 0, 0.45); +} + +.gw-app-group--header .header--title { + margin-right: 6px; + font-size: 14px; + color: rgba(0, 0, 0, 0.75); + margin-right: 6px; +} + +.gw-app-group--header .header--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, 0.3); +} + +.gw-app-group-wrapper { + padding: 10px 0 0; +} + +.gw-app-group--list { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-bottom: 0; +} + +.gw-apps-management { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + overflow: hidden; + display: flex; + flex-direction: column; + position: fixed; + top: 40px; + bottom: 0px; + left: 0px; + right: 0px; + z-index: 1000; + background-color: rgba(0, 0, 0, 0.15); +} + +.gw-apps-management .gw-apps-management--close { + position: absolute; + right: 24px; + top: 17px; + width: 22px; + height: 22px; + cursor: pointer; +} + +.gw-apps-management .gw-apps-management--close .f-icon { + font-size: 22px; + color: rgba(0, 0, 0, 0.06); +} + +.gw-apps-management .gw-apps-management--close:hover .f-icon { + color: rgba(0, 0, 0, 0.25); +} + +.gw-apps-management--header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + padding: 10px 56px 10px 21px; +} + +.gw-apps-management--header .header--caption { + display: flex; + flex-direction: row; + align-items: center; +} + +.gw-apps-management--header .header--caption .header--caption-logo { + padding-right: 11px; +} + +.gw-apps-management--header .header--caption .header--caption-logo img { + display: block; + width: 30px; + height: 30px; +} + +.gw-apps-management--header .header--caption .header--caption-title { + font-size: 18px; + color: #000000; +} + +.gw-apps-management--header .header--search { + position: relative; + max-width: 508px; + height: 36px; + padding: 0 14px 0 34px; + margin: 0 auto; + border-radius: 18px; +} + +.gw-apps-management--header .header--search .search--input { + display: block; + height: 34px; + font-size: 14px; + border: 0; + box-shadow: none; + font-size: 14px; + color: rgba(0, 0, 0, 0.85); +} + +.gw-apps-management--header .header--search .search--append { + position: absolute; + left: 14px; + top: 0; +} + +.gw-apps-management--header .header--search .search--append .f-icon { + display: block; + height: 34px; + line-height: 34px; + font-size: 18px; +} + +.gw-apps-management--header .header--search .search--placeholder { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + position: absolute; + left: -1px; + top: -1px; + width: calc(100% + 2px); + height: 36px; + line-height: 36px; + border-radius: 18px; +} + +.gw-apps-management--header .header--search .search--placeholder .f-icon { + display: block; + margin-right: 14px; + color: #979797; +} + +.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text { + font-size: 14px; + color: rgba(0, 0, 0, 0.25); +} + +.gw-apps-management--header .header--search .search--result-panel { + position: absolute; + top: 40px; + left: 0; + right: 0; + padding: 10px 18px 0; + background: #FFFFFF; + border: 1px solid rgba(56, 138, 255, 0.2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1); + border-radius: 2px; + border-radius: 2px; + z-index: 100; + max-height: 310px; + overflow-y: auto; +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-title { + font-size: 13px; + color: rgba(0, 0, 0, 0.6); +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list { + margin: 8px -18px; +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + list-style: none; + height: 30px; + line-height: 30px; + padding: 0 18px; + cursor: pointer; +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name { + display: flex; + flex-direction: row; + align-items: center; + font-size: 14px; + color: rgba(0, 0, 0, 0.85); +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding-left: 16px; + font-size: 12px; + color: rgba(0, 0, 0, 0.45); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-more { + height: 40px; + line-height: 40px; + text-align: center; + border-top: 1px solid #ECECEC; + font-size: 12px; + color: rgba(0, 0, 0, 0.75); + cursor: pointer; + margin: 0 -18px; +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap; + margin-top: 14px; +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item { + height: 20px; + padding: 0 10px; + margin: 0 10px 14px 0; + background: rgba(219, 224, 230, 0.5); + border-radius: 13px; + font-size: 13px; + line-height: 20px; + color: #8A96A5; + list-style: none; + cursor: pointer; +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + color: #fff; + box-shadow: 0 2px 4px 0 rgba(25, 76, 164, 0.09); +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match { + color: #fff; +} + +.gw-apps-management--header .header--search .search--prompt-panel { + padding-bottom: 14px; +} + +.gw-apps-management--header .header--view { + flex-shrink: 0; + display: flex; + flex-direction: row; + align-items: center; +} + +.gw-apps-management--header .header--view .view--btn { + text-align: center; + white-space: nowrap; + vertical-align: middle; + padding: 0 10px; + line-height: 28px; + background: rgba(240, 240, 240, 0.6); + margin-left: -1px; + cursor: pointer; +} + +.gw-apps-management--header .header--view .view--btn .view--btn-icon { + font-size: 13px; + color: rgba(0, 0, 0, 0.2); +} + +.gw-apps-management--header .header--view .view--btn.active { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.06); +} + +.gw-apps-management--header .header--view .view--btn.active .view--btn-icon { + color: #fff; +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.06); + position: relative; +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon { + color: #fff; +} + +.gw-apps-management--header .header--view .view--btn:first-child { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} + +.gw-apps-management--header .header--view .view--btn:last-child { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} + +.gw-apps-management--header .header--settings { + position: relative; +} + +.gw-apps-management--header .header--settings .header--settings-icon { + display: inline-block; + height: 28px; + width: 48px; + text-align: center; + line-height: 28px; + color: #979797; + cursor: pointer; +} + +.gw-apps-management--header .header--settings .header--settings-panel { + position: absolute; + background: #FFFFFF; + border: 1px solid rgba(56, 138, 255, 0.2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1); + border-radius: 2px; + padding: 16px 14px; + top: 34px; + width: 162px; + right: 0; + opacity: 0; + transition: opacity 0.1s linear; +} -.gw-app-group-wrapper { - padding: 10px 0 0; } +.gw-apps-management--header .header--settings .header--settings-panel.f-state-show { + opacity: 1; +} -.gw-app-group--list { - display: flex; - flex-direction: row; - flex-wrap: wrap; - padding-bottom: 0; } +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow { + width: 16px; + height: 8px; + margin: 0 2px; + position: absolute; + top: -8px; + right: 13px; +} -.gw-apps-management { - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; - overflow: hidden; - display: flex; - flex-direction: column; - position: fixed; - top: 40px; - bottom: 0px; - left: 0px; - right: 0px; - z-index: 1000; - background-color: rgba(0, 0, 0, 0.15); } - .gw-apps-management .gw-apps-management--close { - position: absolute; - right: 24px; - top: 17px; - width: 22px; - height: 22px; - cursor: pointer; } - .gw-apps-management .gw-apps-management--close .f-icon { - font-size: 22px; - color: rgba(0, 0, 0, 0.06); } - .gw-apps-management .gw-apps-management--close:hover .f-icon { - color: rgba(0, 0, 0, 0.25); } +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before { + content: ''; + position: absolute; + border-width: 0 .5rem .5rem; + border-color: transparent; + border-style: solid; + border-bottom-color: rgba(56, 138, 255, 0.2); + top: 0; +} -.gw-apps-management--header { +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after { + content: ''; + position: absolute; + border-color: transparent; + border-style: solid; + border-width: 0 .5rem .5rem; + top: 1px; + border-bottom-color: #fff; +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content { + font-size: 13px; + color: rgba(0, 0, 0, 0.8); +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item { display: flex; - flex-direction: row; - flex-wrap: nowrap; align-items: center; - padding: 10px 56px 10px 21px; } - .gw-apps-management--header .header--caption { - display: flex; - flex-direction: row; - align-items: center; } - .gw-apps-management--header .header--caption .header--caption-logo { - padding-right: 11px; } - .gw-apps-management--header .header--caption .header--caption-logo img { - display: block; - width: 30px; - height: 30px; } - .gw-apps-management--header .header--caption .header--caption-title { - font-size: 18px; - color: #000000; } - .gw-apps-management--header .header--search { - position: relative; - max-width: 508px; - height: 36px; - padding: 0 14px 0 34px; - margin: 0 auto; - border-radius: 18px; } - .gw-apps-management--header .header--search .search--input { - display: block; - height: 34px; - font-size: 14px; - border: 0; - box-shadow: none; - font-size: 14px; - color: rgba(0, 0, 0, 0.85); } - .gw-apps-management--header .header--search .search--append { - position: absolute; - left: 14px; - top: 0; } - .gw-apps-management--header .header--search .search--append .f-icon { - display: block; - height: 34px; - line-height: 34px; - font-size: 18px; } - .gw-apps-management--header .header--search .search--placeholder { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - position: absolute; - left: -1px; - top: -1px; - width: calc(100% + 2px); - height: 36px; - line-height: 36px; - border-radius: 18px; } - .gw-apps-management--header .header--search .search--placeholder .f-icon { - display: block; - margin-right: 14px; - color: #979797; } - .gw-apps-management--header .header--search .search--placeholder .search--placeholder-text { - font-size: 14px; - color: rgba(0, 0, 0, 0.25); } - .gw-apps-management--header .header--search .search--result-panel { - position: absolute; - top: 40px; - left: 0; - right: 0; - padding: 10px 18px 0; - background: #FFFFFF; - border: 1px solid rgba(56, 138, 255, 0.2); - box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1); - border-radius: 2px; - border-radius: 2px; - z-index: 100; - max-height: 310px; - overflow-y: auto; } - .gw-apps-management--header .header--search .search--result-panel .search--result-title { - font-size: 13px; - color: rgba(0, 0, 0, 0.6); } - .gw-apps-management--header .header--search .search--result-panel .search--result-list { - margin: 8px -18px; } - .gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item { - display: flex; - flex-direction: row; - align-items: center; - flex-wrap: nowrap; - list-style: none; - height: 30px; - line-height: 30px; - padding: 0 18px; - cursor: pointer; } - .gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name { - display: flex; - flex-direction: row; - align-items: center; - font-size: 14px; - color: rgba(0, 0, 0, 0.85); } - .gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path { - flex-grow: 1; - flex-shrink: 1; - flex-basis: 0; - padding-left: 16px; - font-size: 12px; - color: rgba(0, 0, 0, 0.45); - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; } - .gw-apps-management--header .header--search .search--result-panel .search--result-more { - height: 40px; - line-height: 40px; - text-align: center; - border-top: 1px solid #ECECEC; - font-size: 12px; - color: rgba(0, 0, 0, 0.75); - cursor: pointer; - margin: 0 -18px; } - .gw-apps-management--header .header--search .search--result-panel .search--prompt-list { - display: flex; - flex-direction: row; - align-items: center; - flex-wrap: wrap; - margin-top: 14px; } - .gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item { - height: 20px; - padding: 0 10px; - margin: 0 10px 14px 0; - background: rgba(219, 224, 230, 0.5); - border-radius: 13px; - font-size: 13px; - line-height: 20px; - color: #8A96A5; - list-style: none; - cursor: pointer; } - .gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { - color: #fff; - box-shadow: 0 2px 4px 0 rgba(25, 76, 164, 0.09); } - .gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match { - color: #fff; } - .gw-apps-management--header .header--search .search--prompt-panel { - padding-bottom: 14px; } - .gw-apps-management--header .header--view { - flex-shrink: 0; - display: flex; - flex-direction: row; - align-items: center; } - .gw-apps-management--header .header--view .view--btn { - text-align: center; - white-space: nowrap; - vertical-align: middle; - padding: 0 10px; - line-height: 28px; - background: rgba(240, 240, 240, 0.6); - margin-left: -1px; - cursor: pointer; } - .gw-apps-management--header .header--view .view--btn .view--btn-icon { - font-size: 13px; - color: rgba(0, 0, 0, 0.2); } - .gw-apps-management--header .header--view .view--btn.active { - border-radius: 2px; - box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.06); } - .gw-apps-management--header .header--view .view--btn.active .view--btn-icon { - color: #fff; } - .gw-apps-management--header .header--view .view--btn:hover:not(.active) { - border-radius: 2px; - box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.06); - position: relative; } - .gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon { - color: #fff; } - .gw-apps-management--header .header--view .view--btn:first-child { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; } - .gw-apps-management--header .header--view .view--btn:last-child { - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .gw-apps-management--header .header--settings { - position: relative; } - .gw-apps-management--header .header--settings .header--settings-icon { - display: inline-block; - height: 28px; - width: 48px; - text-align: center; - line-height: 28px; - color: #979797; - cursor: pointer; } - .gw-apps-management--header .header--settings .header--settings-panel { - position: absolute; - background: #FFFFFF; - border: 1px solid rgba(56, 138, 255, 0.2); - box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.1); - border-radius: 2px; - padding: 16px 14px; - top: 34px; - width: 162px; - right: 0; - opacity: 0; - transition: opacity 0.1s linear; } - .gw-apps-management--header .header--settings .header--settings-panel.f-state-show { - opacity: 1; } - .gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow { - width: 16px; - height: 8px; - margin: 0 2px; - position: absolute; - top: -8px; - right: 13px; } - .gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before { - content: ''; - position: absolute; - border-width: 0 .5rem .5rem; - border-color: transparent; - border-style: solid; - border-bottom-color: rgba(56, 138, 255, 0.2); - top: 0; } - .gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after { - content: ''; - position: absolute; - border-color: transparent; - border-style: solid; - border-width: 0 .5rem .5rem; - top: 1px; - border-bottom-color: #fff; } - .gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content { - font-size: 13px; - color: rgba(0, 0, 0, 0.8); } - .gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item { - display: flex; - align-items: center; - justify-content: space-between; } + justify-content: space-between; +} .gw-apps-management--content { overflow-y: auto; flex-shrink: 1; flex-grow: 1; flex-basis: 0; - padding: 20px 0 20px 24px; } - .gw-apps-management--content::-webkit-scrollbar { - width: 7px; - height: 7px; - background-color: #8e8e8e; } - .gw-apps-management--content::-webkit-scrollbar-track { - border-radius: 0; - background-color: #fff; - border: none; - background-clip: padding-box; - border-right: none; } - .gw-apps-management--content::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: #dbdbdb; - border: none; - background-clip: content-box; - opacity: .6; - transform: rotate(90deg); - border-radius: 3px; } + padding: 20px 0 20px 24px; +} + +.gw-apps-management--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e; +} + +.gw-apps-management--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none; +} + +.gw-apps-management--content::-webkit-scrollbar-thumb { + border-radius: 0; + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px; +} .search--result-item-keyboard--control { display: flex; @@ -3638,17 +4533,21 @@ input::-webkit-calendar-picker-indicator { height: 30px; line-height: 30px; padding: 0 18px; - cursor: pointer; } + cursor: pointer; +} .launchpad-full-view { - margin-right: 16px; } + margin-right: 16px; +} .launchpad-full-icon { - transform: rotate(180deg); } + transform: rotate(180deg); +} .launchpad-full { margin-bottom: 2px; - cursor: pointer; } + cursor: pointer; +} .gw-switch { position: relative; @@ -3663,249 +4562,358 @@ input::-webkit-calendar-picker-indicator { min-width: 32px; height: 18px; border-radius: 20px; - background-color: #d9d9d9; } - .gw-switch.f-state-checked { - background: #49C265; } - .gw-switch.f-state-checked small { - right: 2px; - left: auto; } - .gw-switch small { - left: 2px; - border-radius: 100%; - position: absolute; - top: 1px; - transition: 0.2s ease-out all; - -webkit-transition: 0.3s ease-out all; - background: #fff; - width: 16px; - height: 16px; - font-size: 80%; } + background-color: #d9d9d9; +} + +.gw-switch.f-state-checked { + background: #49C265; +} + +.gw-switch.f-state-checked small { + right: 2px; + left: auto; +} + +.gw-switch small { + left: 2px; + border-radius: 100%; + position: absolute; + top: 1px; + transition: 0.2s ease-out all; + -webkit-transition: 0.3s ease-out all; + background: #fff; + width: 16px; + height: 16px; + font-size: 80%; +} .f-component-walk-page.active { - display: block; } + display: block; +} .f-component-walk-page .f-page-walker-detail-wrapper { position: absolute; - z-index: 333333; } + z-index: 333333; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-img { + background: transparent; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content { + position: absolute; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-right { + left: calc(100% + 6px); + top: -13px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-left { + right: calc(100% + 6px); + top: -13px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom, +.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom { + top: calc(100% + 6px); + left: 0; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-top { + bottom: calc(100% + 6px); + left: 0; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow { + position: absolute; + display: block; + width: 12px; + height: 16px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default { + box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.15); + border-radius: 2px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top { + margin-bottom: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow { + bottom: -12px; + left: 12px; + width: 16px; + height: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { + border-width: 10px 8px 0; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { + bottom: 2px; + border-top-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right { + margin-left: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow { + left: -12px; + top: 28px; + width: 12px; + height: 16px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { + border-width: 8px 10px 8px 0; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { + left: 2px; + border-right-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom { + margin-top: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow { + top: -12px; + left: 12px; + width: 16px; + height: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px 8px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left { + margin-right: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow { + top: 28px; + right: -12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { + border-width: 8px 0 8px 10px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { + right: 2px; + border-left-color: #fff; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom { + margin-top: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow { + top: -12px; + right: 12px; + width: 16px; + height: 12px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px 8px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default { + box-shadow: 0 2px 10px 0 rgba(38, 40, 56, 0.23); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner { + position: relative; + display: flex; + flex-direction: column; + min-width: 419px; + min-height: 165px; + padding: 24px 12px; + background-color: #fff; + border-radius: 3px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content { + position: relative; + min-height: 60px; + padding-left: 74px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img { + position: absolute; + left: 0; + top: 0; + width: 60px; + height: 60px; + border-radius: 3px; + overflow: hidden; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img { + display: block; + width: 60px; + height: 60px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title { + display: flex; + flex-direction: row; + align-items: center; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number { + flex-shrink: 0; + padding-right: 6px; + font-size: 12px; + color: rgba(0, 0, 0, 0.85); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current { + font-size: 16px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text { + font-size: 16px; + color: rgba(0, 0, 0, 0.85); + font-weight: 600; + white-space: nowrap; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + margin-top: 6px; + font-size: 13px; + min-height: 44px; + color: rgba(0, 0, 0, 0.65); + line-height: 22px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns { + display: flex; + flex-direction: row; + align-items: center; + padding-top: 17px; + padding-right: 10px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn { + flex-grow: 1; + flex-shrink: 0; + flex-basis: 0; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn { + margin-right: 6px; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child { + margin-right: 0; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close { + position: absolute; + right: 10px; + top: 10px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + cursor: pointer; +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon { + font-size: 18px; + color: rgba(0, 0, 0, 0.45); +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon { + color: rgba(0, 0, 0, 0.85); +} -.f-component-walk-page .f-page-walker-detail-wrapper-img { - background: transparent; } +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip { + display: flex; + flex-direction: row; + align-items: center; + padding-left: 74px; + background-color: #fff; +} -.f-component-walk-page .f-page-walker-detail-wrapper-content { - position: absolute; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-right { - left: calc(100% + 6px); - top: -13px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-left { - right: calc(100% + 6px); - top: -13px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-bottom, .f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom { - top: calc(100% + 6px); - left: 0; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-top { - bottom: calc(100% + 6px); - left: 0; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow { - position: absolute; - display: block; - width: 12px; - height: 16px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after { - position: absolute; - display: block; - content: ""; - border-color: transparent; - border-style: solid; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default { - box-shadow: 0 3px 10px 0 rgba(0, 0, 0, 0.15); - border-radius: 2px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top { - margin-bottom: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow { - bottom: -12px; - left: 12px; - width: 16px; - height: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { - border-width: 10px 8px 0; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { - bottom: 2px; - border-top-color: #fff; - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right { - margin-left: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow { - left: -12px; - top: 28px; - width: 12px; - height: 16px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { - border-width: 8px 10px 8px 0; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { - left: 2px; - border-right-color: #fff; - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom { - margin-top: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow { - top: -12px; - left: 12px; - width: 16px; - height: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { - border-width: 0 8px 10px 8px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { - top: 2px; - border-bottom-color: #fff; - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left { - margin-right: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow { - top: 28px; - right: -12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { - border-width: 8px 0 8px 10px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { - right: 2px; - border-left-color: #fff; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom { - margin-top: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow { - top: -12px; - right: 12px; - width: 16px; - height: 12px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { - border-width: 0 8px 10px 8px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { - top: 2px; - border-bottom-color: #fff; - box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.08); } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default { - box-shadow: 0 2px 10px 0 rgba(38, 40, 56, 0.23); } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner { - position: relative; - display: flex; - flex-direction: column; - min-width: 419px; - min-height: 165px; - padding: 24px 12px; - background-color: #fff; - border-radius: 3px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content { - position: relative; - min-height: 60px; - padding-left: 74px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img { - position: absolute; - left: 0; - top: 0; - width: 60px; - height: 60px; - border-radius: 3px; - overflow: hidden; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img { - display: block; - width: 60px; - height: 60px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title { - display: flex; - flex-direction: row; - align-items: center; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number { - flex-shrink: 0; - padding-right: 6px; - font-size: 12px; - color: rgba(0, 0, 0, 0.85); } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current { - font-size: 16px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text { - font-size: 16px; - color: rgba(0, 0, 0, 0.85); - font-weight: 600; - white-space: nowrap; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle { - flex-shrink: 1; - flex-grow: 1; - flex-basis: 0; - margin-top: 6px; - font-size: 13px; - min-height: 44px; - color: rgba(0, 0, 0, 0.65); - line-height: 22px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns { - display: flex; - flex-direction: row; - align-items: center; - padding-top: 17px; - padding-right: 10px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn { - flex-grow: 1; - flex-shrink: 0; - flex-basis: 0; - display: flex; - flex-direction: row; - align-items: center; - justify-content: flex-end; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn { - margin-right: 6px; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child { - margin-right: 0; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close { - position: absolute; - right: 10px; - top: 10px; - width: 30px; - height: 30px; - line-height: 30px; - text-align: center; - cursor: pointer; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon { - font-size: 18px; - color: rgba(0, 0, 0, 0.45); } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon { - color: rgba(0, 0, 0, 0.85); } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip { - display: flex; - flex-direction: row; - align-items: center; - padding-left: 74px; - background-color: #fff; } - .f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn { - color: rgba(0, 0, 0, 0.35); } +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn { + color: rgba(0, 0, 0, 0.35); +} .user-setting { position: absolute; top: 0; right: 0; bottom: 0; - left: 0; } + left: 0; +} .user-setting-list { width: 286px; min-width: 286px; background-color: #fff; overflow-y: auto; - overflow-x: hidden; } + overflow-x: hidden; +} .user-setting-list .user-setting-message { padding-bottom: 32px; - padding-top: 32px; } + padding-top: 32px; +} .user-setting-list .user-setting-message .user-avatar { width: 86px; height: 86px; margin: 0 auto 18px; - position: relative; } + position: relative; +} .user-setting-list .user-setting-message .user-avatar .user-avatar-img { display: block; width: 86px; height: 86px; - border-radius: 100%; } + border-radius: 100%; +} .user-setting-list .user-setting-message .user-avatar .user-avatar-icon { position: absolute; @@ -3917,14 +4925,17 @@ input::-webkit-calendar-picker-indicator { left: 0px; line-height: 86px; text-align: center; - display: none; } + display: none; +} .user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon { - display: block; } + display: block; +} .user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon { font-size: 24px; - color: #fff; } + color: #fff; +} .user-setting-list .user-setting-message .user-avatar .user-avatar-sex { position: absolute; @@ -3936,27 +4947,33 @@ input::-webkit-calendar-picker-indicator { bottom: 0; border-radius: 100%; color: #fff; - text-align: center; } + text-align: center; +} .user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon { font-size: 12px; - vertical-align: initial; } + vertical-align: initial; +} .user-setting-list .user-setting-message .user-title { - text-align: center; } + text-align: center; +} .user-setting-list .user-setting-message .user-title .user-name { font-size: 16px; color: rgba(0, 0, 0, 0.75); - margin-bottom: 6px; } + margin-bottom: 6px; +} .user-setting-list .user-setting-message .user-title .user-post { font-size: 12px; - color: rgba(0, 0, 0, 0.45); } + color: rgba(0, 0, 0, 0.45); +} .user-setting-list .user-setting-menu { padding: 24px 0; - border-top: 1px solid #f0f0f0; } + border-top: 1px solid #f0f0f0; +} .user-setting-list .user-setting-menu .menu-item-inner { width: 286px; @@ -3964,38 +4981,45 @@ input::-webkit-calendar-picker-indicator { line-height: 48px; padding-left: 38px; padding-right: 20px; - cursor: pointer; } + cursor: pointer; +} .user-setting-list .user-setting-menu .menu-item-inner.active { - padding-left: 35px; } + padding-left: 35px; +} .user-setting-list .user-setting-menu .menu-item-inner .menu-item-title { display: flex; flex-direction: row; - align-items: center; } + align-items: center; +} .user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon { - margin-right: 18px; } + margin-right: 18px; +} .user-setting-list .user-setting-menu .menu-item-inner .menu-item-text { font-size: 14px; color: rgba(0, 0, 0, 0.75); white-space: nowrap; overflow: hidden; - text-overflow: ellipsis; } + text-overflow: ellipsis; +} .user-setting-content { flex-grow: 1; padding: 10px; overflow-x: auto; overflow-y: hidden; - padding-top: 0; } + padding-top: 0; +} .user-setting-content-inner { height: 100%; background: #fff; padding: 24px; - overflow-y: auto; } + overflow-y: auto; +} .user-setting-content-wrapper-title { color: #000; @@ -4005,7 +5029,8 @@ input::-webkit-calendar-picker-indicator { position: relative; overflow: hidden; padding: 0 0 0 1rem; - min-width: 760px; } + min-width: 760px; +} .user-setting-content-wrapper-title::before { content: ''; @@ -4015,7 +5040,8 @@ input::-webkit-calendar-picker-indicator { position: absolute; top: 50%; left: 0; - margin-top: -.5625rem; } + margin-top: -.5625rem; +} .user-setting-content-wrapper-title .title-text { font-size: 1rem; @@ -4024,27 +5050,33 @@ input::-webkit-calendar-picker-indicator { white-space: nowrap; text-overflow: ellipsis; margin-bottom: 0; - margin-right: 10px; } + margin-right: 10px; +} .user-setting-content-wrapper-title .title-line { flex-grow: 1; - border-bottom: 1px dashed rgba(0, 0, 0, 0.1); } + border-bottom: 1px dashed rgba(0, 0, 0, 0.1); +} .user-setting-content-wrapper-title .title-edit-btn { font-size: 14px; padding-left: 10px; - cursor: pointer; } + cursor: pointer; +} .user-setting-content-wrapper-title .title-edit-btn .f-icon { font-size: 14px; margin-right: 4px; - vertical-align: inherit; } + vertical-align: inherit; +} .user-setting-content-wrapper-main { - padding: 27px 0 32px 0; } + padding: 27px 0 32px 0; +} .user-setting-content-wrapper-main .user-setting-form { - padding-left: 0; } + padding-left: 0; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap { max-width: 25rem; @@ -4054,10 +5086,12 @@ input::-webkit-calendar-picker-indicator { flex-basis: auto; flex-flow: row wrap; align-items: center; - margin-bottom: 0.875rem; } + margin-bottom: 0.875rem; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns { - margin-bottom: 0; } + margin-bottom: 0; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label { display: flex; @@ -4071,72 +5105,88 @@ input::-webkit-calendar-picker-indicator { justify-content: flex-end; flex-direction: row; align-self: start; - height: 1.875rem; } + height: 1.875rem; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap { flex-grow: 1; flex-shrink: 1; - flex-basis: auto; } + flex-basis: auto; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip { font-size: 14px; color: rgba(0, 0, 0, 0.45); - margin-top: 10px; } + margin-top: 10px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control { - height: calc(1.75rem + (1px*2)) !important; } + height: calc(1.75rem + (1px*2)) !important; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control { - height: 28px !important; } + height: 28px !important; +} .user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control, .user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group { border: 1px solid transparent; - border-bottom-color: #ececec; } + border-bottom-color: #ececec; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn { margin-left: 10px; padding-top: 4px; - padding-bottom: 4px; } + padding-bottom: 4px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child { - margin-left: 0px; } + margin-left: 0px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link { - color: rgba(0, 0, 0, 0.75); } + color: rgba(0, 0, 0, 0.75); +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size { display: flex; - flex-direction: row; } + flex-direction: row; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list { margin-right: 40px; position: relative; - cursor: pointer; } + cursor: pointer; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child { - margin-right: 0; } + margin-right: 0; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { width: 50px; height: 50px; - border-radius: 100%; } + border-radius: 100%; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img { - background-color: rgba(217, 38, 44, 0.9); } + background-color: rgba(217, 38, 44, 0.9); +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img { - background-color: rgba(0, 192, 222, 0.9); } + background-color: rgba(0, 192, 222, 0.9); +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name { font-size: 14px; color: rgba(0, 0, 0, 0.65); margin-top: 14px; - text-align: center; } + text-align: center; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { @@ -4147,7 +5197,8 @@ input::-webkit-calendar-picker-indicator { background: transparent; left: -4px; top: -4px; - border-radius: 100%; } + border-radius: 100%; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { @@ -4156,7 +5207,8 @@ input::-webkit-calendar-picker-indicator { top: 35px; border-radius: 100%; background-color: #fff; - display: none; } + display: none; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon { @@ -4167,79 +5219,98 @@ input::-webkit-calendar-picker-indicator { border-radius: 100%; border: 1px solid #fff; font-size: 14px; - overflow: hidden; } + overflow: hidden; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check { - display: block; } + display: block; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img { width: 64px; height: 52px; - overflow: hidden; } + overflow: hidden; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { width: 72px; height: 60px; - border-radius: 0; } + border-radius: 0; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { right: -10px; - top: 45px; } + top: 45px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color { - margin-bottom: 44px; } + margin-bottom: 44px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label { - height: 50px; } + height: 50px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label { - height: 60px; } + height: 60px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto { - min-width: 43.875rem; } + min-width: 43.875rem; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap { display: flex; - flex-direction: row; } + flex-direction: row; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list { flex: 1; - padding-right: 10px; } + padding-right: 10px; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child { - padding-right: 0px; } + padding-right: 0px; +} .dialog-user-avatar-tips { padding: 0 24px 24px; margin-top: 12px; font-size: 12px; color: rgba(0, 0, 0, 0.45); - padding-bottom: 14px; } + padding-bottom: 14px; +} .dialog-user-avatar { padding: 24px 32px 0 24px; display: flex; - flex-direction: row; } + flex-direction: row; +} .dialog-user-avatar-change { padding-right: 36px; - border-right: 1px solid #EFEFEF; } + border-right: 1px solid #EFEFEF; +} .dialog-user-avatar-view { - padding-left: 36px; } + padding-left: 36px; +} .dialog-user-avatar-view .avatar-view-title { font-size: 14px; color: rgba(0, 0, 0, 0.75); text-align: center; - margin-bottom: 15px; } + margin-bottom: 15px; +} .dialog-user-avatar-view .avatar-view-size { - margin-bottom: 32px; } + margin-bottom: 32px; +} .dialog-user-avatar-view .avatar-view-size:last-child { - margin-bottom: 0; } + margin-bottom: 0; +} .dialog-user-avatar-view .avatar-view-size .img { display: block; @@ -4248,312 +5319,433 @@ input::-webkit-calendar-picker-indicator { border-radius: 100%; overflow: hidden; margin: 0 auto; - border: 1px solid #EFEFEF; } + border: 1px solid #EFEFEF; +} .dialog-user-avatar-view .avatar-view-size .avatar-view-size-text { font-size: 12px; color: rgba(0, 0, 0, 0.45); display: block; text-align: center; - margin-top: 10px; } + margin-top: 10px; +} .dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img { width: 50px; - height: 50px; } + height: 50px; +} .isdisplay { - display: none; } + display: none; +} /** * basic.scss */ .themesdefault { - background-color: #1A78F7; } + background-color: #1A78F7; +} .themesdefault:hover { - background-color: #59a1ff; } + background-color: #59a1ff; +} .subcount-info:hover { - color: #2277E4 !important; } + color: #2277E4 !important; +} /** * 顶部横栏的样式 */ .gw-header { - background: linear-gradient(207deg, #1D7DEA 0%, #1576F7 100%); } - .gw-header .gw-header--exitfullscreen-wrapper { - border-top: 1px solid #2277E4; } - .gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { - background: url("../../../img/orishow.svg") no-repeat; } - .gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover { - background-image: url("../../../img/passshow.svg") no-repeat; } + background: linear-gradient(207deg, #1D7DEA 0%, #1576F7 100%); +} + +.gw-header .gw-header--exitfullscreen-wrapper { + border-top: 1px solid #2277E4; +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + background: url("../../../img/orishow.svg") no-repeat; +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover { + background-image: url("../../../img/passshow.svg") no-repeat; +} -.gw-header--application-icon-container:hover, .gw-header--application-icon-container.f-state-active { - background: linear-gradient(269deg, #0460DB 0%, #1562E5 50%, #0460DB 100%); } +.gw-header--application-icon-container:hover, +.gw-header--application-icon-container.f-state-active { + background: linear-gradient(269deg, #0460DB 0%, #1562E5 50%, #0460DB 100%); +} .gw-header-toolbar--content:hover { - background-color: #186BD9; } + background-color: #186BD9; +} /** * farrisapphome.scss */ .searce .select-show-mode .show-mode-active { - color: #2277E4 !important; } + color: #2277E4 !important; +} .gw-apps-management--tabs-container .tabs-container--item.active { - background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); } + background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); +} .down-arrow.active::after { - border-color: #1A78F7; } + border-color: #1A78F7; +} .mode-active { - color: #2277E4 !important; } + color: #2277E4 !important; +} .tabs-container--vertical .list-group .list-group-item::after { - background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%) !important; } + background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%) !important; +} .tabs-container--vertical .list-group .list-group-item:hover { - background-image: linear-gradient(243deg, #F1FCFF 0%, #F1FCFF 26%, #F1FCFF 67%, #F1FCFF 95%) !important; } + background-image: linear-gradient(243deg, #F1FCFF 0%, #F1FCFF 26%, #F1FCFF 67%, #F1FCFF 95%) !important; +} .tabs-container--vertical .list-group .list-group-item.active { - background-image: linear-gradient(243deg, #F1FCFF 0%, #F1FCFF 26%, #F1FCFF 67%, #F1FCFF 95%) !important; } + background-image: linear-gradient(243deg, #F1FCFF 0%, #F1FCFF 26%, #F1FCFF 67%, #F1FCFF 95%) !important; +} /** * list-index.scss */ .keyApplication .group .module--list .module--list-item::after { - background-image: linear-gradient(90deg, #ECECEC 0%, #388AFF 50%, #C2E9FB 100%); } + background-image: linear-gradient(90deg, #ECECEC 0%, #388AFF 50%, #C2E9FB 100%); +} .keyApplication .group .module--list .module--list-item:hover { - color: #1A78F7; } + color: #1A78F7; +} .listview--nav-horizontal .active .keyApplicationName { - background-color: #1A78F7; } + background-color: #1A78F7; +} .down-arrow.active::after { - border-color: #1A78F7; } + border-color: #1A78F7; +} .tileview--menu-item .menu-item--icon img, .menu-submenu--title .menu-item--icon .gw-icon { - color: #2987FE; } + color: #2987FE; +} .menu-submenu--title-selected { - color: #1A78F7 !important; } + color: #1A78F7 !important; +} .tileview--menu-item:hover, .menu-submenu--title:hover { - color: #1A78F7; } - .tileview--menu-item:hover .menu-item--text, - .menu-submenu--title:hover .menu-item--text { - color: #1A78F7; } + color: #1A78F7; +} + +.tileview--menu-item:hover .menu-item--text, +.menu-submenu--title:hover .menu-item--text { + color: #1A78F7; +} .tileview--menu-item-selected { color: #187BF9; - background: #EAF3FF; } - .tileview--menu-item-selected .menu-item--text { - color: #187BF9; } + background: #EAF3FF; +} + +.tileview--menu-item-selected .menu-item--text { + color: #187BF9; +} .tileview--menu .menu-list-item--arrow { - color: #187BF9; } + color: #187BF9; +} .application-list--header-title--icon .header-title--icon-item { - background: rgba(56, 143, 255, 0.9); } - .application-list--header-title--icon .header-title--icon-item-right { - background: rgba(56, 143, 255, 0.5); } + background: rgba(56, 143, 255, 0.9); +} + +.application-list--header-title--icon .header-title--icon-item-right { + background: rgba(56, 143, 255, 0.5); +} .application-wrapper--list-item::after { - background-image: linear-gradient(90deg, #ECECEC 0%, #388AFF 50%, #C2E9FB 100%); } + background-image: linear-gradient(90deg, #ECECEC 0%, #388AFF 50%, #C2E9FB 100%); +} .application-wrapper--list-item:hover .application-wrapper--list-item-text { - color: #1A78F7; } + color: #1A78F7; +} .tileview--menu-item::after { - background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%); } + background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%); +} .keyApplication-header-wrapper .module-head .module-header--icon { - color: #2987FE; } + color: #2987FE; +} .keyApplication .group .group-title .group-title--icon-container .group-title--icon { - background: rgba(56, 143, 255, 0.9); } - .keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { - background: rgba(56, 143, 255, 0.5); } + background: rgba(56, 143, 255, 0.9); +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + background: rgba(56, 143, 255, 0.5); +} .tileview--menu-image { -webkit-filter: drop-shadow(#1A78F7 20px 0); - filter: drop-shadow(#1A78F7 20px 0); } + filter: drop-shadow(#1A78F7 20px 0); +} /** * tabset.scss */ .notactive { - color: #596580 !important; } + color: #596580 !important; +} .down-arrow.active::after { - border-color: #1A78F7; } + border-color: #1A78F7; +} .tabset--nav-container { - background: #EBEEF4; } - .tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon { - background-image: url("../../../launcher/home-icon-selected.svg"); } - .tabset--nav-container .nav .tabset--nav-link { - color: #596580; } - .tabset--nav-container .nav .tabset--nav-link:hover { - background: #E1E5EE; } - .tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close { - color: #666; } - .tabset--nav-container .nav .tabset--nav-link.active { - color: #3E4A65; - background: #F8F9FB; } - .tabset--nav-container .nav .tabset--nav-link.active .nav-link-close { - color: #666; } - .tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { - background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%); } + background: #EBEEF4; +} + +.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon { + background-image: url("../../../launcher/home-icon-selected.svg"); +} + +.tabset--nav-container .nav .tabset--nav-link { + color: #596580; +} + +.tabset--nav-container .nav .tabset--nav-link:hover { + background: #E1E5EE; +} + +.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close { + color: #666; +} + +.tabset--nav-container .nav .tabset--nav-link.active { + color: #3E4A65; + background: #F8F9FB; +} + +.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close { + color: #666; +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, 0.09) 0%, #049FFF 26%, #0971FF 67%, rgba(9, 113, 255, 0.13) 95%); +} /** * userinfomenu.scss */ .detail-content--item:hover { - background-color: #F5F7FA; } + background-color: #F5F7FA; +} .detail-content--item-content { - border-top: 1px solid #F5F7FA; } + border-top: 1px solid #F5F7FA; +} .setdefault:hover { - background: #186BD9; } + background: #186BD9; +} .curtenant { background: #186BD9; - color: #fff; } + color: #fff; +} .curtenant-font-color { - color: #1A78F7 !important; } + color: #1A78F7 !important; +} .gw-navbar-user-dropdown.active, .gw-navbar-user-dropdown:hover { - background-color: #186BD9; } + background-color: #186BD9; +} .gw-navbar-user-info-content-list-item.item-setting-list:hover { color: #1A78F7; - background-color: #F5F7FA; } + background-color: #F5F7FA; +} .gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { - border-top: 1px solid #F5F7FA; } + border-top: 1px solid #F5F7FA; +} .gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background { - background-image: url("../../../img/tenant_change.svg"); } + background-image: url("../../../img/tenant_change.svg"); +} .gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { - background-image: url("../../../img/tenant_change.svg"); } + background-image: url("../../../img/tenant_change.svg"); +} /** * view-tiled.scss */ .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { - border: 1px solid #F5F7FA; } - .gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { - background-color: #F1FCFF; } + border: 1px solid #F5F7FA; +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { + background-color: #F1FCFF; +} .gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { -o-border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; - border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; } + border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; +} /** * header-tool.scss */ .menu-search-wrapper .menu-search--search { - background: #186BD9; } + background: #186BD9; +} .menu-colllection-wrapper .menu-colllection--detail-item:hover { - background: #F5F7FA; } - .menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title { - color: #1A78F7; } + background: #F5F7FA; +} + +.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title { + color: #1A78F7; +} .menu-colllection-wrapper.show .menu-colllection--item { - background-color: #186BD9; } + background-color: #186BD9; +} /** * app-manager.scss */ .gw-single-app-wrapper:hover { -o-border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; - border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; } + border-image: linear-gradient(135deg, #A1C4FD, #C2E9FB) 30 30; +} .gw-app-group.f-state-active .gw-app-group--header .header--icon { - color: #2987FE; } + color: #2987FE; +} .gw-apps-management--header .header--search { background: #F5F7FA; - border: 1px solid #F5F7FA; } - .gw-apps-management--header .header--search .search--input { - background: #F5F7FA; } - .gw-apps-management--header .header--search .search--append .f-icon { - color: #388AFF; } - .gw-apps-management--header .header--search:hover, .gw-apps-management--header .header--search.f-state-focuse { - border: 1px solid #59a1ff; } - .gw-apps-management--header .header--search .search--placeholder { - background: #F5F7FA; - border: 1px solid #F5F7FA; } - .gw-apps-management--header .header--search .search--result-panel .match { - color: #187BF9; } - .gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover { - background: #F5F7FA; } - .gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { - background-image: linear-gradient(215deg, #1C7CEA 0%, #1A78F7 100%); } + border: 1px solid #F5F7FA; +} + +.gw-apps-management--header .header--search .search--input { + background: #F5F7FA; +} + +.gw-apps-management--header .header--search .search--append .f-icon { + color: #388AFF; +} + +.gw-apps-management--header .header--search:hover, +.gw-apps-management--header .header--search.f-state-focuse { + border: 1px solid #59a1ff; +} + +.gw-apps-management--header .header--search .search--placeholder { + background: #F5F7FA; + border: 1px solid #F5F7FA; +} + +.gw-apps-management--header .header--search .search--result-panel .match { + color: #187BF9; +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover { + background: #F5F7FA; +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + background-image: linear-gradient(215deg, #1C7CEA 0%, #1A78F7 100%); +} .gw-apps-management--header .header--view .view--btn.active { - background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); } + background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); +} .gw-apps-management--header .header--view .view--btn:hover:not(.active) { - background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); } + background-image: linear-gradient(225deg, #3A98FF 0%, #0971FF 100%); +} .search--result-item-keyboard--control { - background: #F5F7FA; } + background: #F5F7FA; +} /* *setting.color */ .user-setting-list .user-setting-message .user-avatar .user-avatar-sex { - background-color: #59a1ff; } + background-color: #59a1ff; +} .user-setting-list .user-setting-menu .menu-item-inner.active { - border-left: 3px solid #388AFF; } + border-left: 3px solid #388AFF; +} .user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text, .user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon { - color: #388AFF; } + color: #388AFF; +} .user-setting-content-wrapper-title::before { - background: #59a1ff; } + background: #59a1ff; +} .user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before { - background-color: #5ACBCD; } + background-color: #5ACBCD; +} .user-setting-content-wrapper-title .title-edit-btn { - color: #388AFF; } + color: #388AFF; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { - background-color: #388AFF; } + background-color: #388AFF; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { - color: #388AFF; } + color: #388AFF; +} .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, .user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { - border: 1px solid rgba(56, 143, 255, 0.5); } + border: 1px solid rgba(56, 143, 255, 0.5); +} .user-setting-list .user-setting-menu .menu-item-inner.active { - background-color: #F5F7FA; } + background-color: #F5F7FA; +} .user-setting-list .user-setting-menu .menu-item-inner:hover { - background-color: #F5F7FA; } + background-color: #F5F7FA; +} .tabset--nav-container .nav { - height: 36px; } - .tabset--nav-container .nav .tabset--nav-link { - font-size: 13px; - padding: 0 10px 0 16px; - height: 36px; - line-height: 36px; } - .tabset--nav-container .nav .nav-link-close { - margin: 0 0 0 14px; } + height: 36px; +} + +.tabset--nav-container .nav .tabset--nav-link { + font-size: 13px; + padding: 0 10px 0 16px; + height: 36px; + line-height: 36px; +} + +.tabset--nav-container .nav .nav-link-close { + margin: 0 0 0 14px; +} \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.min.css b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.min.css index 9e9182dfcb9083e322f58eec764211e94ecb8184..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.min.css +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/default/gsp-cloud-web.min.css @@ -1 +0,0 @@ -@charset "UTF-8";.g-main,.gw-page-wrapper{top:0;right:0;position:absolute;left:0;bottom:0}.g-main{margin:0 auto;font-size:.875rem}.font-size-13{font-size:.8125rem!important}.font-size-14{font-size:.875rem!important}.font-size-normal{font-size:1rem!important}.font-size-middle{font-size:1.5rem!important}.font-size-lg{font-size:3rem!important}.flex-auto{flex-grow:1;flex-shrink:1;flex-basis:auto}.g-pointer{cursor:pointer}.gw-page-wrapper{overflow:hidden;display:flex;flex-direction:column}.login-section,.subcount-info,.themesdefault,.themesgreen,.themesred,.wrapper-content{position:relative}.gw-page-header>.row{overflow:hidden}.wrapper-content{margin:0}.themestitle{display:inline-block;margin-left:35px;text-align:center;font-family:PingFangSC-Light;font-size:14px;color:rgba(0,0,0,.85)}.themesheader{margin-left:25px;margin-bottom:25px;font-family:PingFangSC-Regular;font-size:16px;color:rgba(0,0,0,.85)}.module-title2,.themesd{margin-bottom:10px}.themesd{display:inline-block;vertical-align:middle;margin-top:-20px}.themesdefault,.themesdefault:hover,.themesgreen,.themesgreen:hover,.themesred,.themesred:hover{height:50px;border-radius:5px;cursor:pointer;margin-top:5px;width:50px}.themesred{background-color:#D9262C}.themesred:hover{background-color:#DF464B}.themesgreen{background-color:#00C0DE}.themesgreen:hover{background-color:#30CFE8}.themebanIn,.themebanOut{height:50px;border-radius:5px;opacity:.25;margin-top:-40px;cursor:pointer}.themesinimg{padding-left:17px;padding-top:19px;display:flex}.themesoutimg{padding-left:17px;padding-top:19px;display:none}.themessize{display:flex;padding-left:7px;padding-top:10px}.themebanIn{background:#000;width:50px}.themebanOut{background:#000;width:50px;display:none}.themesizeIn{margin-top:-52px;position:absolute}.applicationhome{border-right:1px solid rgba(255,255,255,.3)!important;padding-right:13px!important}.collection-10,.collection-100,.collection-max{border-radius:9px;background:red;font-size:12px!important;text-align:center;color:rgba(255,255,255,.9);line-height:18px!important;padding:0 6px!important;font-family:arial,sans-serif}.gw-header--caption{margin:0 0 0 20px}.gw-header--caption-img{display:block;max-height:38px}.collection-10,.collection-100,.collection-max,.subcount-info{display:inline-block}.collection-10{margin:2px -5px}.collection-100{margin:2px -11px}.collection-max{margin:2px -13px}.subcount-info{color:rgba(0,0,0,.25)!important;padding:0 7px;cursor:pointer;line-height:28px!important}.subcount-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.subcount-info .material-icons{display:block}#search:-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-webkit-input-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}app-login-container{background:#fff;position:absolute;top:0;left:0;bottom:0;right:0;overflow:auto}.login-logo{width:26.69rem;height:18rem;overflow:hidden;margin-right:4.5rem;background:url(../../../img/login-logo@2x.png) no-repeat;background-size:427px 288px}.login-logo h1{font-family:PingFangSC,'Segoe UI','microsoft yahei',sans-serif;font-size:1.625rem;line-height:2.5rem;padding:9.5rem 0 0 5rem;color:#666560;margin:0}.login-logo .logo-en{font-size:1.375rem}.login-section{width:24.31rem;padding-left:2.56rem;float:left}.login-section h2{font-size:1.75rem;color:#333;margin:.25rem 0 1.31rem}.login-form .custom-select,.login-form .form-control{margin:0 0 1.13rem;line-height:26px;border-radius:.25rem;padding-top:.3125rem;padding-bottom:.3125rem;height:32px}.btn-login{background:#24abe9;color:#fff;height:3.25rem;font-size:1rem}.btn-regist{padding:1.25rem 0 0;font-size:.875rem}.btn-regist a{border-bottom:1px solid #24abe9;color:#24abe9;padding:0 0 .125rem}.btn-regist a:hover{text-decoration:none}.remember-info{padding:0 0 0 1.25rem}.login-lg{display:inline-block;width:1.88rem;height:1.31rem;background:url(../../../img/language@2x.png) no-repeat;background-size:30px auto}.lg-en{background-position:0 0}.lg-zh-cn{background-position:0 -24px}.login-lg-text{color:#373d41}.auth-form-container{padding:6.56rem 0 0}.login-lg-area{position:absolute;top:-5rem;right:-65%}.login-lg-dropdown .btn:active,.login-lg-dropdown .btn:focus{outline:0}.login-lg-dropdown .dropdown-menu{right:0;left:auto}.login-log-container{flex-direction:row-reverse!important}@media (max-width:1200px){.login-lg-area{right:0}}@media (max-width:992px){.login-logo{margin:0 auto}.login-section{width:90%;padding:0 0 0 10%;margin:0 auto}}@media (max-width:768px){.login-log-container{flex-direction:row!important}}@media (max-width:576px){.login-lg-area{right:0;top:.5rem}.auth-form-container{padding:1rem 0 0}.login-section{padding:0;float:none;border-left:none}}.gw-header-toolbar .material-icons{font-size:22px}.gw-header-toolbar .count-info{color:rgba(255,255,255,.65)!important;position:relative;display:block;padding:9px 11px;cursor:pointer}.gw-header-toolbar .count-info:hover{color:#fff!important}.gw-header-toolbar .count-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.gw-header-toolbar .count-info .material-icons{display:block}.gw-userinfo-menu .leftMenu{left:-100px!important}.gw-userinfo .user-profile{outline:#000;text-align:left;color:#000;border:1px solid #000;margin:20px;width:700px;padding:10px}.gw-userinfo span.title{display:block;width:80px;height:30px;position:relative;top:-20px;text-align:center;background:#fff}.gw-header-toolbar .leftMenu a{display:block;padding:0}.gw-page-header-tabscontrol{display:none}.full-width{width:100%!important}.scrollbar-x-hidden{overflow-x:hidden}.border-none{border:0!important}.gw-header{color:#f5f5f5;padding:0;z-index:910;box-shadow:0 0 10px 0 rgba(57,66,100,.1)}.gw-header .gw-header--exitfullscreen-wrapper{position:fixed;top:0;left:0;right:0;height:12px;z-index:900}.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn{display:block}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{display:none;cursor:pointer!important;height:18px;width:120px;margin:0 auto;position:relative;z-index:2000}.gw-header--toast{background:#333;opacity:.9;color:#FFF;line-height:43px;text-align:center;border-radius:4px;height:46px;width:256px;margin:46px auto;display:none}.gw-header--toast-show{display:block;-webkit-animation-name:exitFullScreenToastFadeInDown;animation-name:exitFullScreenToastFadeInDown;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:fixed;left:50%;margin-left:-128px}@-webkit-keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}@keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}.gw-header--wrapper{display:flex;flex-direction:row;align-items:center}.gw-header--application-icon-container .application-icon-active,.gw-header--application-icon-container.f-state-active::after,.gw-header--application-icon-container:hover::after{display:none}.gw-header--application-icon-container{position:relative;width:55px;height:40px;color:#fff;text-align:center;cursor:pointer}.gw-header--application-icon-container::after{position:absolute;content:'';width:1px;height:16px;right:0;top:50%;margin-top:-8px;background-color:rgba(255,255,255,.3)}.gw-header--application-icon-container .f-icon{font-size:1rem;line-height:38px}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{color:#fff}.gw-header--application-icon-container.f-state-active .application-icon-active,.gw-header--application-icon-container:hover .application-icon-active{display:inline-block}.gw-header--application-icon-container.f-state-active .application-icon,.gw-header--application-icon-container:hover .application-icon{display:none}.gw-header-toolbar--list{display:flex;align-items:center}.gw-header-toolbar--content{display:block;height:40px;padding:0 11px;line-height:40px;cursor:pointer}.gw-apps-management-wrapper{background:#fff;min-width:600px;height:100%;display:flex;flex-direction:column;margin:0 70px 0 0;position:relative}.gw-apps-management-wrapper .header{padding:11px 0 17px 20px;height:56px}.gw-apps-management-wrapper .header .intro{font-weight:700;font-family:PingFangSC-Medium;font-size:18px;color:#333;text-align:left;display:inline-block}.gw-apps-management-wrapper .header .searce{float:right;margin-right:21px;position:relative;top:0;height:28px}.gw-apps-management-wrapper .header .searce .searce-img1{width:14px;position:relative;right:8px;top:7px;cursor:pointer;float:left}.gw-apps-management-wrapper .header .searce .setup-img{position:relative;top:-1px;margin-left:9px}.last-app-group>.app-group{min-height:calc(100vh - 171px);margin-bottom:25px!important}.searce .select-show-mode{display:inline-block;margin:0 -2px 0 -3px}.searce .select-show-mode .show-mode{display:inline-block;width:30px;height:26px;background:#eaeaea;position:relative;top:8px;cursor:pointer}.searce .select-show-mode .show-mode img{width:14px;height:14px;position:relative;top:6px;left:8px}.searce .select-show-mode .show-mode .default-img{display:block}.searce .select-show-mode .show-mode .hover-img,.searce .select-show-mode .show-mode .selected-img,.searce .select-show-mode .show-mode:hover .default-img,.searce .select-show-mode .show-mode:hover .selected-img{display:none}.searce .select-show-mode .magnetic-sticker-mode{border-top-left-radius:2px;border-bottom-left-radius:2px;margin-left:15px;position:relative;left:4px}.searce .select-show-mode .all-app-mode{border-top-right-radius:2px;border-bottom-right-radius:2px;position:relative;left:-4px}.searce .select-show-mode .show-mode:hover .hover-img{display:block}.searce .select-show-mode .show-mode-active .default-img{display:none}.searce .select-show-mode .show-mode-active .selected-img{display:block}.gw-apps-management--tabs-container{display:flex;width:100%;position:relative;padding:9px 0 9px 19px;border-bottom:1px solid rgba(0,0,0,.06)}.gw-apps-management--tabs-container .tabs-container--horizontal{flex-wrap:nowrap;overflow:hidden;margin:0;cursor:pointer}.gw-apps-management--tabs-container .tabs-container--horizontal-length{margin-right:65px}.gw-apps-management--tabs-container .tabs-container--item{margin-top:1px;flex-grow:1;flex-basis:auto;position:relative;margin-right:2px;height:30px;line-height:30px;flex-shrink:0;cursor:pointer;list-style:none;border-radius:15px;padding:0 19px;color:#333}.gw-apps-management--tabs-container .tabs-container--item.active{color:#fff;box-shadow:0 4px 4px 0 rgba(25,76,164,.09)}.listview---nav-vertical,.tabs-container--vertical{box-shadow:0 0 6px 0 rgba(139,139,139,.27);z-index:1000}.tabs-container--vertical-smallscreen{height:calc(100vh - 200px)!important}.tabs-container--vertical{display:none;width:247px;height:556px;background:#fff;overflow:auto}.tabs-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabs-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabs-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabs-container--vertical.show{display:flex;position:absolute;right:25px;top:51px}.tabs-container--vertical .list-group{flex:auto}.tabs-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;cursor:pointer}.tabs-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.searce .searce-input,.set-up,.tips{position:relative}.set-up,.set-up img{width:14px;height:14px}.tabs-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabs-container--vertical .list-group .list-group-item:first-child{border-radius:0}.set-up{cursor:pointer;float:right;right:0;top:15px;margin-left:16px}.set-up .set-up-img{display:block}.set-up .set-up-img-down,.set-up .set-up-img-hover,.set-up:hover .set-up-img{display:none}.set-up:hover .set-up-img-hover{display:block}.setUpMousedown .set-up-img,.setUpMousedown .set-up-img-hover{display:none!important}.setUpMousedown .set-up-img-down{display:block!important}.searce .searce-input{border:none;outline:0;background:#fff;border-radius:20px;width:200px;height:28px;padding-left:12px;padding-right:30px;right:-20px;float:left;top:0}.searce input::-webkit-input-placeholder{font-size:12px;color:#999;text-align:left}.searce input::-ms-input-placeholder{font-size:12px;color:#999;text-align:left}gsp-list-index{background-color:#fff}.tips{display:inline-block;width:0;margin:0 -2px}.tips .tips-content{position:absolute;top:-11px;z-index:2;display:none;width:68px;height:28px;background-color:#5a676f;border-radius:2px;text-align:center;line-height:28px;font-size:12px;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tips .magnetic-sticker-mode-tips{left:-47px}.tips .list-mode-tips{left:-51px}.tips .all-app-mode-tips{left:-55px}.select-show-mode:hover .tips-content{display:block!important}.keyApplication1,.keyApplication2,.keyApplication3,.module{display:none}.international-nav-container .nav a{padding:0 19px;margin-right:2px}.last-app-group /deep/ .app-group .content{min-height:calc(100vh - 235px)}.last-app-group .last-app-group-height{min-height:calc(100vh - 165px)}.search-fra{background:#FFF!important;border:1px solid #E0E0E0!important;border-radius:4px!important}.search-fra:focus{background:#FFF!important;border:1px solid #0068F3!important;border-radius:4px!important}input::-webkit-calendar-picker-indicator{display:none}.tabs-container--dropdown{position:absolute;right:0;top:7px;width:52px;height:36px;background:#fff;box-shadow:-1px 0 1px 0 rgba(0,0,0,.12);cursor:pointer}.tabs-container--dropdown .f-icon{width:36px;height:36px;line-height:36px;text-align:center;font-size:18px;color:rgba(0,0,0,.5)}.tabs-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.module{height:calc(100vh - 246px)}.keyApplication,.keyApplication-header-wrapper{padding:0 24px}.keyApplication .module,.keyApplication-header-wrapper .module-head .module-header--content{margin-right:54px}.keyApplication-header-wrapper .module-head{flex-shrink:0}.keyApplication-header-wrapper .module-head .module-header--icon{width:20px;height:20px;margin-right:10px}.keyApplication{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0;width:100%;align-content:flex-start;align-items:flex-start;overflow:auto}.keyApplication .keyApplication::-webkit-scrollbar{width:7px!important;height:7px!important;background-color:#8e8e8e}.keyApplication .module{position:relative;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start;align-items:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0}.keyApplication .module .module-title{position:absolute;top:-33px;width:100%;height:31px;border-bottom:1px solid #d2deea;font-size:16px;color:#333}.keyApplication .group{width:200px;margin-bottom:5px;margin-top:14px}.keyApplication .group .group-title{font-size:14px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;padding-bottom:14px}.keyApplication .group .group-title .group-title--icon-container{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{margin-left:4px}.keyApplication .group .group-title .group-title--text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;color:rgba(0,0,0,.65)}.keyApplication .group .module--list{padding-left:0;margin-bottom:0}.keyApplication .group .module--list .module--list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:14px;padding:5px 33px 5px 10px;margin-right:24px;position:relative;color:rgba(0,0,0,.85)}.keyApplication .group .module--list .module--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.keyApplication .group .module--list .module--list-item:hover{cursor:pointer;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.keyApplication .group .module--list .module--list-item:hover::after{opacity:1}.keyApplication .group .module--list .module--list-item:hover .module--list-collect{display:block}.keyApplication .group .module--list .module--list-text{font-size:14px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.keyApplication .group .module--list .module--list-collect{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;text-align:center;cursor:pointer;color:#FFC43B}.keyApplication .group .module--list.f-state-collected .module--list-collect,.listview--nav-horizontal .active .tab-img{display:block}.keyApplication .group .module--list .module--list-collect .f-icon{font-size:15px;line-height:20px}.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before{content:'\e303'}.keyApplication-active{display:flex}.keyApplication-background-show-right{background-image:url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg);background-position:97% 92%;background-repeat:no-repeat}.listview--nav-horizontal{overflow:hidden;padding-left:24px;padding-right:24px;height:52px;width:100%;background-color:#fff;position:relative;top:-8px;border-bottom:2px solid #ebebeb;margin-bottom:12px;flex-wrap:nowrap;display:flex}.listview--nav-horizontal .listview--nav-link{display:inline-block;height:14px;margin-right:16px;text-decoration:none}.listview--nav-horizontal .listview--nav-link .keyApplicationName{font-size:16px;color:grey;text-align:center;padding:0 17px 0 20px;height:40px;line-height:40px;margin-left:5px;margin-right:5px;position:relative;top:11px;border-top-left-radius:2px;white-space:nowrap}.listview--nav-horizontal .active .keyApplicationName{color:#fff}.listview--nav-horizontal .tab-img{float:right;height:40px;position:relative;top:-45px;left:3px;display:none}.imgyinying{background:url(../../../img/矩形@2x.png);width:8px}.out-keyApplication{overflow:hidden;display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;flex-basis:0}.out-keyApplication .module-head{position:relative}.out-keyApplication .module-head .module-header--content{display:flex;flex-direction:row;align-items:center;padding:10px 0;border-bottom:1px solid #e5e5e5}.out-keyApplication .module-head .module-title-img{display:block;width:16px;height:16px;margin-right:10px}.out-keyApplication .module-head .module-title{width:200px;font-size:15px;color:rgba(0,0,0,.85);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:0}.international-nav .nav-a .keyApplicationName{font-size:14px;padding:0 18px 0 20px}.international-content .keyApplication .module-head .module-title{font-size:14px;position:relative;top:2px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.international-content .keyApplication .group{width:auto;padding-right:10px}.international-content .keyApplication .group .group-title{max-width:240px}.international-content .keyApplication .module .module--list-item{font-size:12px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.listview--nav-container{display:flex;width:100%;position:relative;padding-right:22px;overflow:auto}.listview--nav-container .nav{flex-wrap:nowrap;overflow:hidden}.listview---nav-vertical{display:none;width:247px;height:556px;background:#fff}.listview---nav-vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.listview---nav-vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.listview---nav-vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.listview---nav-vertical.show{display:flex;position:absolute;right:25px;top:45px}.listview---nav-vertical .list-group{flex:auto}.listview---nav-vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px}.listview---nav-vertical .list-group .list-group-item.active,.listview---nav-vertical .list-group .list-group-item:hover{background:#ddecff}.listview---nav-vertical .list-group .list-group-item:first-child{border-radius:0}.jianyin{width:30px;height:30px;background-color:#f6f6f6;background:linear-gradient(to bottom,#fff,#f6f6f6);position:absolute;right:52px;opacity:0}.btn-nav-all-dropdown,.btn-nav-all-dropdown2{padding:2px 1px 1px;background-color:#f6f6f6;line-height:1}.btn-nav-all-dropdown{flex:none;height:30px;position:absolute;right:20px;top:10px}.btn-nav-all-dropdown .active,.btn-nav-all-dropdown2 .active{top:4px}.btn-nav-all-dropdown:focus{box-shadow:none}.double-slash{font-family:PingFangSC-Regular;font-size:14px!important;color:#0F4D9E!important;line-height:14px;background:-30px center no-repeat #F9F9F9;border-radius:2px;height:26px;background-size:50% 50%;display:flex;align-items:center;padding-left:33px}.gw-apps-management--listview,.gw-apps-management--listview .listview--keyapp-list{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column;overflow:hidden}.gw-apps-management--tileview{display:flex;flex-direction:row;flex-wrap:nowrap;border-top:1px solid rgba(0,0,0,.06);flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden}.gw-apps-management--tileview .tileview--nav{width:230px;background:rgba(247,249,250,.8);border-right:1px solid rgba(0,0,0,.06);overflow-y:auto}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--content{flex-grow:1;flex-shrink:1;flex-basis:0;padding:0 0 24px 30px;background:#fff;overflow-y:auto}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--app-wrapper{padding:0;margin:.875rem 1rem 0 0}.tileview--menu-item-height-default{height:37px}.menu-submenu--title-height-default{height:45px}.menu-submenu--title,.tileview--menu-item{padding:0 0 0 63px;position:relative;cursor:pointer}.menu-submenu--title .menu-item--icon,.tileview--menu-item .menu-item--icon{position:absolute;top:12px;left:29px;line-height:21px;overflow:hidden}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{font-size:16px}.menu-submenu--title .menu-item--right{display:none;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--right-selected{display:none!important;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--text-length,.tileview--menu-item .menu-item--text-length{white-space:nowrap;overflow:hidden;width:127px;text-overflow:ellipsis}.menu-submenu--title .menu-item--text,.tileview--menu-item .menu-item--text{display:block;line-height:21px;font-size:15px;color:rgba(0,0,0,.85)}.menu-submenu--title .menu-item--text{padding:.75rem 0}.tileview--menu-item .menu-item--text{padding:.5rem 0}.menu-submenu--title:hover .menu-item--right,.tileview--menu-item:hover .menu-item--right{display:block;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title:hover .menu-item--right-selected,.tileview--menu-item:hover .menu-item--right-selected{display:block!important;line-height:24px;transform:rotate(270deg)!important;right:1.65rem;top:.95rem}.tileview--menu-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tileview--menu-item-selected::after{transform:scaleY(1)!important;opacity:1!important}.tileview--menu-top{margin-top:1px}.tileview--menu .menu-list-item--arrow{display:none;position:absolute;top:.75rem;right:1.375rem}.tileview--menu .tileview--menu-item-selected .menu-list-item--arrow{display:block}.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text{color:#000}.tileview--menu-sub{transition:all .1s linear}.tileview--menu-submenu-open .tileview--menu-sub{height:100%}.tileview--menu-image{transform:translateX(-20px)}.application-wrapper--header{padding:0 0 4px}.application-wrapper--header-title{display:flex;align-items:center;font-size:.9375rem;font-size:15px;line-height:1.3125rem;color:rgba(0,0,0,.85);margin:0;font-weight:600}.application-wrapper--header-title span{display:inline-block;vertical-align:middle}.application-list--header-title--icon{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.application-list--header-title--icon .header-title--icon-item{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.application-list--header-title--icon .header-title--icon-item-right{margin-left:4px}.application-wrapper--content{padding:0 0 16px}.application-wrapper--list-title{margin-top:8px;margin-bottom:18px}.application-wrapper--list{padding:0 0 0 14px}.application-wrapper--list:after{content:"";display:block;clear:both}.application-wrapper--list-item{position:relative;width:199px;float:left;padding:5px 10px;margin:0 2px 0 0;list-style:none}.application-wrapper--list-item .application-wrapper--list-item-text{font-size:14px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-tip{padding:0 6px;white-space:nowrap;background:#FFF;border:1px solid #D6D6D6;box-shadow:0 2px 12px 0 rgba(0,0,0,.15);font-family:PingFangSC-Regular;font-size:12px;color:#313131;line-height:20px}.application-wrapper--list-item .application-wrapper--list-item-tip-top{width:12px;height:12px;transform:rotate(45deg);position:absolute;margin-top:7px;top:-1px;background:#FFF;border:1px solid #D6D6D6;border-radius:2px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame{width:12px;height:10px;overflow:hidden;position:absolute;top:-9px;left:12px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:none;transition:all 0s linear .7s}.application-wrapper--list-item .application-wrapper--list-item-start{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-start .f-icon{display:block;margin:0 auto;font-size:15px;line-height:20px;color:#FFC43B}.talk_input,.talk_show{margin:10px auto 0}.application-wrapper--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.application-wrapper--list-item:hover{display:block;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:flex}.application-wrapper--list-item:hover::after{opacity:1}.talk_con{background:#f9f9f9}.talk_show{border:1px solid #666;overflow:auto;height:400px;width:auto}.atalk,.btalk{margin:10px}.whotalk{float:left;outline:0}.talk_word{padding:0;float:left;outline:0;text-indent:10px;width:350px;height:30px}.atalk span,.btalk span{display:inline-block;color:#fff;padding:5px 10px;border-radius:10px}.custom-class,.talk_sub{float:right}.talk_sub{margin-left:10px}.atalk span{background:#0181cc}.btalk{text-align:right}.btalk span{background:#ef8201}.modal-dialog{position:absolute;right:0;bottom:0;margin:0}:host{display:flex;flex-direction:column}.notactive{position:relative}.borderactive+li>a{padding-right:10px;padding-left:12px;font-family:PingFangSC-Regular;color:rgba(0,0,0,.65);border:1px solid #dae0e6!important;border-top:0!important;border-right:0!important;border-bottom:0!important;border-left:0!important;border-top-left-radius:0!important}.notinimg{visibility:hidden}.noimghover{visibility:visible}.btn-nav-all-dropdown2{flex:none;height:30px;position:absolute;right:20px}.btn-nav-all-dropdown2:focus{box-shadow:none}.down-arrow{display:inline-block;position:relative;width:28px;height:32px}.down-arrow::after{display:inline-block;content:" ";height:9px;width:9px;border-width:0 2px 2px 0;border-color:#999;border-style:solid;transform:matrix(.71,.71,-.71,.71,0,0);transform-origin:center;transition:transform .3s;position:absolute;top:50%;right:10px;margin-top:-10px}.down-arrow.active::after{transform-origin:center;transform:rotate(-135deg);transition:transform .3s}.list-group-items{height:32px;border:none;color:#333;padding-top:8px;padding-bottom:8px}.list-group-items:hover{background:#ddecff}.list-group-items.active{background:#c8e0ff}.list-group-items:first-child{border-radius:0}.tabset--nav-container{display:flex;width:100%;position:relative}.tabset--nav-container .active-bg{display:none}.tabset--nav-container .tabset--tab-content{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column}.tabset--nav-container .nav{border:none}.tabset--nav-container .tabset-container--dropdown{position:absolute;height:36px;line-height:36px;border-right:1px solid #f0f0f0;color:rgba(0,0,0,.45);z-index:10;cursor:pointer;right:0;top:0;display:flex;flex-direction:row;align-items:center}.tabset--nav-container .tabset-container--dropdown .f-icon{width:34px;height:34px;line-height:34px;text-align:center;font-size:18px}.tabset--nav-container .tabset-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.tabset--nav-container .tabset-container--vertical{display:none;width:247px;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:1000;overflow:auto}.tabset--nav-container .tabset-container--vertical .nav-link-close{font-size:14px;color:rgba(0,0,0,.15);vertical-align:inherit}.tabset--nav-container .tabset-container--vertical .nav-link-close::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before{content:"\e11d"}.tabset--nav-container .tabset-container--vertical .list-group-header{padding:14px 24px 6px;display:flex;align-items:center;justify-content:space-between}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title{font-size:16px;color:rgba(0,0,0,.95);margin:0}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper{font-size:14px;display:flex;align-items:center;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon{width:14px;height:14px;margin:0 6px 0 0;background:#d1d5db;border-radius:2px}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon{color:#fff;font-size:14px;display:block}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text{color:rgba(0,0,0,.85)}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon{background:#ff6060}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon{background:#f94c4c}.tabset--nav-container .tabset-container--vertical.show{display:flex;position:fixed;right:1px;top:80px;bottom:1px}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabset--nav-container .tabset-container--vertical .list-group{flex:auto;padding-left:0;width:247px}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;display:flex;align-items:center;justify-content:space-between;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(144deg,#eef4ff 0,#f6fcff 100%)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child{border-radius:0}.newdh:hover .gjdh,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps{display:none}.newdh:hover .gjdh2{display:inline}.gjdh2{display:none}.tabshow{display:inline}.tabhid,.tabset--nav-container .nav .tabset--nav-item:hover::after,.tabset--nav-container .nav .tabset--nav-item:last-child::after{display:none}.tabset--nav-container .nav{flex-wrap:nowrap;overflow:inherit;line-height:16px;text-align:center;margin-right:60px}.tabset--nav-container .nav .tabset--nav-item{flex-shrink:0;position:relative}.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before{left:3px}.tabset--nav-container .nav .tabset--nav-item::after{position:absolute;content:'';background:#CCD2E1;width:1px;right:0;z-index:100;height:14px;top:50%;margin-top:-7px;opacity:.38}.tabset--nav-container .nav .tabset--nav-link{border:none;display:flex;flex-direction:row;align-items:center}.gw-navbar-user-name::after,.menu-userinfo-wrapper .menu-userinfo--item-name::after{border-left:3px solid transparent;border-bottom:3px solid #fff;border-right:3px solid #fff}.tabset--nav-container .nav .tabset--nav-link-text{display:block;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabset--nav-container .nav .tabset--nav-link-overlay,.tabset--nav-container .nav .tabset--nav-link-overlay-active{bottom:0;width:15px;height:15.45px;position:relative;float:left;margin-left:-14px}.tabset--nav-container .nav .tabset--nav-link-overlay{background:linear-gradient(top,rgba(255,255,255,0),#f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff , endColorstr=whitesmoke , GradientType=0}.tabset--nav-container .nav .tabset--nav-link-overlay-active{background:linear-gradient(top,rgba(255,255,255,0),#fafbfc);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0)}.tabset--nav-container .nav .nav-link-close{width:15px;height:15px;color:#d8d8d8;margin-left:24px}.tabset--nav-container .nav .nav-link-close .f-icon{vertical-align:top;font-size:12px;line-height:15px}.tabset--nav-container .nav .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .nav .nav-link-close:hover .f-icon::before{font-size:15px;content:"\e11d"}.tabset--nav-container .nav .spanlib{display:inline-block;white-space:nowrap;max-width:230px;overflow:hidden}.tabset--nav-container .nav .tabset--nav-link.active{box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);z-index:11}.tabset--nav-container .nav .nav-item--home .tabset--nav-link{padding:0 19px 0 20px;height:38px;line-height:38px}.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close{display:none}.tabset--nav-container .nav .nav-item--home .nav-item--home-icon{display:inline-block;width:16px;height:16px;background:url(../../../launcher/home-icon.svg) center center no-repeat}.gw-header--menu-panel .menu-panel--close:hover::before,.tabset--nav-container .nav .nav-item--apps,.tabset--nav-container .nav .nav-item--apps .nav-link-close{display:none}.workarea{overflow:hidden;background-color:#f4f6f9}.gw-header--menu-panel-wrapper{position:fixed;width:90%;top:40px;left:0;bottom:0;z-index:980;max-width:none;transform:translateX(-120%);box-shadow:0 2px 26px 0 rgba(0,0,0,.3)}@media (min-width:1600px){.gw-header--menu-panel-wrapper{width:70%;max-width:none}}.gw-header--menu-panel-wrapper.f-state-show{transform:translateX(0)}.gw-header--menu-panel-wrapper.f-state-hidden{transform:translateX(-500%)}.gw-header--menu-panel-mask-top{top:40px!important}.gw-header--menu-panel-mask-bottom{bottom:calc(100vh - 40px)!important;background-color:transparent!important}.gw-header--menu-panel-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:#000;opacity:.4}.gw-header--menu-panel-mask.f-state-show{transform:translateX(0)}.gw-header--menu-panel-mask.f-state-hidden{transform:translateX(-120%)}.gw-header--menu-panel{min-width:600px;height:100%;margin:0;z-index:982;position:relative;background:#fff}.gw-header--menu-panel .gw-apps-management{top:0;position:absolute;background:0 0}.gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper{margin:0}.gw-header--menu-panel .menu-panel--close{position:absolute;cursor:pointer;z-index:1001;width:56px;height:56px;top:0;right:0;display:flex;align-items:center;justify-content:center}.gw-header--menu-panel .menu-panel--close::before{background:rgba(0,0,0,.06);border-radius:.5px;position:absolute;left:0;width:1px;height:14px;content:'';top:50%;margin-top:-7px}.gw-header--menu-panel .menu-panel--close .menu-panel--close-area{width:22px;height:22px;text-align:center;background:rgba(0,0,0,.1);border-radius:11px;color:rgba(0,0,0,.5)}.gw-header--menu-panel .menu-panel--close .f-icon{font-size:14px;line-height:22px}.gw-header--menu-panel .menu-panel--close:hover{background:#F6F6F6}.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area{color:#fff;background:#FF6060}.menu-userinfo-wrapper{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper::after{display:none}.menu-userinfo-wrapper.active,.menu-userinfo-wrapper.hover{background-color:#075EBB}.menu-userinfo-wrapper .menu-userinfo--item{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper .menu-userinfo--item::after{display:none}.menu-userinfo-wrapper .menu-userinfo--item-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.menu-userinfo-wrapper .menu-userinfo--item-name{font-size:14px;color:#fff;position:relative;opacity:.8}.menu-userinfo-wrapper .menu-userinfo--item-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.menu-userinfo--detail{right:0;min-width:220px;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding-top:2px}.menu-userinfo--detail-content{background-color:#fff}.detail-content--item,.detail-content--user{white-space:nowrap;overflow:hidden;text-align:left}.detail-content--user{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.detail-content--user .detail-content--user-avatar-container{margin-right:10px}.detail-content--user .detail-content--user-avatar{display:block;width:38px;height:38px;border-radius:100%}.detail-content--user .detail-content--user-info{line-height:20px}.detail-content--user .detail-content--user-info-sub{font-size:13px;margin-top:2px}.detail-content--item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);padding:0 10px;cursor:pointer}.detail-content--item:hover{color:#247AEC}.detail-content--item .detail-content--icon{width:20px;margin-right:10px;margin-left:9px;font-size:20px}.detail-content--item-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.curtenant,.setdefault,.setdefault:hover{font-size:12px;width:64px;line-height:20px;align-items:center;height:20px;font-family:PingFangSC-Regular;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-self:start;text-align:center}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input{border:0}.setdefault{border-radius:10px;color:#666;flex-shrink:0;justify-content:flex-end;flex-direction:row}.curtenant,.setdefault:hover{border-radius:10px;color:#fff;flex-shrink:0;justify-content:flex-end;flex-direction:row}.tenant-title{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.85);letter-spacing:-.38px;display:flex;align-items:center;width:94px;flex-shrink:0;margin-left:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-start;flex-direction:row;align-self:start;margin-right:20px}.name-space{height:38px}.gw-navbar-user-dropdown{position:relative;padding:0 16px 0 14px;cursor:pointer}.gw-navbar-user-dropdown.active.gw-navbar-user-name{opacity:1}.gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail{display:block!important}.gw-navbar-user-info{display:flex;flex-direction:row;align-items:center;line-height:38px}.gw-navbar-user-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.gw-navbar-user-name{font-size:14px;color:#fff;position:relative;opacity:.8}.gw-navbar-user-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.gw-navbar-user-info-detail{position:absolute;right:0;top:calc(100% + 1px);z-index:1000;min-width:220px}.gw-navbar-user-info-content{background-color:#fff;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border:1px solid rgba(56,138,255,.2);border-radius:2px}.gw-navbar-user-info-content--menu{background-color:#fff;border-radius:2px}.gw-navbar-user-info-content-list-item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);white-space:nowrap;overflow:hidden;text-align:left;cursor:pointer}.gw-navbar-user-info-content-list-item .user-item-icon{width:20px;margin-right:10px;margin-left:9px;font-size:18px}.gw-navbar-user-info-content-list-item .user-item-icon::before{vertical-align:bottom}.gw-navbar-user-info-content-list-msg{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.gw-navbar-user-info-content-list-msg .user-item-img{width:38px;height:38px;margin-right:10px}.gw-navbar-user-info-content-list-msg .user-item-img img{display:block;width:38px;height:38px;border-radius:100%}.gw-navbar-user-info-content-list-msg .user-item-data{font-size:14px;font-weight:400;color:rgba(0,0,0,.8)}.gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section{font-size:13px;margin-top:2px}.gw-navbar-user-info-content-list-item.item-setting-list{color:rgba(0,0,0,.85);padding:0 14px}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{width:14px;height:14px}.dialog-user-edit{display:flex;flex-direction:row;align-items:center;padding:16px 26px;padding-left:18px!important}.dialog-user-edit .dialog-user-edit-icon{margin-right:12px;font-size:22px;color:#f49730}.dialog-user-edit .dialog-user-edit-text{font-size:16px;color:#000}.gw-user-edit-dialog{display:none}.gw-user-edit-dialog.show{display:block}.gw-user-edit-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;outline:0}.gw-user-edit-modal .modal-dialog{transform:translate(0,0);width:420px;height:180px;margin-left:-210px!important;margin-top:-90px!important}.edit-modal-dialog{position:absolute;width:420px;height:180px;left:50%;top:50%;margin-left:-210px;margin-top:-90px}.edit-modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;border:0 solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 4px 12px 0 rgba(0,0,0,.2);outline:0}.edit-modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;border-top-left-radius:2px;border-top-right-radius:2px;flex-shrink:0;background:#fff;color:#000;padding:12px 8px 12px 18px}.edit-modal-title{margin-bottom:0;line-height:22px;font-size:16px}.edit-modal-actions{flex:1;margin:-4px 0;display:flex;justify-content:flex-end}.edit-modal-actions-close{padding:2px;color:#bfbfbf;cursor:pointer}.edit-modal-actions-close:hover{color:rgba(0,0,0,.85)}.edit-modal-body{height:auto;overflow:hidden}.edit-modal-footer{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0;padding:16px 20px 20px}.edit-modal-footer .btn{margin-right:8px;padding:4px 15px;line-height:20px!important;font-size:14px}.edit-modal-footer .btn:last-child{margin-right:0}.gw-user-edit-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:rgba(0,0,0,.15)}.tab-list-menu-back{background:#FDFEFF;box-shadow:0 0 10px 0 rgba(57,66,100,.1);border-radius:4px}.tab-list-menu-back-item-name{font-family:PingFangSC-Regular;font-size:14px;letter-spacing:-.38px;text-align:right;z-index:980}.tab-list-menu-back-item-out{height:37.5px;border-radius:4px;margin:0 3px}.tab-list-menu-back-item-out-content{display:flex;flex-direction:row;align-items:center;line-height:37.5px}.tab-list-menu-whole{position:absolute;z-index:1000;width:auto;top:30px!important;display:none}.tab-list-menu-whole-menu{position:absolute;z-index:1000;width:auto;top:100%!important}.tab-list-menu-whole-menu-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:transparent;opacity:.4}.tab-list-menu-whole-menu-mask-state-show{transform:translateX(0)}.tab-list-menu-whole-menu-mask-state-hidden{transform:translateX(-500%)}.gw-view-tiled--container{display:flex;flex-direction:column;flex-shrink:1;flex-grow:1;flex-basis:0}.gw-view-tiled--container .gw-view-tiled--nav{display:flex;flex-direction:row;align-items:center;padding:10px 24px 8px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select{position:relative;width:218px;margin-right:18px;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:2px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select{position:relative;display:flex;flex-direction:row;align-items:center;height:28px;padding:0 36px 0 10px;line-height:28px;cursor:pointer}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text{font-size:15px;color:rgba(0,0,0,.85);margin-right:8px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow{position:absolute;right:0;top:1px;width:30px;height:26px;cursor:pointer;font-size:12px;color:rgba(0,0,0,.85)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{display:none;position:absolute;left:0;top:30px;width:218px;z-index:999;background:#fff;box-shadow:0 4px 6px 0 rgba(139,139,139,.1);max-height:calc(100vh - 200px);overflow:auto}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item{height:36px;padding-left:10px;line-height:36px;font-size:14px;color:#333;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true{display:block}.gw-view-tiled--container .gw-view-tiled--content{flex-shrink:1;flex-grow:1;flex-basis:0;padding:16px 24px;overflow-y:auto}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item{display:inline-block;position:relative;width:240px;height:80px;padding:17px 58px 17px 14px;margin-right:14px;margin-bottom:18px;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner{display:flex;flex-direction:row;align-items:center}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon{flex-shrink:0;width:46px;height:46px;margin-right:10px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img{display:block;width:36px;height:36px;margin:5px auto}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title{font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after{position:absolute;content:'\e302';right:10px;top:10px;width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;font-size:14px;color:#FFC43B;font-family:FarrisExtend;text-transform:none;display:none}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after{display:inline-block;content:'\e303'}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.menu-search-wrapper{height:40px;transition:all .2s linear;transform:translateY(-40px);margin:0 24px 0 0}.menu-search-wrapper.f-state-focus{transform:translateY(0)}.menu-search-wrapper .menu-search--placerholder{position:relative;height:40px;line-height:40px;padding-right:22px;text-align:right}.menu-search-wrapper .menu-search--placerholder .f-icon-search{margin-right:10px;color:#fff}.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text{display:inline-block;line-height:18px;font-size:13px;color:rgba(255,255,255,.49)}.menu-search-wrapper .menu-search--placerholder::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.5)}.menu-search-wrapper .menu-search--search{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px}.menu-search-wrapper .menu-search--search .menu-search--search-select{position:relative;padding:0 8px 0 16px;height:40px;line-height:40px;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text{font-size:14px;color:rgba(255,255,255,.85)}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow{margin-left:5px;font-size:14px;color:#fff}.menu-search-wrapper .menu-search--search .menu-search--search-select::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-search-wrapper .menu-search--search .menu-search--search-form{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px;padding:0 6px}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input{display:block;height:40px;line-height:40px;border:0;box-shadow:none;font-size:14px;color:#fff;background:0 0}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append{padding-right:13px;height:40px;line-height:40px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear{position:relative;padding-left:13px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after{content:'';position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-colllection-wrapper .dropdown-toggle::after{display:none}.menu-colllection-wrapper .menu-colllection--detail{width:280px}.menu-colllection-wrapper .menu-colllection--detail-title{padding:6px 16px 8px;font-size:13px;color:rgba(0,0,0,.6)}.menu-colllection-wrapper .menu-colllection--detail-item{display:flex;flex-direction:row;align-items:center;padding:11px 15px;cursor:pointer}.menu-colllection-wrapper .menu-colllection--detail-item .item-img{width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-img img{display:block;width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-content{flex:1;padding-left:14px;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title{margin-bottom:3px;line-height:18px;font-size:13px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle{line-height:16px;font-size:12px;color:rgba(0,0,0,.3);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-single-app-wrapper{position:relative;width:198px;height:116px;padding:12px 18px;margin-right:14px;margin-bottom:14px;background:#FFF;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-single-app-wrapper:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.gw-single-app--title{padding-right:20px;margin-bottom:4px;font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--subtitle{font-size:12px;color:rgba(0,0,0,.45);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--icon-container{position:absolute;right:14px;bottom:12px}.gw-single-app--icon-container img{width:36px;height:36px}.gw-app-group--header{display:flex;flex-direction:row;align-items:center;padding-bottom:14px;margin-right:10px}.gw-app-group--header .header--icon-container{width:20px;height:20px;margin:0 10px 0 0;line-height:20px}.gw-app-group--header .header--icon-container .header--icon{font-size:20px;color:rgba(0,0,0,.45)}.gw-app-group--header .header--title{font-size:14px;color:rgba(0,0,0,.75);margin-right:6px}.gw-app-group--header .header--subtitle{font-size:12px;color:rgba(0,0,0,.3)}.gw-app-group-wrapper{padding:10px 0 0}.gw-app-group--list{display:flex;flex-direction:row;flex-wrap:wrap;padding-bottom:0}.gw-apps-management{flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden;display:flex;flex-direction:column;position:fixed;top:40px;bottom:0;left:0;right:0;z-index:1000;background-color:rgba(0,0,0,.15)}.gw-apps-management .gw-apps-management--close{position:absolute;right:24px;top:17px;width:22px;height:22px;cursor:pointer}.gw-apps-management .gw-apps-management--close .f-icon{font-size:22px;color:rgba(0,0,0,.06)}.gw-apps-management .gw-apps-management--close:hover .f-icon{color:rgba(0,0,0,.25)}.gw-apps-management--header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;padding:10px 56px 10px 21px}.gw-apps-management--header .header--caption{display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--caption .header--caption-logo{padding-right:11px}.gw-apps-management--header .header--caption .header--caption-logo img{display:block;width:30px;height:30px}.gw-apps-management--header .header--caption .header--caption-title{font-size:18px;color:#000}.gw-apps-management--header .header--search{position:relative;max-width:508px;height:36px;padding:0 14px 0 34px;margin:0 auto;border-radius:18px}.gw-apps-management--header .header--search .search--input{display:block;height:34px;border:0;box-shadow:none;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--append{position:absolute;left:14px;top:0}.gw-apps-management--header .header--search .search--append .f-icon{display:block;height:34px;line-height:34px;font-size:18px}.gw-apps-management--header .header--search .search--placeholder{display:flex;flex-direction:row;align-items:center;justify-content:center;position:absolute;left:-1px;top:-1px;width:calc(100% + 2px);height:36px;line-height:36px;border-radius:18px}.gw-apps-management--header .header--search .search--placeholder .f-icon{display:block;margin-right:14px;color:#979797}.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text{font-size:14px;color:rgba(0,0,0,.25)}.gw-apps-management--header .header--search .search--result-panel{position:absolute;top:40px;left:0;right:0;padding:10px 18px 0;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;z-index:100;max-height:310px;overflow-y:auto}.gw-apps-management--header .header--search .search--result-panel .search--result-title{font-size:13px;color:rgba(0,0,0,.6)}.gw-apps-management--header .header--search .search--result-panel .search--result-list{margin:8px -18px}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name{display:flex;flex-direction:row;align-items:center;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path{flex-grow:1;flex-shrink:1;flex-basis:0;padding-left:16px;font-size:12px;color:rgba(0,0,0,.45);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-apps-management--header .header--search .search--result-panel .search--result-more{height:40px;line-height:40px;text-align:center;border-top:1px solid #ECECEC;font-size:12px;color:rgba(0,0,0,.75);cursor:pointer;margin:0 -18px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;margin-top:14px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item{height:20px;padding:0 10px;margin:0 10px 14px 0;background:rgba(219,224,230,.5);border-radius:13px;font-size:13px;line-height:20px;color:#8A96A5;list-style:none;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{color:#fff;box-shadow:0 2px 4px 0 rgba(25,76,164,.09)}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match{color:#fff}.gw-apps-management--header .header--search .search--prompt-panel{padding-bottom:14px}.gw-apps-management--header .header--view{flex-shrink:0;display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--view .view--btn{text-align:center;white-space:nowrap;vertical-align:middle;padding:0 10px;line-height:28px;background:rgba(240,240,240,.6);margin-left:-1px;cursor:pointer}.gw-apps-management--header .header--view .view--btn .view--btn-icon{font-size:13px;color:rgba(0,0,0,.2)}.gw-apps-management--header .header--view .view--btn.active{border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06)}.gw-apps-management--header .header--view .view--btn.active .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:hover:not(.active){border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06);position:relative}.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.gw-apps-management--header .header--view .view--btn:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.gw-apps-management--header .header--settings{position:relative}.gw-apps-management--header .header--settings .header--settings-icon{display:inline-block;height:28px;width:48px;text-align:center;line-height:28px;color:#979797;cursor:pointer}.gw-apps-management--header .header--settings .header--settings-panel{position:absolute;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding:16px 14px;top:34px;width:162px;right:0;opacity:0;transition:opacity .1s linear}.gw-apps-management--header .header--settings .header--settings-panel.f-state-show{opacity:1}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow{width:16px;height:8px;margin:0 2px;position:absolute;top:-8px;right:13px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before{content:'';position:absolute;border-width:0 .5rem .5rem;border-color:transparent;border-style:solid;border-bottom-color:rgba(56,138,255,.2);top:0}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after{content:'';position:absolute;border-color:transparent transparent #fff;border-style:solid;border-width:0 .5rem .5rem;top:1px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content{font-size:13px;color:rgba(0,0,0,.8)}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item{display:flex;align-items:center;justify-content:space-between}.gw-apps-management--content{overflow-y:auto;flex-shrink:1;flex-grow:1;flex-basis:0;padding:20px 0 20px 24px}.gw-apps-management--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.search--result-item-keyboard--control{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.launchpad-full-view{margin-right:16px}.launchpad-full-icon{transform:rotate(180deg)}.launchpad-full{margin-bottom:2px;cursor:pointer}.gw-switch{position:relative;display:inline-block;box-sizing:content-box;padding:0;margin:0;cursor:pointer;transition:.3s ease-out all;-webkit-transition:.3s ease-out all;white-space:nowrap;min-width:32px;height:18px;border-radius:20px;background-color:#d9d9d9}.gw-switch.f-state-checked{background:#49C265}.gw-switch.f-state-checked small{right:2px;left:auto}.gw-switch small{left:2px;border-radius:100%;position:absolute;top:1px;transition:.2s ease-out all;-webkit-transition:.3s ease-out all;background:#fff;width:16px;height:16px;font-size:80%}.f-component-walk-page.active{display:block}.f-component-walk-page .f-page-walker-detail-wrapper{position:absolute;z-index:333333}.f-component-walk-page .f-page-walker-detail-wrapper-img{background:0 0}.f-component-walk-page .f-page-walker-detail-wrapper-content{position:absolute}.f-component-walk-page .f-page-walker-detail-wrapper-content-right{left:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-left{right:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom,.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom{top:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content-top{bottom:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow{position:absolute;display:block;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.f-component-walk-page .f-page-walker-detail-wrapper-content-default{box-shadow:0 3px 10px 0 rgba(0,0,0,.15);border-radius:2px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top{margin-bottom:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow{bottom:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after{border-width:10px 8px 0;bottom:2px;border-top-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right{margin-left:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow{left:-12px;top:28px;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after{border-width:8px 10px 8px 0;left:2px;border-right-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow{top:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left{margin-right:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow{top:28px;right:-12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after{border-width:8px 0 8px 10px;right:2px;border-left-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow{top:-12px;right:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default{box-shadow:0 2px 10px 0 rgba(38,40,56,.23)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner{position:relative;display:flex;flex-direction:column;min-width:419px;min-height:165px;padding:24px 12px;background-color:#fff;border-radius:3px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content{position:relative;min-height:60px;padding-left:74px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:3px;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img{display:block;width:60px;height:60px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title{display:flex;flex-direction:row;align-items:center}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number{flex-shrink:0;padding-right:6px;font-size:12px;color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current{font-size:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text{font-size:16px;color:rgba(0,0,0,.85);font-weight:600;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle{flex-shrink:1;flex-grow:1;flex-basis:0;margin-top:6px;font-size:13px;min-height:44px;color:rgba(0,0,0,.65);line-height:22px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns{display:flex;flex-direction:row;align-items:center;padding-top:17px;padding-right:10px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn{flex-grow:1;flex-shrink:0;flex-basis:0;display:flex;flex-direction:row;align-items:center;justify-content:flex-end}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn{margin-right:6px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child{margin-right:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close{position:absolute;right:10px;top:10px;width:30px;height:30px;line-height:30px;text-align:center;cursor:pointer}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon{font-size:18px;color:rgba(0,0,0,.45)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon{color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip{display:flex;flex-direction:row;align-items:center;padding-left:74px;background-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn{color:rgba(0,0,0,.35)}.user-setting{position:absolute;top:0;right:0;bottom:0;left:0}.user-setting-list{width:286px;min-width:286px;background-color:#fff;overflow-y:auto;overflow-x:hidden}.user-setting-list .user-setting-message{padding-bottom:32px;padding-top:32px}.user-setting-list .user-setting-message .user-avatar{width:86px;height:86px;margin:0 auto 18px;position:relative}.user-setting-list .user-setting-message .user-avatar .user-avatar-img{display:block;width:86px;height:86px;border-radius:100%}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon{position:absolute;width:86px;height:86px;border-radius:100%;background:rgba(0,0,0,.3);top:0;left:0;line-height:86px;text-align:center;display:none}.user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon{display:block}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon{font-size:24px;color:#fff}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{position:absolute;width:22px;height:22px;line-height:22px;border:1px solid #fff;right:0;bottom:0;border-radius:100%;color:#fff;text-align:center}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon{font-size:12px;vertical-align:initial}.user-setting-list .user-setting-message .user-title{text-align:center}.user-setting-list .user-setting-message .user-title .user-name{font-size:16px;color:rgba(0,0,0,.75);margin-bottom:6px}.user-setting-list .user-setting-message .user-title .user-post{font-size:12px;color:rgba(0,0,0,.45)}.user-setting-list .user-setting-menu{padding:24px 0;border-top:1px solid #f0f0f0}.user-setting-list .user-setting-menu .menu-item-inner{width:286px;height:48px;line-height:48px;padding-left:38px;padding-right:20px;cursor:pointer}.user-setting-list .user-setting-menu .menu-item-inner.active{padding-left:35px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-title{display:flex;flex-direction:row;align-items:center}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon{margin-right:18px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-text{font-size:14px;color:rgba(0,0,0,.75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-setting-content{flex-grow:1;padding:0 10px 10px;overflow-x:auto;overflow-y:hidden}.user-setting-content-inner{height:100%;background:#fff;padding:24px;overflow-y:auto}.user-setting-content-wrapper-title{color:#000;display:inline-flex;align-items:center;line-height:1.375rem;position:relative;overflow:hidden;padding:0 0 0 1rem;min-width:760px}.user-setting-content-wrapper-title::before{content:'';width:.25rem;height:1.125rem;border-radius:1px;position:absolute;top:50%;left:0;margin-top:-.5625rem}.user-setting-content-wrapper-title .title-text{font-size:1rem;line-height:1.375rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-bottom:0;margin-right:10px}.user-setting-content-wrapper-title .title-line{flex-grow:1;border-bottom:1px dashed rgba(0,0,0,.1)}.user-setting-content-wrapper-title .title-edit-btn{font-size:14px;padding-left:10px;cursor:pointer}.user-setting-content-wrapper-title .title-edit-btn .f-icon{font-size:14px;margin-right:4px;vertical-align:inherit}.user-setting-content-wrapper-main{padding:27px 0 32px}.user-setting-content-wrapper-main .user-setting-form{padding-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap{max-width:25rem;display:flex;flex-grow:0;flex-shrink:0;flex-basis:auto;flex-flow:row wrap;align-items:center;margin-bottom:.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns{margin-bottom:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label{display:flex;align-items:center;width:6rem;flex-shrink:0;margin-right:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-end;flex-direction:row;align-self:start;height:1.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap{flex-grow:1;flex-shrink:1;flex-basis:auto}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip{font-size:14px;color:rgba(0,0,0,.45);margin-top:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control{height:28px!important}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control,.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group{border:1px solid transparent;border-bottom-color:#ececec}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn{margin-left:10px;padding-top:4px;padding-bottom:4px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child{margin-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link{color:rgba(0,0,0,.75)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list{margin-right:40px;position:relative;cursor:pointer}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child{margin-right:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{width:50px;height:50px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img{background-color:rgba(217,38,44,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img{background-color:rgba(0,192,222,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name{font-size:14px;color:rgba(0,0,0,.65);margin-top:14px;text-align:center}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{content:'';position:absolute;width:58px;height:58px;background:0 0;left:-4px;top:-4px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{position:absolute;right:-1px;top:35px;border-radius:100%;background-color:#fff;display:none}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon{display:block;width:16px;height:16px;vertical-align:inherit;border-radius:100%;border:1px solid #fff;font-size:14px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check{display:block}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img{width:64px;height:52px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{width:72px;height:60px;border-radius:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{right:-10px;top:45px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color{margin-bottom:44px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label{height:50px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label{height:60px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto{min-width:43.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list{flex:1;padding-right:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child{padding-right:0}.dialog-user-avatar-tips{padding:0 24px 14px;margin-top:12px;font-size:12px;color:rgba(0,0,0,.45)}.dialog-user-avatar{padding:24px 32px 0 24px;display:flex;flex-direction:row}.dialog-user-avatar-change{padding-right:36px;border-right:1px solid #EFEFEF}.dialog-user-avatar-view{padding-left:36px}.dialog-user-avatar-view .avatar-view-title{font-size:14px;color:rgba(0,0,0,.75);text-align:center;margin-bottom:15px}.dialog-user-avatar-view .avatar-view-size{margin-bottom:32px}.dialog-user-avatar-view .avatar-view-size:last-child{margin-bottom:0}.dialog-user-avatar-view .avatar-view-size .img{display:block;width:100px;height:100px;border-radius:100%;overflow:hidden;margin:0 auto;border:1px solid #EFEFEF}.dialog-user-avatar-view .avatar-view-size .avatar-view-size-text{font-size:12px;color:rgba(0,0,0,.45);display:block;text-align:center;margin-top:10px}.mode-active,.searce .select-show-mode .show-mode-active,.subcount-info:hover{color:#2277E4!important}.dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img{width:50px;height:50px}.isdisplay{display:none}.themesdefault{background-color:#1A78F7}.themesdefault:hover{background-color:#59a1ff}.gw-header{background:linear-gradient(207deg,#1D7DEA 0,#1576F7 100%)}.gw-header .gw-header--exitfullscreen-wrapper{border-top:1px solid #2277E4}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{background:url(../../../img/orishow.svg) no-repeat}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover{background-image:url(../../../img/passshow.svg) no-repeat}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{background:linear-gradient(269deg,#0460DB 0,#1562E5 50%,#0460DB 100%)}.gw-header-toolbar--content:hover{background-color:#186BD9}.gw-apps-management--tabs-container .tabs-container--item.active{background-image:linear-gradient(225deg,#3A98FF 0,#0971FF 100%)}.tabs-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#049FFF 26%,#0971FF 67%,rgba(9,113,255,.13) 95%)!important}.tabs-container--vertical .list-group .list-group-item.active,.tabs-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(243deg,#F1FCFF 0,#F1FCFF 26%,#F1FCFF 67%,#F1FCFF 95%)!important}.keyApplication .group .module--list .module--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#388AFF 50%,#C2E9FB 100%)}.keyApplication .group .module--list .module--list-item:hover{color:#1A78F7}.listview--nav-horizontal .active .keyApplicationName{background-color:#1A78F7}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{color:#2987FE}.menu-submenu--title-selected{color:#1A78F7!important}.menu-submenu--title:hover,.menu-submenu--title:hover .menu-item--text,.tileview--menu-item:hover,.tileview--menu-item:hover .menu-item--text{color:#1A78F7}.tileview--menu-item-selected{color:#187BF9;background:#EAF3FF}.tileview--menu .menu-list-item--arrow,.tileview--menu-item-selected .menu-item--text{color:#187BF9}.application-list--header-title--icon .header-title--icon-item{background:rgba(56,143,255,.9)}.application-list--header-title--icon .header-title--icon-item-right{background:rgba(56,143,255,.5)}.application-wrapper--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#388AFF 50%,#C2E9FB 100%)}.application-wrapper--list-item:hover .application-wrapper--list-item-text{color:#1A78F7}.tileview--menu-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#049FFF 26%,#0971FF 67%,rgba(9,113,255,.13) 95%)}.keyApplication-header-wrapper .module-head .module-header--icon{color:#2987FE}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{background:rgba(56,143,255,.9)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{background:rgba(56,143,255,.5)}.tileview--menu-image{-webkit-filter:drop-shadow(#1A78F7 20px 0);filter:drop-shadow(#1A78F7 20px 0)}.notactive{color:#596580!important}.down-arrow.active::after{border-color:#1A78F7}.detail-content--item-content,.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{border-top:1px solid #F5F7FA}.tabset--nav-container{background:#EBEEF4}.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon{background-image:url(../../../launcher/home-icon-selected.svg)}.tabset--nav-container .nav .tabset--nav-link{color:#596580;font-size:13px;padding:0 10px 0 16px;height:36px;line-height:36px}.tabset--nav-container .nav .tabset--nav-link:hover{background:#E1E5EE}.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close{color:#666}.tabset--nav-container .nav .tabset--nav-link.active{color:#3E4A65;background:#F8F9FB}.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close{color:#666}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#049FFF 26%,#0971FF 67%,rgba(9,113,255,.13) 95%)}.detail-content--item:hover{background-color:#F5F7FA}.curtenant,.setdefault:hover{background:#186BD9}.curtenant{color:#fff}.curtenant-font-color{color:#1A78F7!important}.gw-navbar-user-dropdown.active,.gw-navbar-user-dropdown:hover{background-color:#186BD9}.gw-navbar-user-info-content-list-item.item-setting-list:hover{color:#1A78F7;background-color:#F5F7FA}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{background-image:url(../../../img/tenant_change.svg)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{border:1px solid #F5F7FA}.gw-single-app-wrapper:hover,.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{-o-border-image:linear-gradient(135deg,#A1C4FD,#C2E9FB) 30 30;border-image:linear-gradient(135deg,#A1C4FD,#C2E9FB) 30 30}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover{background-color:#F1FCFF}.menu-search-wrapper .menu-search--search{background:#186BD9}.menu-colllection-wrapper .menu-colllection--detail-item:hover{background:#F5F7FA}.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title{color:#1A78F7}.menu-colllection-wrapper.show .menu-colllection--item{background-color:#186BD9}.gw-app-group.f-state-active .gw-app-group--header .header--icon{color:#2987FE}.gw-apps-management--header .header--search{background:#F5F7FA;border:1px solid #F5F7FA}.gw-apps-management--header .header--search .search--input{background:#F5F7FA}.gw-apps-management--header .header--search .search--append .f-icon{color:#388AFF}.gw-apps-management--header .header--search.f-state-focuse,.gw-apps-management--header .header--search:hover{border:1px solid #59a1ff}.gw-apps-management--header .header--search .search--placeholder{background:#F5F7FA;border:1px solid #F5F7FA}.gw-apps-management--header .header--search .search--result-panel .match{color:#187BF9}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check,.user-setting-content-wrapper-title .title-edit-btn,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text{color:#388AFF}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover{background:#F5F7FA}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{background-image:linear-gradient(215deg,#1C7CEA 0,#1A78F7 100%)}.gw-apps-management--header .header--view .view--btn.active,.gw-apps-management--header .header--view .view--btn:hover:not(.active){background-image:linear-gradient(225deg,#3A98FF 0,#0971FF 100%)}.search--result-item-keyboard--control{background:#F5F7FA}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{background-color:#59a1ff}.user-setting-list .user-setting-menu .menu-item-inner.active{border-left:3px solid #388AFF}.user-setting-content-wrapper-title::before{background:#59a1ff}.user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before{background-color:#5ACBCD}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{background-color:#388AFF}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{border:1px solid rgba(56,143,255,.5)}.user-setting-list .user-setting-menu .menu-item-inner.active,.user-setting-list .user-setting-menu .menu-item-inner:hover{background-color:#F5F7FA}.tabset--nav-container .nav{height:36px}.tabset--nav-container .nav .nav-link-close{margin:0 0 0 14px} \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/green/gsp-cloud-web.min.css b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/green/gsp-cloud-web.min.css index 7b9a8b8770a355ff12fcf494470cbd5a7edefd09..36e891c80c60a83e2d4771b9c107ffd2324ff20b 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/green/gsp-cloud-web.min.css +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/green/gsp-cloud-web.min.css @@ -1 +1,5042 @@ -@charset "UTF-8";.g-main,.gw-page-wrapper{top:0;right:0;position:absolute;left:0;bottom:0}.g-main{margin:0 auto;font-size:.875rem}.font-size-13{font-size:.8125rem!important}.font-size-14{font-size:.875rem!important}.font-size-normal{font-size:1rem!important}.font-size-middle{font-size:1.5rem!important}.font-size-lg{font-size:3rem!important}.flex-auto{flex-grow:1;flex-shrink:1;flex-basis:auto}.g-pointer{cursor:pointer}.gw-page-wrapper{overflow:hidden;display:flex;flex-direction:column}.login-section,.subcount-info,.themesdefault,.themesgreen,.themesred,.wrapper-content{position:relative}.gw-page-header>.row{overflow:hidden}.wrapper-content{margin:0}.themestitle{display:inline-block;margin-left:35px;text-align:center;font-family:PingFangSC-Light;font-size:14px;color:rgba(0,0,0,.85)}.themesheader{margin-left:25px;margin-bottom:25px;font-family:PingFangSC-Regular;font-size:16px;color:rgba(0,0,0,.85)}.module-title2,.themesd{margin-bottom:10px}.themesd{display:inline-block;vertical-align:middle;margin-top:-20px}.themesdefault,.themesdefault:hover,.themesgreen,.themesgreen:hover,.themesred,.themesred:hover{height:50px;border-radius:5px;cursor:pointer;margin-top:5px;width:50px}.themesred{background-color:#D9262C}.themesred:hover{background-color:#DF464B}.themesgreen{background-color:#00C0DE}.themesgreen:hover{background-color:#30CFE8}.themebanIn,.themebanOut{height:50px;border-radius:5px;opacity:.25;margin-top:-40px;cursor:pointer}.themesinimg{padding-left:17px;padding-top:19px;display:flex}.themesoutimg{padding-left:17px;padding-top:19px;display:none}.themessize{display:flex;padding-left:7px;padding-top:10px}.themebanIn{background:#000;width:50px}.themebanOut{background:#000;width:50px;display:none}.themesizeIn{margin-top:-52px;position:absolute}.applicationhome{border-right:1px solid rgba(255,255,255,.3)!important;padding-right:13px!important}.collection-10,.collection-100,.collection-max{border-radius:9px;background:red;font-size:12px!important;text-align:center;color:rgba(255,255,255,.9);line-height:18px!important;padding:0 6px!important;font-family:arial,sans-serif}.gw-header--caption{margin:0 0 0 20px}.gw-header--caption-img{display:block;max-height:38px}.collection-10,.collection-100,.collection-max,.subcount-info{display:inline-block}.collection-10{margin:2px -5px}.collection-100{margin:2px -11px}.collection-max{margin:2px -13px}.subcount-info{color:rgba(0,0,0,.25)!important;padding:0 7px;cursor:pointer;line-height:28px!important}.subcount-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.subcount-info .material-icons{display:block}#search:-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-webkit-input-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}app-login-container{background:#fff;position:absolute;top:0;left:0;bottom:0;right:0;overflow:auto}.login-logo{width:26.69rem;height:18rem;overflow:hidden;margin-right:4.5rem;background:url(../../../img/login-logo@2x.png) no-repeat;background-size:427px 288px}.login-logo h1{font-family:PingFangSC,'Segoe UI','microsoft yahei',sans-serif;font-size:1.625rem;line-height:2.5rem;padding:9.5rem 0 0 5rem;color:#666560;margin:0}.login-logo .logo-en{font-size:1.375rem}.login-section{width:24.31rem;padding-left:2.56rem;float:left}.login-section h2{font-size:1.75rem;color:#333;margin:.25rem 0 1.31rem}.login-form .custom-select,.login-form .form-control{margin:0 0 1.13rem;line-height:26px;border-radius:.25rem;padding-top:.3125rem;padding-bottom:.3125rem;height:32px}.btn-login{background:#24abe9;color:#fff;height:3.25rem;font-size:1rem}.btn-regist{padding:1.25rem 0 0;font-size:.875rem}.btn-regist a{border-bottom:1px solid #24abe9;color:#24abe9;padding:0 0 .125rem}.btn-regist a:hover{text-decoration:none}.remember-info{padding:0 0 0 1.25rem}.login-lg{display:inline-block;width:1.88rem;height:1.31rem;background:url(../../../img/language@2x.png) no-repeat;background-size:30px auto}.lg-en{background-position:0 0}.lg-zh-cn{background-position:0 -24px}.login-lg-text{color:#373d41}.auth-form-container{padding:6.56rem 0 0}.login-lg-area{position:absolute;top:-5rem;right:-65%}.login-lg-dropdown .btn:active,.login-lg-dropdown .btn:focus{outline:0}.login-lg-dropdown .dropdown-menu{right:0;left:auto}.login-log-container{flex-direction:row-reverse!important}@media (max-width:1200px){.login-lg-area{right:0}}@media (max-width:992px){.login-logo{margin:0 auto}.login-section{width:90%;padding:0 0 0 10%;margin:0 auto}}@media (max-width:768px){.login-log-container{flex-direction:row!important}}@media (max-width:576px){.login-lg-area{right:0;top:.5rem}.auth-form-container{padding:1rem 0 0}.login-section{padding:0;float:none;border-left:none}}.gw-header-toolbar .material-icons{font-size:22px}.gw-header-toolbar .count-info{color:rgba(255,255,255,.65)!important;position:relative;display:block;padding:9px 11px;cursor:pointer}.gw-header-toolbar .count-info:hover{color:#fff!important}.gw-header-toolbar .count-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.gw-header-toolbar .count-info .material-icons{display:block}.gw-userinfo-menu .leftMenu{left:-100px!important}.gw-userinfo .user-profile{outline:#000;text-align:left;color:#000;border:1px solid #000;margin:20px;width:700px;padding:10px}.gw-userinfo span.title{display:block;width:80px;height:30px;position:relative;top:-20px;text-align:center;background:#fff}.gw-header-toolbar .leftMenu a{display:block;padding:0}.gw-page-header-tabscontrol{display:none}.full-width{width:100%!important}.scrollbar-x-hidden{overflow-x:hidden}.border-none{border:0!important}.gw-header{color:#f5f5f5;padding:0;z-index:910;box-shadow:0 0 10px 0 rgba(57,66,100,.1)}.gw-header .gw-header--exitfullscreen-wrapper{position:fixed;top:0;left:0;right:0;height:12px;z-index:900}.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn{display:block}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{display:none;cursor:pointer!important;height:18px;width:120px;margin:0 auto;position:relative;z-index:2000}.gw-header--toast{background:#333;opacity:.9;color:#FFF;line-height:43px;text-align:center;border-radius:4px;height:46px;width:256px;margin:46px auto;display:none}.gw-header--toast-show{display:block;-webkit-animation-name:exitFullScreenToastFadeInDown;animation-name:exitFullScreenToastFadeInDown;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:fixed;left:50%;margin-left:-128px}@-webkit-keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}@keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}.gw-header--wrapper{display:flex;flex-direction:row;align-items:center}.gw-header--application-icon-container .application-icon-active,.gw-header--application-icon-container.f-state-active::after,.gw-header--application-icon-container:hover::after{display:none}.gw-header--application-icon-container{position:relative;width:55px;height:40px;color:#fff;text-align:center;cursor:pointer}.gw-header--application-icon-container::after{position:absolute;content:'';width:1px;height:16px;right:0;top:50%;margin-top:-8px;background-color:rgba(255,255,255,.3)}.gw-header--application-icon-container .f-icon{font-size:1rem;line-height:38px}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{color:#fff}.gw-header--application-icon-container.f-state-active .application-icon-active,.gw-header--application-icon-container:hover .application-icon-active{display:inline-block}.gw-header--application-icon-container.f-state-active .application-icon,.gw-header--application-icon-container:hover .application-icon{display:none}.gw-header-toolbar--list{display:flex;align-items:center}.gw-header-toolbar--content{display:block;height:40px;padding:0 11px;line-height:40px;cursor:pointer}.gw-apps-management-wrapper{background:#fff;min-width:600px;height:100%;display:flex;flex-direction:column;margin:0 70px 0 0;position:relative}.gw-apps-management-wrapper .header{padding:11px 0 17px 20px;height:56px}.gw-apps-management-wrapper .header .intro{font-weight:700;font-family:PingFangSC-Medium;font-size:18px;color:#333;text-align:left;display:inline-block}.gw-apps-management-wrapper .header .searce{float:right;margin-right:21px;position:relative;top:0;height:28px}.gw-apps-management-wrapper .header .searce .searce-img1{width:14px;position:relative;right:8px;top:7px;cursor:pointer;float:left}.gw-apps-management-wrapper .header .searce .setup-img{position:relative;top:-1px;margin-left:9px}.last-app-group>.app-group{min-height:calc(100vh - 171px);margin-bottom:25px!important}.searce .select-show-mode{display:inline-block;margin:0 -2px 0 -3px}.searce .select-show-mode .show-mode{display:inline-block;width:30px;height:26px;background:#eaeaea;position:relative;top:8px;cursor:pointer}.searce .select-show-mode .show-mode img{width:14px;height:14px;position:relative;top:6px;left:8px}.searce .select-show-mode .show-mode .default-img{display:block}.searce .select-show-mode .show-mode .hover-img,.searce .select-show-mode .show-mode .selected-img,.searce .select-show-mode .show-mode:hover .default-img,.searce .select-show-mode .show-mode:hover .selected-img{display:none}.searce .select-show-mode .magnetic-sticker-mode{border-top-left-radius:2px;border-bottom-left-radius:2px;margin-left:15px;position:relative;left:4px}.searce .select-show-mode .all-app-mode{border-top-right-radius:2px;border-bottom-right-radius:2px;position:relative;left:-4px}.searce .select-show-mode .show-mode:hover .hover-img{display:block}.searce .select-show-mode .show-mode-active .default-img{display:none}.searce .select-show-mode .show-mode-active .selected-img{display:block}.gw-apps-management--tabs-container{display:flex;width:100%;position:relative;padding:9px 0 9px 19px;border-bottom:1px solid rgba(0,0,0,.06)}.gw-apps-management--tabs-container .tabs-container--horizontal{flex-wrap:nowrap;overflow:hidden;margin:0;cursor:pointer}.gw-apps-management--tabs-container .tabs-container--horizontal-length{margin-right:65px}.gw-apps-management--tabs-container .tabs-container--item{margin-top:1px;flex-grow:1;flex-basis:auto;position:relative;margin-right:2px;height:30px;line-height:30px;flex-shrink:0;cursor:pointer;list-style:none;border-radius:15px;padding:0 19px;color:#333}.gw-apps-management--tabs-container .tabs-container--item.active{color:#fff;box-shadow:0 4px 4px 0 rgba(25,76,164,.09)}.listview---nav-vertical,.tabs-container--vertical{box-shadow:0 0 6px 0 rgba(139,139,139,.27);z-index:1000}.tabs-container--vertical-smallscreen{height:calc(100vh - 200px)!important}.tabs-container--vertical{display:none;width:247px;height:556px;background:#fff;overflow:auto}.tabs-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabs-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabs-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabs-container--vertical.show{display:flex;position:absolute;right:25px;top:51px}.tabs-container--vertical .list-group{flex:auto}.tabs-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;cursor:pointer}.tabs-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.searce .searce-input,.set-up,.tips{position:relative}.set-up,.set-up img{width:14px;height:14px}.tabs-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabs-container--vertical .list-group .list-group-item:first-child{border-radius:0}.set-up{cursor:pointer;float:right;right:0;top:15px;margin-left:16px}.set-up .set-up-img{display:block}.set-up .set-up-img-down,.set-up .set-up-img-hover,.set-up:hover .set-up-img{display:none}.set-up:hover .set-up-img-hover{display:block}.setUpMousedown .set-up-img,.setUpMousedown .set-up-img-hover{display:none!important}.setUpMousedown .set-up-img-down{display:block!important}.searce .searce-input{border:none;outline:0;background:#fff;border-radius:20px;width:200px;height:28px;padding-left:12px;padding-right:30px;right:-20px;float:left;top:0}.searce input::-webkit-input-placeholder{font-size:12px;color:#999;text-align:left}.searce input::-ms-input-placeholder{font-size:12px;color:#999;text-align:left}gsp-list-index{background-color:#fff}.tips{display:inline-block;width:0;margin:0 -2px}.tips .tips-content{position:absolute;top:-11px;z-index:2;display:none;width:68px;height:28px;background-color:#5a676f;border-radius:2px;text-align:center;line-height:28px;font-size:12px;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tips .magnetic-sticker-mode-tips{left:-47px}.tips .list-mode-tips{left:-51px}.tips .all-app-mode-tips{left:-55px}.select-show-mode:hover .tips-content{display:block!important}.keyApplication1,.keyApplication2,.keyApplication3,.module{display:none}.international-nav-container .nav a{padding:0 19px;margin-right:2px}.last-app-group /deep/ .app-group .content{min-height:calc(100vh - 235px)}.last-app-group .last-app-group-height{min-height:calc(100vh - 165px)}.search-fra{background:#FFF!important;border:1px solid #E0E0E0!important;border-radius:4px!important}.search-fra:focus{background:#FFF!important;border:1px solid #0068F3!important;border-radius:4px!important}input::-webkit-calendar-picker-indicator{display:none}.tabs-container--dropdown{position:absolute;right:0;top:7px;width:52px;height:36px;background:#fff;box-shadow:-1px 0 1px 0 rgba(0,0,0,.12);cursor:pointer}.tabs-container--dropdown .f-icon{width:36px;height:36px;line-height:36px;text-align:center;font-size:18px;color:rgba(0,0,0,.5)}.tabs-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.module{height:calc(100vh - 246px)}.keyApplication,.keyApplication-header-wrapper{padding:0 24px}.keyApplication .module,.keyApplication-header-wrapper .module-head .module-header--content{margin-right:54px}.keyApplication-header-wrapper .module-head{flex-shrink:0}.keyApplication-header-wrapper .module-head .module-header--icon{width:20px;height:20px;margin-right:10px}.keyApplication{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0;width:100%;align-content:flex-start;align-items:flex-start;overflow:auto}.keyApplication .keyApplication::-webkit-scrollbar{width:7px!important;height:7px!important;background-color:#8e8e8e}.keyApplication .module{position:relative;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start;align-items:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0}.keyApplication .module .module-title{position:absolute;top:-33px;width:100%;height:31px;border-bottom:1px solid #d2deea;font-size:16px;color:#333}.keyApplication .group{width:200px;margin-bottom:5px;margin-top:14px}.keyApplication .group .group-title{font-size:14px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;padding-bottom:14px}.keyApplication .group .group-title .group-title--icon-container{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{margin-left:4px}.keyApplication .group .group-title .group-title--text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;color:rgba(0,0,0,.65)}.keyApplication .group .module--list{padding-left:0;margin-bottom:0}.keyApplication .group .module--list .module--list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:14px;padding:5px 33px 5px 10px;margin-right:24px;position:relative;color:rgba(0,0,0,.85)}.keyApplication .group .module--list .module--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.keyApplication .group .module--list .module--list-item:hover{cursor:pointer;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.keyApplication .group .module--list .module--list-item:hover::after{opacity:1}.keyApplication .group .module--list .module--list-item:hover .module--list-collect{display:block}.keyApplication .group .module--list .module--list-text{font-size:14px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.keyApplication .group .module--list .module--list-collect{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;text-align:center;cursor:pointer;color:#FFC43B}.keyApplication .group .module--list.f-state-collected .module--list-collect,.listview--nav-horizontal .active .tab-img{display:block}.keyApplication .group .module--list .module--list-collect .f-icon{font-size:15px;line-height:20px}.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before{content:'\e303'}.keyApplication-active{display:flex}.keyApplication-background-show-right{background-image:url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg);background-position:97% 92%;background-repeat:no-repeat}.listview--nav-horizontal{overflow:hidden;padding-left:24px;padding-right:24px;height:52px;width:100%;background-color:#fff;position:relative;top:-8px;border-bottom:2px solid #ebebeb;margin-bottom:12px;flex-wrap:nowrap;display:flex}.listview--nav-horizontal .listview--nav-link{display:inline-block;height:14px;margin-right:16px;text-decoration:none}.listview--nav-horizontal .listview--nav-link .keyApplicationName{font-size:16px;color:grey;text-align:center;padding:0 17px 0 20px;height:40px;line-height:40px;margin-left:5px;margin-right:5px;position:relative;top:11px;border-top-left-radius:2px;white-space:nowrap}.listview--nav-horizontal .active .keyApplicationName{color:#fff}.listview--nav-horizontal .tab-img{float:right;height:40px;position:relative;top:-45px;left:3px;display:none}.imgyinying{background:url(../../../img/矩形@2x.png);width:8px}.out-keyApplication{overflow:hidden;display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;flex-basis:0}.out-keyApplication .module-head{position:relative}.out-keyApplication .module-head .module-header--content{display:flex;flex-direction:row;align-items:center;padding:10px 0;border-bottom:1px solid #e5e5e5}.out-keyApplication .module-head .module-title-img{display:block;width:16px;height:16px;margin-right:10px}.out-keyApplication .module-head .module-title{width:200px;font-size:15px;color:rgba(0,0,0,.85);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:0}.international-nav .nav-a .keyApplicationName{font-size:14px;padding:0 18px 0 20px}.international-content .keyApplication .module-head .module-title{font-size:14px;position:relative;top:2px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.international-content .keyApplication .group{width:auto;padding-right:10px}.international-content .keyApplication .group .group-title{max-width:240px}.international-content .keyApplication .module .module--list-item{font-size:12px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.listview--nav-container{display:flex;width:100%;position:relative;padding-right:22px;overflow:auto}.listview--nav-container .nav{flex-wrap:nowrap;overflow:hidden}.listview---nav-vertical{display:none;width:247px;height:556px;background:#fff}.listview---nav-vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.listview---nav-vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.listview---nav-vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.listview---nav-vertical.show{display:flex;position:absolute;right:25px;top:45px}.listview---nav-vertical .list-group{flex:auto}.listview---nav-vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px}.listview---nav-vertical .list-group .list-group-item.active,.listview---nav-vertical .list-group .list-group-item:hover{background:#ddecff}.listview---nav-vertical .list-group .list-group-item:first-child{border-radius:0}.jianyin{width:30px;height:30px;background-color:#f6f6f6;background:linear-gradient(to bottom,#fff,#f6f6f6);position:absolute;right:52px;opacity:0}.btn-nav-all-dropdown,.btn-nav-all-dropdown2{padding:2px 1px 1px;background-color:#f6f6f6;line-height:1}.btn-nav-all-dropdown{flex:none;height:30px;position:absolute;right:20px;top:10px}.btn-nav-all-dropdown .active,.btn-nav-all-dropdown2 .active{top:4px}.btn-nav-all-dropdown:focus{box-shadow:none}.double-slash{font-family:PingFangSC-Regular;font-size:14px!important;color:#0F4D9E!important;line-height:14px;background:-30px center no-repeat #F9F9F9;border-radius:2px;height:26px;background-size:50% 50%;display:flex;align-items:center;padding-left:33px}.gw-apps-management--listview,.gw-apps-management--listview .listview--keyapp-list{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column;overflow:hidden}.gw-apps-management--tileview{display:flex;flex-direction:row;flex-wrap:nowrap;border-top:1px solid rgba(0,0,0,.06);flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden}.gw-apps-management--tileview .tileview--nav{width:230px;background:rgba(247,249,250,.8);border-right:1px solid rgba(0,0,0,.06);overflow-y:auto}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--content{flex-grow:1;flex-shrink:1;flex-basis:0;padding:0 0 24px 30px;background:#fff;overflow-y:auto}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--app-wrapper{padding:0;margin:.875rem 1rem 0 0}.tileview--menu-item-height-default{height:37px}.menu-submenu--title-height-default{height:45px}.menu-submenu--title,.tileview--menu-item{padding:0 0 0 63px;position:relative;cursor:pointer}.menu-submenu--title .menu-item--icon,.tileview--menu-item .menu-item--icon{position:absolute;top:12px;left:29px;line-height:21px;overflow:hidden}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{font-size:16px}.menu-submenu--title .menu-item--right{display:none;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--right-selected{display:none!important;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--text-length,.tileview--menu-item .menu-item--text-length{white-space:nowrap;overflow:hidden;width:127px;text-overflow:ellipsis}.menu-submenu--title .menu-item--text,.tileview--menu-item .menu-item--text{display:block;line-height:21px;font-size:15px;color:rgba(0,0,0,.85)}.menu-submenu--title .menu-item--text{padding:.75rem 0}.tileview--menu-item .menu-item--text{padding:.5rem 0}.menu-submenu--title:hover .menu-item--right,.tileview--menu-item:hover .menu-item--right{display:block;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title:hover .menu-item--right-selected,.tileview--menu-item:hover .menu-item--right-selected{display:block!important;line-height:24px;transform:rotate(270deg)!important;right:1.65rem;top:.95rem}.tileview--menu-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tileview--menu-item-selected::after{transform:scaleY(1)!important;opacity:1!important}.tileview--menu-top{margin-top:1px}.tileview--menu .menu-list-item--arrow{display:none;position:absolute;top:.75rem;right:1.375rem}.tileview--menu .tileview--menu-item-selected .menu-list-item--arrow{display:block}.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text{color:#000}.tileview--menu-sub{transition:all .1s linear}.tileview--menu-submenu-open .tileview--menu-sub{height:100%}.tileview--menu-image{transform:translateX(-20px)}.application-wrapper--header{padding:0 0 4px}.application-wrapper--header-title{display:flex;align-items:center;font-size:.9375rem;font-size:15px;line-height:1.3125rem;color:rgba(0,0,0,.85);margin:0;font-weight:600}.application-wrapper--header-title span{display:inline-block;vertical-align:middle}.application-list--header-title--icon{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.application-list--header-title--icon .header-title--icon-item{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.application-list--header-title--icon .header-title--icon-item-right{margin-left:4px}.application-wrapper--content{padding:0 0 16px}.application-wrapper--list-title{margin-top:8px;margin-bottom:18px}.application-wrapper--list{padding:0 0 0 14px}.application-wrapper--list:after{content:"";display:block;clear:both}.application-wrapper--list-item{position:relative;width:199px;float:left;padding:5px 10px;margin:0 2px 0 0;list-style:none}.application-wrapper--list-item .application-wrapper--list-item-text{font-size:14px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-tip{padding:0 6px;white-space:nowrap;background:#FFF;border:1px solid #D6D6D6;box-shadow:0 2px 12px 0 rgba(0,0,0,.15);font-family:PingFangSC-Regular;font-size:12px;color:#313131;line-height:20px}.application-wrapper--list-item .application-wrapper--list-item-tip-top{width:12px;height:12px;transform:rotate(45deg);position:absolute;margin-top:7px;top:-1px;background:#FFF;border:1px solid #D6D6D6;border-radius:2px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame{width:12px;height:10px;overflow:hidden;position:absolute;top:-9px;left:12px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:none;transition:all 0s linear .7s}.application-wrapper--list-item .application-wrapper--list-item-start{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-start .f-icon{display:block;margin:0 auto;font-size:15px;line-height:20px;color:#FFC43B}.talk_input,.talk_show{margin:10px auto 0}.application-wrapper--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.application-wrapper--list-item:hover{display:block;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:flex}.application-wrapper--list-item:hover::after{opacity:1}.talk_con{background:#f9f9f9}.talk_show{border:1px solid #666;overflow:auto;height:400px;width:auto}.atalk,.btalk{margin:10px}.whotalk{float:left;outline:0}.talk_word{padding:0;float:left;outline:0;text-indent:10px;width:350px;height:30px}.atalk span,.btalk span{display:inline-block;color:#fff;padding:5px 10px;border-radius:10px}.custom-class,.talk_sub{float:right}.talk_sub{margin-left:10px}.atalk span{background:#0181cc}.btalk{text-align:right}.btalk span{background:#ef8201}.modal-dialog{position:absolute;right:0;bottom:0;margin:0}:host{display:flex;flex-direction:column}.notactive{position:relative}.borderactive+li>a{padding-right:10px;padding-left:12px;font-family:PingFangSC-Regular;color:rgba(0,0,0,.65);border:1px solid #dae0e6!important;border-top:0!important;border-right:0!important;border-bottom:0!important;border-left:0!important;border-top-left-radius:0!important}.notinimg{visibility:hidden}.noimghover{visibility:visible}.btn-nav-all-dropdown2{flex:none;height:30px;position:absolute;right:20px}.btn-nav-all-dropdown2:focus{box-shadow:none}.down-arrow{display:inline-block;position:relative;width:28px;height:32px}.down-arrow::after{display:inline-block;content:" ";height:9px;width:9px;border-width:0 2px 2px 0;border-color:#999;border-style:solid;transform:matrix(.71,.71,-.71,.71,0,0);transform-origin:center;transition:transform .3s;position:absolute;top:50%;right:10px;margin-top:-10px}.down-arrow.active::after{transform-origin:center;transform:rotate(-135deg);transition:transform .3s}.list-group-items{height:32px;border:none;color:#333;padding-top:8px;padding-bottom:8px}.list-group-items:hover{background:#ddecff}.list-group-items.active{background:#c8e0ff}.list-group-items:first-child{border-radius:0}.tabset--nav-container{display:flex;width:100%;position:relative}.tabset--nav-container .active-bg{display:none}.tabset--nav-container .tabset--tab-content{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column}.tabset--nav-container .nav{border:none}.tabset--nav-container .tabset-container--dropdown{position:absolute;height:36px;line-height:36px;border-right:1px solid #f0f0f0;color:rgba(0,0,0,.45);z-index:10;cursor:pointer;right:0;top:0;display:flex;flex-direction:row;align-items:center}.tabset--nav-container .tabset-container--dropdown .f-icon{width:34px;height:34px;line-height:34px;text-align:center;font-size:18px}.tabset--nav-container .tabset-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.tabset--nav-container .tabset-container--vertical{display:none;width:247px;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:1000;overflow:auto}.tabset--nav-container .tabset-container--vertical .nav-link-close{font-size:14px;color:rgba(0,0,0,.15);vertical-align:inherit}.tabset--nav-container .tabset-container--vertical .nav-link-close::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before{content:"\e11d"}.tabset--nav-container .tabset-container--vertical .list-group-header{padding:14px 24px 6px;display:flex;align-items:center;justify-content:space-between}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title{font-size:16px;color:rgba(0,0,0,.95);margin:0}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper{font-size:14px;display:flex;align-items:center;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon{width:14px;height:14px;margin:0 6px 0 0;background:#d1d5db;border-radius:2px}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon{color:#fff;font-size:14px;display:block}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text{color:rgba(0,0,0,.85)}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon{background:#ff6060}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon{background:#f94c4c}.tabset--nav-container .tabset-container--vertical.show{display:flex;position:fixed;right:1px;top:80px;bottom:1px}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabset--nav-container .tabset-container--vertical .list-group{flex:auto;padding-left:0;width:247px}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;display:flex;align-items:center;justify-content:space-between;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(144deg,#eef4ff 0,#f6fcff 100%)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child{border-radius:0}.newdh:hover .gjdh,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps{display:none}.newdh:hover .gjdh2{display:inline}.gjdh2{display:none}.tabshow{display:inline}.tabhid,.tabset--nav-container .nav .tabset--nav-item:hover::after,.tabset--nav-container .nav .tabset--nav-item:last-child::after{display:none}.tabset--nav-container .nav{flex-wrap:nowrap;overflow:inherit;line-height:16px;text-align:center;margin-right:60px}.tabset--nav-container .nav .tabset--nav-item{flex-shrink:0;position:relative}.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before{left:3px}.tabset--nav-container .nav .tabset--nav-item::after{position:absolute;content:'';background:#CCD2E1;width:1px;right:0;z-index:100;height:14px;top:50%;margin-top:-7px;opacity:.38}.tabset--nav-container .nav .tabset--nav-link{border:none;display:flex;flex-direction:row;align-items:center}.gw-navbar-user-name::after,.menu-userinfo-wrapper .menu-userinfo--item-name::after{border-left:3px solid transparent;border-bottom:3px solid #fff;border-right:3px solid #fff}.tabset--nav-container .nav .tabset--nav-link-text{display:block;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabset--nav-container .nav .tabset--nav-link-overlay,.tabset--nav-container .nav .tabset--nav-link-overlay-active{bottom:0;width:15px;height:15.45px;position:relative;float:left;margin-left:-14px}.tabset--nav-container .nav .tabset--nav-link-overlay{background:linear-gradient(top,rgba(255,255,255,0),#f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff , endColorstr=whitesmoke , GradientType=0}.tabset--nav-container .nav .tabset--nav-link-overlay-active{background:linear-gradient(top,rgba(255,255,255,0),#fafbfc);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0)}.tabset--nav-container .nav .nav-link-close{width:15px;height:15px;color:#d8d8d8;margin-left:24px}.tabset--nav-container .nav .nav-link-close .f-icon{vertical-align:top;font-size:12px;line-height:15px}.tabset--nav-container .nav .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .nav .nav-link-close:hover .f-icon::before{font-size:15px;content:"\e11d"}.tabset--nav-container .nav .spanlib{display:inline-block;white-space:nowrap;max-width:230px;overflow:hidden}.tabset--nav-container .nav .tabset--nav-link.active{box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);z-index:11}.tabset--nav-container .nav .nav-item--home .tabset--nav-link{padding:0 19px 0 20px;height:38px;line-height:38px}.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close{display:none}.tabset--nav-container .nav .nav-item--home .nav-item--home-icon{display:inline-block;width:16px;height:16px;background:url(../../../launcher/home-icon.svg) center center no-repeat}.gw-header--menu-panel .menu-panel--close:hover::before,.tabset--nav-container .nav .nav-item--apps,.tabset--nav-container .nav .nav-item--apps .nav-link-close{display:none}.workarea{overflow:hidden;background-color:#f4f6f9}.gw-header--menu-panel-wrapper{position:fixed;width:90%;top:40px;left:0;bottom:0;z-index:980;max-width:none;transform:translateX(-120%);box-shadow:0 2px 26px 0 rgba(0,0,0,.3)}@media (min-width:1600px){.gw-header--menu-panel-wrapper{width:70%;max-width:none}}.gw-header--menu-panel-wrapper.f-state-show{transform:translateX(0)}.gw-header--menu-panel-wrapper.f-state-hidden{transform:translateX(-500%)}.gw-header--menu-panel-mask-top{top:40px!important}.gw-header--menu-panel-mask-bottom{bottom:calc(100vh - 40px)!important;background-color:transparent!important}.gw-header--menu-panel-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:#000;opacity:.4}.gw-header--menu-panel-mask.f-state-show{transform:translateX(0)}.gw-header--menu-panel-mask.f-state-hidden{transform:translateX(-120%)}.gw-header--menu-panel{min-width:600px;height:100%;margin:0;z-index:982;position:relative;background:#fff}.gw-header--menu-panel .gw-apps-management{top:0;position:absolute;background:0 0}.gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper{margin:0}.gw-header--menu-panel .menu-panel--close{position:absolute;cursor:pointer;z-index:1001;width:56px;height:56px;top:0;right:0;display:flex;align-items:center;justify-content:center}.gw-header--menu-panel .menu-panel--close::before{background:rgba(0,0,0,.06);border-radius:.5px;position:absolute;left:0;width:1px;height:14px;content:'';top:50%;margin-top:-7px}.gw-header--menu-panel .menu-panel--close .menu-panel--close-area{width:22px;height:22px;text-align:center;background:rgba(0,0,0,.1);border-radius:11px;color:rgba(0,0,0,.5)}.gw-header--menu-panel .menu-panel--close .f-icon{font-size:14px;line-height:22px}.gw-header--menu-panel .menu-panel--close:hover{background:#F6F6F6}.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area{color:#fff;background:#FF6060}.menu-userinfo-wrapper{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper::after{display:none}.menu-userinfo-wrapper.active,.menu-userinfo-wrapper.hover{background-color:#075EBB}.menu-userinfo-wrapper .menu-userinfo--item{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper .menu-userinfo--item::after{display:none}.menu-userinfo-wrapper .menu-userinfo--item-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.menu-userinfo-wrapper .menu-userinfo--item-name{font-size:14px;color:#fff;position:relative;opacity:.8}.menu-userinfo-wrapper .menu-userinfo--item-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.menu-userinfo--detail{right:0;min-width:220px;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding-top:2px}.menu-userinfo--detail-content{background-color:#fff}.detail-content--item,.detail-content--user{white-space:nowrap;overflow:hidden;text-align:left}.detail-content--user{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.detail-content--user .detail-content--user-avatar-container{margin-right:10px}.detail-content--user .detail-content--user-avatar{display:block;width:38px;height:38px;border-radius:100%}.detail-content--user .detail-content--user-info{line-height:20px}.detail-content--user .detail-content--user-info-sub{font-size:13px;margin-top:2px}.detail-content--item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);padding:0 10px;cursor:pointer}.detail-content--item:hover{color:#247AEC}.detail-content--item .detail-content--icon{width:20px;margin-right:10px;margin-left:9px;font-size:20px}.detail-content--item-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.curtenant,.setdefault,.setdefault:hover{font-size:12px;width:64px;line-height:20px;align-items:center;height:20px;font-family:PingFangSC-Regular;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-self:start;text-align:center}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input{border:0}.setdefault{border-radius:10px;color:#666;flex-shrink:0;justify-content:flex-end;flex-direction:row}.curtenant,.setdefault:hover{border-radius:10px;color:#fff;flex-shrink:0;justify-content:flex-end;flex-direction:row}.tenant-title{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.85);letter-spacing:-.38px;display:flex;align-items:center;width:94px;flex-shrink:0;margin-left:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-start;flex-direction:row;align-self:start;margin-right:20px}.name-space{height:38px}.gw-navbar-user-dropdown{position:relative;padding:0 16px 0 14px;cursor:pointer}.gw-navbar-user-dropdown.active.gw-navbar-user-name{opacity:1}.gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail{display:block!important}.gw-navbar-user-info{display:flex;flex-direction:row;align-items:center;line-height:38px}.gw-navbar-user-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.gw-navbar-user-name{font-size:14px;color:#fff;position:relative;opacity:.8}.gw-navbar-user-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.gw-navbar-user-info-detail{position:absolute;right:0;top:calc(100% + 1px);z-index:1000;min-width:220px}.gw-navbar-user-info-content{background-color:#fff;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border:1px solid rgba(56,138,255,.2);border-radius:2px}.gw-navbar-user-info-content--menu{background-color:#fff;border-radius:2px}.gw-navbar-user-info-content-list-item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);white-space:nowrap;overflow:hidden;text-align:left;cursor:pointer}.gw-navbar-user-info-content-list-item .user-item-icon{width:20px;margin-right:10px;margin-left:9px;font-size:18px}.gw-navbar-user-info-content-list-item .user-item-icon::before{vertical-align:bottom}.gw-navbar-user-info-content-list-msg{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.gw-navbar-user-info-content-list-msg .user-item-img{width:38px;height:38px;margin-right:10px}.gw-navbar-user-info-content-list-msg .user-item-img img{display:block;width:38px;height:38px;border-radius:100%}.gw-navbar-user-info-content-list-msg .user-item-data{font-size:14px;font-weight:400;color:rgba(0,0,0,.8)}.gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section{font-size:13px;margin-top:2px}.gw-navbar-user-info-content-list-item.item-setting-list{color:rgba(0,0,0,.85);padding:0 14px}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{width:14px;height:14px}.dialog-user-edit{display:flex;flex-direction:row;align-items:center;padding:16px 26px;padding-left:18px!important}.dialog-user-edit .dialog-user-edit-icon{margin-right:12px;font-size:22px;color:#f49730}.dialog-user-edit .dialog-user-edit-text{font-size:16px;color:#000}.gw-user-edit-dialog{display:none}.gw-user-edit-dialog.show{display:block}.gw-user-edit-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;outline:0}.gw-user-edit-modal .modal-dialog{transform:translate(0,0);width:420px;height:180px;margin-left:-210px!important;margin-top:-90px!important}.edit-modal-dialog{position:absolute;width:420px;height:180px;left:50%;top:50%;margin-left:-210px;margin-top:-90px}.edit-modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;border:0 solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 4px 12px 0 rgba(0,0,0,.2);outline:0}.edit-modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;border-top-left-radius:2px;border-top-right-radius:2px;flex-shrink:0;background:#fff;color:#000;padding:12px 8px 12px 18px}.edit-modal-title{margin-bottom:0;line-height:22px;font-size:16px}.edit-modal-actions{flex:1;margin:-4px 0;display:flex;justify-content:flex-end}.edit-modal-actions-close{padding:2px;color:#bfbfbf;cursor:pointer}.edit-modal-actions-close:hover{color:rgba(0,0,0,.85)}.edit-modal-body{height:auto;overflow:hidden}.edit-modal-footer{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0;padding:16px 20px 20px}.edit-modal-footer .btn{margin-right:8px;padding:4px 15px;line-height:20px!important;font-size:14px}.edit-modal-footer .btn:last-child{margin-right:0}.gw-user-edit-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:rgba(0,0,0,.15)}.tab-list-menu-back{background:#FDFEFF;box-shadow:0 0 10px 0 rgba(57,66,100,.1);border-radius:4px}.tab-list-menu-back-item-name{font-family:PingFangSC-Regular;font-size:14px;letter-spacing:-.38px;text-align:right;z-index:980}.tab-list-menu-back-item-out{height:37.5px;border-radius:4px;margin:0 3px}.tab-list-menu-back-item-out-content{display:flex;flex-direction:row;align-items:center;line-height:37.5px}.tab-list-menu-whole{position:absolute;z-index:1000;width:auto;top:30px!important;display:none}.tab-list-menu-whole-menu{position:absolute;z-index:1000;width:auto;top:100%!important}.tab-list-menu-whole-menu-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:transparent;opacity:.4}.tab-list-menu-whole-menu-mask-state-show{transform:translateX(0)}.tab-list-menu-whole-menu-mask-state-hidden{transform:translateX(-500%)}.gw-view-tiled--container{display:flex;flex-direction:column;flex-shrink:1;flex-grow:1;flex-basis:0}.gw-view-tiled--container .gw-view-tiled--nav{display:flex;flex-direction:row;align-items:center;padding:10px 24px 8px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select{position:relative;width:218px;margin-right:18px;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:2px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select{position:relative;display:flex;flex-direction:row;align-items:center;height:28px;padding:0 36px 0 10px;line-height:28px;cursor:pointer}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text{font-size:15px;color:rgba(0,0,0,.85);margin-right:8px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow{position:absolute;right:0;top:1px;width:30px;height:26px;cursor:pointer;font-size:12px;color:rgba(0,0,0,.85)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{display:none;position:absolute;left:0;top:30px;width:218px;z-index:999;background:#fff;box-shadow:0 4px 6px 0 rgba(139,139,139,.1);max-height:calc(100vh - 200px);overflow:auto}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item{height:36px;padding-left:10px;line-height:36px;font-size:14px;color:#333;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true{display:block}.gw-view-tiled--container .gw-view-tiled--content{flex-shrink:1;flex-grow:1;flex-basis:0;padding:16px 24px;overflow-y:auto}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item{display:inline-block;position:relative;width:240px;height:80px;padding:17px 58px 17px 14px;margin-right:14px;margin-bottom:18px;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner{display:flex;flex-direction:row;align-items:center}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon{flex-shrink:0;width:46px;height:46px;margin-right:10px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img{display:block;width:36px;height:36px;margin:5px auto}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title{font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after{position:absolute;content:'\e302';right:10px;top:10px;width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;font-size:14px;color:#FFC43B;font-family:FarrisExtend;text-transform:none;display:none}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after{display:inline-block;content:'\e303'}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.menu-search-wrapper{height:40px;transition:all .2s linear;transform:translateY(-40px);margin:0 24px 0 0}.menu-search-wrapper.f-state-focus{transform:translateY(0)}.menu-search-wrapper .menu-search--placerholder{position:relative;height:40px;line-height:40px;padding-right:22px;text-align:right}.menu-search-wrapper .menu-search--placerholder .f-icon-search{margin-right:10px;color:#fff}.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text{display:inline-block;line-height:18px;font-size:13px;color:rgba(255,255,255,.49)}.menu-search-wrapper .menu-search--placerholder::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.5)}.menu-search-wrapper .menu-search--search{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px}.menu-search-wrapper .menu-search--search .menu-search--search-select{position:relative;padding:0 8px 0 16px;height:40px;line-height:40px;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text{font-size:14px;color:rgba(255,255,255,.85)}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow{margin-left:5px;font-size:14px;color:#fff}.menu-search-wrapper .menu-search--search .menu-search--search-select::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-search-wrapper .menu-search--search .menu-search--search-form{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px;padding:0 6px}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input{display:block;height:40px;line-height:40px;border:0;box-shadow:none;font-size:14px;color:#fff;background:0 0}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append{padding-right:13px;height:40px;line-height:40px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear{position:relative;padding-left:13px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after{content:'';position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-colllection-wrapper .dropdown-toggle::after{display:none}.menu-colllection-wrapper .menu-colllection--detail{width:280px}.menu-colllection-wrapper .menu-colllection--detail-title{padding:6px 16px 8px;font-size:13px;color:rgba(0,0,0,.6)}.menu-colllection-wrapper .menu-colllection--detail-item{display:flex;flex-direction:row;align-items:center;padding:11px 15px;cursor:pointer}.menu-colllection-wrapper .menu-colllection--detail-item .item-img{width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-img img{display:block;width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-content{flex:1;padding-left:14px;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title{margin-bottom:3px;line-height:18px;font-size:13px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle{line-height:16px;font-size:12px;color:rgba(0,0,0,.3);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-single-app-wrapper{position:relative;width:198px;height:116px;padding:12px 18px;margin-right:14px;margin-bottom:14px;background:#FFF;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-single-app-wrapper:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.gw-single-app--title{padding-right:20px;margin-bottom:4px;font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--subtitle{font-size:12px;color:rgba(0,0,0,.45);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--icon-container{position:absolute;right:14px;bottom:12px}.gw-single-app--icon-container img{width:36px;height:36px}.gw-app-group--header{display:flex;flex-direction:row;align-items:center;padding-bottom:14px;margin-right:10px}.gw-app-group--header .header--icon-container{width:20px;height:20px;margin:0 10px 0 0;line-height:20px}.gw-app-group--header .header--icon-container .header--icon{font-size:20px;color:rgba(0,0,0,.45)}.gw-app-group--header .header--title{font-size:14px;color:rgba(0,0,0,.75);margin-right:6px}.gw-app-group--header .header--subtitle{font-size:12px;color:rgba(0,0,0,.3)}.gw-app-group-wrapper{padding:10px 0 0}.gw-app-group--list{display:flex;flex-direction:row;flex-wrap:wrap;padding-bottom:0}.gw-apps-management{flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden;display:flex;flex-direction:column;position:fixed;top:40px;bottom:0;left:0;right:0;z-index:1000;background-color:rgba(0,0,0,.15)}.gw-apps-management .gw-apps-management--close{position:absolute;right:24px;top:17px;width:22px;height:22px;cursor:pointer}.gw-apps-management .gw-apps-management--close .f-icon{font-size:22px;color:rgba(0,0,0,.06)}.gw-apps-management .gw-apps-management--close:hover .f-icon{color:rgba(0,0,0,.25)}.gw-apps-management--header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;padding:10px 56px 10px 21px}.gw-apps-management--header .header--caption{display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--caption .header--caption-logo{padding-right:11px}.gw-apps-management--header .header--caption .header--caption-logo img{display:block;width:30px;height:30px}.gw-apps-management--header .header--caption .header--caption-title{font-size:18px;color:#000}.gw-apps-management--header .header--search{position:relative;max-width:508px;height:36px;padding:0 14px 0 34px;margin:0 auto;border-radius:18px}.gw-apps-management--header .header--search .search--input{display:block;height:34px;border:0;box-shadow:none;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--append{position:absolute;left:14px;top:0}.gw-apps-management--header .header--search .search--append .f-icon{display:block;height:34px;line-height:34px;font-size:18px}.gw-apps-management--header .header--search .search--placeholder{display:flex;flex-direction:row;align-items:center;justify-content:center;position:absolute;left:-1px;top:-1px;width:calc(100% + 2px);height:36px;line-height:36px;border-radius:18px}.gw-apps-management--header .header--search .search--placeholder .f-icon{display:block;margin-right:14px;color:#979797}.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text{font-size:14px;color:rgba(0,0,0,.25)}.gw-apps-management--header .header--search .search--result-panel{position:absolute;top:40px;left:0;right:0;padding:10px 18px 0;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;z-index:100;max-height:310px;overflow-y:auto}.gw-apps-management--header .header--search .search--result-panel .search--result-title{font-size:13px;color:rgba(0,0,0,.6)}.gw-apps-management--header .header--search .search--result-panel .search--result-list{margin:8px -18px}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name{display:flex;flex-direction:row;align-items:center;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path{flex-grow:1;flex-shrink:1;flex-basis:0;padding-left:16px;font-size:12px;color:rgba(0,0,0,.45);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-apps-management--header .header--search .search--result-panel .search--result-more{height:40px;line-height:40px;text-align:center;border-top:1px solid #ECECEC;font-size:12px;color:rgba(0,0,0,.75);cursor:pointer;margin:0 -18px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;margin-top:14px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item{height:20px;padding:0 10px;margin:0 10px 14px 0;background:rgba(219,224,230,.5);border-radius:13px;font-size:13px;line-height:20px;color:#8A96A5;list-style:none;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{color:#fff;box-shadow:0 2px 4px 0 rgba(25,76,164,.09)}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match{color:#fff}.gw-apps-management--header .header--search .search--prompt-panel{padding-bottom:14px}.gw-apps-management--header .header--view{flex-shrink:0;display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--view .view--btn{text-align:center;white-space:nowrap;vertical-align:middle;padding:0 10px;line-height:28px;background:rgba(240,240,240,.6);margin-left:-1px;cursor:pointer}.gw-apps-management--header .header--view .view--btn .view--btn-icon{font-size:13px;color:rgba(0,0,0,.2)}.gw-apps-management--header .header--view .view--btn.active{border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06)}.gw-apps-management--header .header--view .view--btn.active .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:hover:not(.active){border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06);position:relative}.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.gw-apps-management--header .header--view .view--btn:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.gw-apps-management--header .header--settings{position:relative}.gw-apps-management--header .header--settings .header--settings-icon{display:inline-block;height:28px;width:48px;text-align:center;line-height:28px;color:#979797;cursor:pointer}.gw-apps-management--header .header--settings .header--settings-panel{position:absolute;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding:16px 14px;top:34px;width:162px;right:0;opacity:0;transition:opacity .1s linear}.gw-apps-management--header .header--settings .header--settings-panel.f-state-show{opacity:1}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow{width:16px;height:8px;margin:0 2px;position:absolute;top:-8px;right:13px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before{content:'';position:absolute;border-width:0 .5rem .5rem;border-color:transparent;border-style:solid;border-bottom-color:rgba(56,138,255,.2);top:0}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after{content:'';position:absolute;border-color:transparent transparent #fff;border-style:solid;border-width:0 .5rem .5rem;top:1px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content{font-size:13px;color:rgba(0,0,0,.8)}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item{display:flex;align-items:center;justify-content:space-between}.gw-apps-management--content{overflow-y:auto;flex-shrink:1;flex-grow:1;flex-basis:0;padding:20px 0 20px 24px}.gw-apps-management--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.search--result-item-keyboard--control{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.launchpad-full-view{margin-right:16px}.launchpad-full-icon{transform:rotate(180deg)}.launchpad-full{margin-bottom:2px;cursor:pointer}.gw-switch{position:relative;display:inline-block;box-sizing:content-box;padding:0;margin:0;cursor:pointer;transition:.3s ease-out all;-webkit-transition:.3s ease-out all;white-space:nowrap;min-width:32px;height:18px;border-radius:20px;background-color:#d9d9d9}.gw-switch.f-state-checked{background:#49C265}.gw-switch.f-state-checked small{right:2px;left:auto}.gw-switch small{left:2px;border-radius:100%;position:absolute;top:1px;transition:.2s ease-out all;-webkit-transition:.3s ease-out all;background:#fff;width:16px;height:16px;font-size:80%}.f-component-walk-page.active{display:block}.f-component-walk-page .f-page-walker-detail-wrapper{position:absolute;z-index:333333}.f-component-walk-page .f-page-walker-detail-wrapper-img{background:0 0}.f-component-walk-page .f-page-walker-detail-wrapper-content{position:absolute}.f-component-walk-page .f-page-walker-detail-wrapper-content-right{left:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-left{right:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom,.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom{top:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content-top{bottom:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow{position:absolute;display:block;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.f-component-walk-page .f-page-walker-detail-wrapper-content-default{box-shadow:0 3px 10px 0 rgba(0,0,0,.15);border-radius:2px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top{margin-bottom:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow{bottom:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after{border-width:10px 8px 0;bottom:2px;border-top-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right{margin-left:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow{left:-12px;top:28px;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after{border-width:8px 10px 8px 0;left:2px;border-right-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow{top:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left{margin-right:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow{top:28px;right:-12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after{border-width:8px 0 8px 10px;right:2px;border-left-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow{top:-12px;right:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default{box-shadow:0 2px 10px 0 rgba(38,40,56,.23)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner{position:relative;display:flex;flex-direction:column;min-width:419px;min-height:165px;padding:24px 12px;background-color:#fff;border-radius:3px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content{position:relative;min-height:60px;padding-left:74px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:3px;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img{display:block;width:60px;height:60px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title{display:flex;flex-direction:row;align-items:center}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number{flex-shrink:0;padding-right:6px;font-size:12px;color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current{font-size:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text{font-size:16px;color:rgba(0,0,0,.85);font-weight:600;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle{flex-shrink:1;flex-grow:1;flex-basis:0;margin-top:6px;font-size:13px;min-height:44px;color:rgba(0,0,0,.65);line-height:22px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns{display:flex;flex-direction:row;align-items:center;padding-top:17px;padding-right:10px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn{flex-grow:1;flex-shrink:0;flex-basis:0;display:flex;flex-direction:row;align-items:center;justify-content:flex-end}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn{margin-right:6px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child{margin-right:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close{position:absolute;right:10px;top:10px;width:30px;height:30px;line-height:30px;text-align:center;cursor:pointer}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon{font-size:18px;color:rgba(0,0,0,.45)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon{color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip{display:flex;flex-direction:row;align-items:center;padding-left:74px;background-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn{color:rgba(0,0,0,.35)}.user-setting{position:absolute;top:0;right:0;bottom:0;left:0}.user-setting-list{width:286px;min-width:286px;background-color:#fff;overflow-y:auto;overflow-x:hidden}.user-setting-list .user-setting-message{padding-bottom:32px;padding-top:32px}.user-setting-list .user-setting-message .user-avatar{width:86px;height:86px;margin:0 auto 18px;position:relative}.user-setting-list .user-setting-message .user-avatar .user-avatar-img{display:block;width:86px;height:86px;border-radius:100%}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon{position:absolute;width:86px;height:86px;border-radius:100%;background:rgba(0,0,0,.3);top:0;left:0;line-height:86px;text-align:center;display:none}.user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon{display:block}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon{font-size:24px;color:#fff}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{position:absolute;width:22px;height:22px;line-height:22px;border:1px solid #fff;right:0;bottom:0;border-radius:100%;color:#fff;text-align:center}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon{font-size:12px;vertical-align:initial}.user-setting-list .user-setting-message .user-title{text-align:center}.user-setting-list .user-setting-message .user-title .user-name{font-size:16px;color:rgba(0,0,0,.75);margin-bottom:6px}.user-setting-list .user-setting-message .user-title .user-post{font-size:12px;color:rgba(0,0,0,.45)}.user-setting-list .user-setting-menu{padding:24px 0;border-top:1px solid #f0f0f0}.user-setting-list .user-setting-menu .menu-item-inner{width:286px;height:48px;line-height:48px;padding-left:38px;padding-right:20px;cursor:pointer}.user-setting-list .user-setting-menu .menu-item-inner.active{padding-left:35px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-title{display:flex;flex-direction:row;align-items:center}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon{margin-right:18px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-text{font-size:14px;color:rgba(0,0,0,.75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-setting-content{flex-grow:1;padding:0 10px 10px;overflow-x:auto;overflow-y:hidden}.user-setting-content-inner{height:100%;background:#fff;padding:24px;overflow-y:auto}.user-setting-content-wrapper-title{color:#000;display:inline-flex;align-items:center;line-height:1.375rem;position:relative;overflow:hidden;padding:0 0 0 1rem;min-width:760px}.user-setting-content-wrapper-title::before{content:'';width:.25rem;height:1.125rem;border-radius:1px;position:absolute;top:50%;left:0;margin-top:-.5625rem}.user-setting-content-wrapper-title .title-text{font-size:1rem;line-height:1.375rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-bottom:0;margin-right:10px}.user-setting-content-wrapper-title .title-line{flex-grow:1;border-bottom:1px dashed rgba(0,0,0,.1)}.user-setting-content-wrapper-title .title-edit-btn{font-size:14px;padding-left:10px;cursor:pointer}.user-setting-content-wrapper-title .title-edit-btn .f-icon{font-size:14px;margin-right:4px;vertical-align:inherit}.user-setting-content-wrapper-main{padding:27px 0 32px}.user-setting-content-wrapper-main .user-setting-form{padding-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap{max-width:25rem;display:flex;flex-grow:0;flex-shrink:0;flex-basis:auto;flex-flow:row wrap;align-items:center;margin-bottom:.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns{margin-bottom:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label{display:flex;align-items:center;width:6rem;flex-shrink:0;margin-right:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-end;flex-direction:row;align-self:start;height:1.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap{flex-grow:1;flex-shrink:1;flex-basis:auto}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip{font-size:14px;color:rgba(0,0,0,.45);margin-top:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control{height:28px!important}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control,.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group{border:1px solid transparent;border-bottom-color:#ececec}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn{margin-left:10px;padding-top:4px;padding-bottom:4px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child{margin-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link{color:rgba(0,0,0,.75)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list{margin-right:40px;position:relative;cursor:pointer}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child{margin-right:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{width:50px;height:50px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img{background-color:rgba(217,38,44,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img{background-color:rgba(0,192,222,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name{font-size:14px;color:rgba(0,0,0,.65);margin-top:14px;text-align:center}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{content:'';position:absolute;width:58px;height:58px;background:0 0;left:-4px;top:-4px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{position:absolute;right:-1px;top:35px;border-radius:100%;background-color:#fff;display:none}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon{display:block;width:16px;height:16px;vertical-align:inherit;border-radius:100%;border:1px solid #fff;font-size:14px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check{display:block}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img{width:64px;height:52px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{width:72px;height:60px;border-radius:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{right:-10px;top:45px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color{margin-bottom:44px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label{height:50px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label{height:60px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto{min-width:43.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list{flex:1;padding-right:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child{padding-right:0}.dialog-user-avatar-tips{padding:0 24px 14px;margin-top:12px;font-size:12px;color:rgba(0,0,0,.45)}.dialog-user-avatar{padding:24px 32px 0 24px;display:flex;flex-direction:row}.dialog-user-avatar-change{padding-right:36px;border-right:1px solid #EFEFEF}.dialog-user-avatar-view{padding-left:36px}.dialog-user-avatar-view .avatar-view-title{font-size:14px;color:rgba(0,0,0,.75);text-align:center;margin-bottom:15px}.dialog-user-avatar-view .avatar-view-size{margin-bottom:32px}.dialog-user-avatar-view .avatar-view-size:last-child{margin-bottom:0}.dialog-user-avatar-view .avatar-view-size .img{display:block;width:100px;height:100px;border-radius:100%;overflow:hidden;margin:0 auto;border:1px solid #EFEFEF}.dialog-user-avatar-view .avatar-view-size .avatar-view-size-text{font-size:12px;color:rgba(0,0,0,.45);display:block;text-align:center;margin-top:10px}.mode-active,.searce .select-show-mode .show-mode-active,.subcount-info:hover{color:#0AABAB!important}.dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img{width:50px;height:50px}.isdisplay{display:none}.themesdefault{background-color:#00ACB8}.themesdefault:hover{background-color:#86E5E1}.gw-header{background:linear-gradient(207deg,#13C2C2 0,#09B7B7 100%)}.gw-header .gw-header--exitfullscreen-wrapper{border-top:1px solid #0AABAB}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{background:url(../../../img/orishow-green.svg) no-repeat}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover{background-image:url(../../../img/passshow-green.svg) no-repeat}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{background:linear-gradient(269deg,#0099A6 0,#00A8B6 50%,#0099A6 100%)}.gw-header-toolbar--content:hover{background-color:#00B4C0}.gw-apps-management--tabs-container .tabs-container--item.active{background-image:linear-gradient(225deg,#13C2C2 0,#0AABAB 100%)}.tabs-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#08B6B6 26%,#0AABAB 67%,rgba(9,113,255,.13) 95%)!important}.tabs-container--vertical .list-group .list-group-item.active,.tabs-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(243deg,#EFF8F8 0,#EFF8F8 26%,#EFF8F8 67%,#EFF8F8 95%)!important}.keyApplication .group .module--list .module--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#0CBABA 50%,#A3EDEB 100%)}.keyApplication .group .module--list .module--list-item:hover{color:#00ACB8}.listview--nav-horizontal .active .keyApplicationName{background-color:#00ACB8}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{color:#09ABAB}.menu-submenu--title-selected{color:#00ACB8!important}.menu-submenu--title:hover,.menu-submenu--title:hover .menu-item--text,.tileview--menu-item:hover,.tileview--menu-item:hover .menu-item--text{color:#00ACB8}.tileview--menu-item-selected{color:#00B4C0;background:#E9F2F2}.tileview--menu .menu-list-item--arrow,.tileview--menu-item-selected .menu-item--text{color:#00B4C0}.application-list--header-title--icon .header-title--icon-item{background:rgba(9,183,183,.9)}.application-list--header-title--icon .header-title--icon-item-right{background:rgba(13,187,187,.5)}.application-wrapper--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#0CBABA 50%,#A3EDEB 100%)}.application-wrapper--list-item:hover .application-wrapper--list-item-text{color:#00ACB8}.tileview--menu-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#08B6B6 26%,#0AABAB 67%,rgba(9,113,255,.13) 95%)}.keyApplication-header-wrapper .module-head .module-header--icon{color:#09ABAB}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{background:rgba(9,183,183,.9)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{background:rgba(13,187,187,.5)}.tileview--menu-image{-webkit-filter:drop-shadow(#00ACB8 20px 0);filter:drop-shadow(#00ACB8 20px 0)}.notactive{color:#596580!important}.down-arrow.active::after{border-color:#00ACB8}.detail-content--item-content,.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{border-top:1px solid #F5F8F9}.tabset--nav-container{background:#EBEEF4}.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon{background-image:url(../../../launcher/home-icon-selected-green.svg)}.tabset--nav-container .nav .tabset--nav-link{color:#596580;font-size:13px;padding:0 10px 0 16px;height:36px;line-height:36px}.tabset--nav-container .nav .tabset--nav-link:hover{background:#E1E5EE}.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close{color:#666}.tabset--nav-container .nav .tabset--nav-link.active{color:#3E4A65;background:#F8F9FB}.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close{color:#666}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#08B6B6 26%,#0AABAB 67%,rgba(9,113,255,.13) 95%)}.detail-content--item:hover{background-color:#F5F8F9}.curtenant,.setdefault:hover{background:#00B4C0}.curtenant{color:#fff}.curtenant-font-color{color:#00ACB8!important}.gw-navbar-user-dropdown.active,.gw-navbar-user-dropdown:hover{background-color:#00B4C0}.gw-navbar-user-info-content-list-item.item-setting-list:hover{color:#00ACB8;background-color:#F5F8F9}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{background-image:url(../../../img/tenant_change-green.svg)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{border:1px solid #F5F8F9}.gw-single-app-wrapper:hover,.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{-o-border-image:linear-gradient(135deg,#6AD4DA,#A3EDEB) 30 30;border-image:linear-gradient(135deg,#6AD4DA,#A3EDEB) 30 30}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover{background-color:#EFF8F8}.menu-search-wrapper .menu-search--search{background:#00B4C0}.menu-colllection-wrapper .menu-colllection--detail-item:hover{background:#F5F8F9}.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title{color:#00ACB8}.menu-colllection-wrapper.show .menu-colllection--item{background-color:#00B4C0}.gw-app-group.f-state-active .gw-app-group--header .header--icon{color:#09ABAB}.gw-apps-management--header .header--search{background:#F5F8F9;border:1px solid #F5F8F9}.gw-apps-management--header .header--search .search--input{background:#F5F8F9}.gw-apps-management--header .header--search .search--append .f-icon{color:#0CBABA}.gw-apps-management--header .header--search.f-state-focuse,.gw-apps-management--header .header--search:hover{border:1px solid #86E5E1}.gw-apps-management--header .header--search .search--placeholder{background:#F5F8F9;border:1px solid #F5F8F9}.gw-apps-management--header .header--search .search--result-panel .match{color:#00B4C0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check,.user-setting-content-wrapper-title .title-edit-btn,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text{color:#0CBABA}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover{background:#F5F8F9}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{background-image:linear-gradient(215deg,#1C7CEA 0,#00ACB8 100%)}.gw-apps-management--header .header--view .view--btn.active,.gw-apps-management--header .header--view .view--btn:hover:not(.active){background-image:linear-gradient(225deg,#13C2C2 0,#0AABAB 100%)}.search--result-item-keyboard--control{background:#F5F8F9}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{background-color:#86E5E1}.user-setting-list .user-setting-menu .menu-item-inner.active{border-left:3px solid #0CBABA}.user-setting-content-wrapper-title::before{background:#86E5E1}.user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before{background-color:#50BA77}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{background-color:#0CBABA}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{border:1px solid rgba(13,187,187,.5)}.user-setting-list .user-setting-menu .menu-item-inner.active,.user-setting-list .user-setting-menu .menu-item-inner:hover{background-color:#F5F8F9}.tabset--nav-container .nav{height:36px}.tabset--nav-container .nav .nav-link-close{margin:0 0 0 14px} \ No newline at end of file +@charset "UTF-8"; + +.g-main, +.gw-page-wrapper { + top: 0; + right: 0; + position: absolute; + left: 0; + bottom: 0 +} + +.g-main { + margin: 0 auto; + font-size: .875rem +} + +.font-size-13 { + font-size: .8125rem !important +} + +.font-size-14 { + font-size: .875rem !important +} + +.font-size-normal { + font-size: 1rem !important +} + +.font-size-middle { + font-size: 1.5rem !important +} + +.font-size-lg { + font-size: 3rem !important +} + +.flex-auto { + flex-grow: 1; + flex-shrink: 1; + flex-basis: auto +} + +.g-pointer { + cursor: pointer +} + +.gw-page-wrapper { + overflow: hidden; + display: flex; + flex-direction: column +} + +.login-section, +.subcount-info, +.themesdefault, +.themesgreen, +.themesred, +.wrapper-content { + position: relative +} + +.gw-page-header>.row { + overflow: hidden +} + +.wrapper-content { + margin: 0 +} + +.themestitle { + display: inline-block; + margin-left: 35px; + text-align: center; + font-family: PingFangSC-Light; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.themesheader { + margin-left: 25px; + margin-bottom: 25px; + font-family: PingFangSC-Regular; + font-size: 16px; + color: rgba(0, 0, 0, .85) +} + +.module-title2, +.themesd { + margin-bottom: 10px +} + +.themesd { + display: inline-block; + vertical-align: middle; + margin-top: -20px +} + +.themesdefault, +.themesdefault:hover, +.themesgreen, +.themesgreen:hover, +.themesred, +.themesred:hover { + height: 50px; + border-radius: 5px; + cursor: pointer; + margin-top: 5px; + width: 50px +} + +.themesred { + background-color: #D9262C +} + +.themesred:hover { + background-color: #DF464B +} + +.themesgreen { + background-color: #00C0DE +} + +.themesgreen:hover { + background-color: #30CFE8 +} + +.themebanIn, +.themebanOut { + height: 50px; + border-radius: 5px; + opacity: .25; + margin-top: -40px; + cursor: pointer +} + +.themesinimg { + padding-left: 17px; + padding-top: 19px; + display: flex +} + +.themesoutimg { + padding-left: 17px; + padding-top: 19px; + display: none +} + +.themessize { + display: flex; + padding-left: 7px; + padding-top: 10px +} + +.themebanIn { + background: #000; + width: 50px +} + +.themebanOut { + background: #000; + width: 50px; + display: none +} + +.themesizeIn { + margin-top: -52px; + position: absolute +} + +.applicationhome { + border-right: 1px solid rgba(255, 255, 255, .3) !important; + padding-right: 13px !important +} + +.collection-10, +.collection-100, +.collection-max { + border-radius: 9px; + background: red; + font-size: 12px !important; + text-align: center; + color: rgba(255, 255, 255, .9); + line-height: 18px !important; + padding: 0 6px !important; + font-family: arial, sans-serif +} + +.gw-header--caption { + margin: 0 0 0 20px +} + +.gw-header--caption-img { + display: block; + max-height: 38px +} + +.collection-10, +.collection-100, +.collection-max, +.subcount-info { + display: inline-block +} + +.collection-10 { + margin: 2px -5px +} + +.collection-100 { + margin: 2px -11px +} + +.collection-max { + margin: 2px -13px +} + +.subcount-info { + color: rgba(0, 0, 0, .25) !important; + padding: 0 7px; + cursor: pointer; + line-height: 28px !important +} + +.subcount-info .label { + line-height: 14px; + padding: 0 4px; + position: absolute; + right: 2px; + top: 1px; + font-size: .625rem +} + +.subcount-info .material-icons { + display: block +} + +#search:-moz-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +#search::-moz-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +#search::-webkit-input-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +app-login-container { + background: #fff; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow: auto +} + +.login-logo { + width: 26.69rem; + height: 18rem; + overflow: hidden; + margin-right: 4.5rem; + background: url(../../../img/login-logo@2x.png) no-repeat; + background-size: 427px 288px +} + +.login-logo h1 { + font-family: PingFangSC, 'Segoe UI', 'microsoft yahei', sans-serif; + font-size: 1.625rem; + line-height: 2.5rem; + padding: 9.5rem 0 0 5rem; + color: #666560; + margin: 0 +} + +.login-logo .logo-en { + font-size: 1.375rem +} + +.login-section { + width: 24.31rem; + padding-left: 2.56rem; + float: left +} + +.login-section h2 { + font-size: 1.75rem; + color: #333; + margin: .25rem 0 1.31rem +} + +.login-form .custom-select, +.login-form .form-control { + margin: 0 0 1.13rem; + line-height: 26px; + border-radius: .25rem; + padding-top: .3125rem; + padding-bottom: .3125rem; + height: 32px +} + +.btn-login { + background: #24abe9; + color: #fff; + height: 3.25rem; + font-size: 1rem +} + +.btn-regist { + padding: 1.25rem 0 0; + font-size: .875rem +} + +.btn-regist a { + border-bottom: 1px solid #24abe9; + color: #24abe9; + padding: 0 0 .125rem +} + +.btn-regist a:hover { + text-decoration: none +} + +.remember-info { + padding: 0 0 0 1.25rem +} + +.login-lg { + display: inline-block; + width: 1.88rem; + height: 1.31rem; + background: url(../../../img/language@2x.png) no-repeat; + background-size: 30px auto +} + +.lg-en { + background-position: 0 0 +} + +.lg-zh-cn { + background-position: 0 -24px +} + +.login-lg-text { + color: #373d41 +} + +.auth-form-container { + padding: 6.56rem 0 0 +} + +.login-lg-area { + position: absolute; + top: -5rem; + right: -65% +} + +.login-lg-dropdown .btn:active, +.login-lg-dropdown .btn:focus { + outline: 0 +} + +.login-lg-dropdown .dropdown-menu { + right: 0; + left: auto +} + +.login-log-container { + flex-direction: row-reverse !important +} + +@media (max-width:1200px) { + .login-lg-area { + right: 0 + } +} + +@media (max-width:992px) { + .login-logo { + margin: 0 auto + } + + .login-section { + width: 90%; + padding: 0 0 0 10%; + margin: 0 auto + } +} + +@media (max-width:768px) { + .login-log-container { + flex-direction: row !important + } +} + +@media (max-width:576px) { + .login-lg-area { + right: 0; + top: .5rem + } + + .auth-form-container { + padding: 1rem 0 0 + } + + .login-section { + padding: 0; + float: none; + border-left: none + } +} + +.gw-header-toolbar .material-icons { + font-size: 22px +} + +.gw-header-toolbar .count-info { + color: rgba(255, 255, 255, .65) !important; + position: relative; + display: block; + padding: 9px 11px; + cursor: pointer +} + +.gw-header-toolbar .count-info:hover { + color: #fff !important +} + +.gw-header-toolbar .count-info .label { + line-height: 14px; + padding: 0 4px; + position: absolute; + right: 2px; + top: 1px; + font-size: .625rem +} + +.gw-header-toolbar .count-info .material-icons { + display: block +} + +.gw-userinfo-menu .leftMenu { + left: -100px !important +} + +.gw-userinfo .user-profile { + outline: #000; + text-align: left; + color: #000; + border: 1px solid #000; + margin: 20px; + width: 700px; + padding: 10px +} + +.gw-userinfo span.title { + display: block; + width: 80px; + height: 30px; + position: relative; + top: -20px; + text-align: center; + background: #fff +} + +.gw-header-toolbar .leftMenu a { + display: block; + padding: 0 +} + +.gw-page-header-tabscontrol { + display: none +} + +.full-width { + width: 100% !important +} + +.scrollbar-x-hidden { + overflow-x: hidden +} + +.border-none { + border: 0 !important +} + +.gw-header { + color: #f5f5f5; + padding: 0; + z-index: 910; + box-shadow: 0 0 10px 0 rgba(57, 66, 100, .1) +} + +.gw-header .gw-header--exitfullscreen-wrapper { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 12px; + z-index: 900 +} + +.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn { + display: block +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + display: none; + cursor: pointer !important; + height: 18px; + width: 120px; + margin: 0 auto; + position: relative; + z-index: 2000 +} + +.gw-header--toast { + background: #333; + opacity: .9; + color: #FFF; + line-height: 43px; + text-align: center; + border-radius: 4px; + height: 46px; + width: 256px; + margin: 46px auto; + display: none +} + +.gw-header--toast-show { + display: block; + -webkit-animation-name: exitFullScreenToastFadeInDown; + animation-name: exitFullScreenToastFadeInDown; + -webkit-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + position: fixed; + left: 50%; + margin-left: -128px +} + +@-webkit-keyframes exitFullScreenToastFadeInDown { + + 0%, + to { + opacity: 0; + transform: translate3d(0, -100%, 0) + } + + 50% { + opacity: 1; + transform: translateZ(0) + } +} + +@keyframes exitFullScreenToastFadeInDown { + + 0%, + to { + opacity: 0; + transform: translate3d(0, -100%, 0) + } + + 50% { + opacity: 1; + transform: translateZ(0) + } +} + +.gw-header--wrapper { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-header--application-icon-container .application-icon-active, +.gw-header--application-icon-container.f-state-active::after, +.gw-header--application-icon-container:hover::after { + display: none +} + +.gw-header--application-icon-container { + position: relative; + width: 55px; + height: 40px; + color: #fff; + text-align: center; + cursor: pointer +} + +.gw-header--application-icon-container::after { + position: absolute; + content: ''; + width: 1px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; + background-color: rgba(255, 255, 255, .3) +} + +.gw-header--application-icon-container .f-icon { + font-size: 1rem; + line-height: 38px +} + +.gw-header--application-icon-container.f-state-active, +.gw-header--application-icon-container:hover { + color: #fff +} + +.gw-header--application-icon-container.f-state-active .application-icon-active, +.gw-header--application-icon-container:hover .application-icon-active { + display: inline-block +} + +.gw-header--application-icon-container.f-state-active .application-icon, +.gw-header--application-icon-container:hover .application-icon { + display: none +} + +.gw-header-toolbar--list { + display: flex; + align-items: center +} + +.gw-header-toolbar--content { + display: block; + height: 40px; + padding: 0 11px; + line-height: 40px; + cursor: pointer +} + +.gw-apps-management-wrapper { + background: #fff; + min-width: 600px; + height: 100%; + display: flex; + flex-direction: column; + margin: 0 70px 0 0; + position: relative +} + +.gw-apps-management-wrapper .header { + padding: 11px 0 17px 20px; + height: 56px +} + +.gw-apps-management-wrapper .header .intro { + font-weight: 700; + font-family: PingFangSC-Medium; + font-size: 18px; + color: #333; + text-align: left; + display: inline-block +} + +.gw-apps-management-wrapper .header .searce { + float: right; + margin-right: 21px; + position: relative; + top: 0; + height: 28px +} + +.gw-apps-management-wrapper .header .searce .searce-img1 { + width: 14px; + position: relative; + right: 8px; + top: 7px; + cursor: pointer; + float: left +} + +.gw-apps-management-wrapper .header .searce .setup-img { + position: relative; + top: -1px; + margin-left: 9px +} + +.last-app-group>.app-group { + min-height: calc(100vh - 171px); + margin-bottom: 25px !important +} + +.searce .select-show-mode { + display: inline-block; + margin: 0 -2px 0 -3px +} + +.searce .select-show-mode .show-mode { + display: inline-block; + width: 30px; + height: 26px; + background: #eaeaea; + position: relative; + top: 8px; + cursor: pointer +} + +.searce .select-show-mode .show-mode img { + width: 14px; + height: 14px; + position: relative; + top: 6px; + left: 8px +} + +.searce .select-show-mode .show-mode .default-img { + display: block +} + +.searce .select-show-mode .show-mode .hover-img, +.searce .select-show-mode .show-mode .selected-img, +.searce .select-show-mode .show-mode:hover .default-img, +.searce .select-show-mode .show-mode:hover .selected-img { + display: none +} + +.searce .select-show-mode .magnetic-sticker-mode { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + margin-left: 15px; + position: relative; + left: 4px +} + +.searce .select-show-mode .all-app-mode { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + position: relative; + left: -4px +} + +.searce .select-show-mode .show-mode:hover .hover-img { + display: block +} + +.searce .select-show-mode .show-mode-active .default-img { + display: none +} + +.searce .select-show-mode .show-mode-active .selected-img { + display: block +} + +.gw-apps-management--tabs-container { + display: flex; + width: 100%; + position: relative; + padding: 9px 0 9px 19px; + border-bottom: 1px solid rgba(0, 0, 0, .06) +} + +.gw-apps-management--tabs-container .tabs-container--horizontal { + flex-wrap: nowrap; + overflow: hidden; + margin: 0; + cursor: pointer +} + +.gw-apps-management--tabs-container .tabs-container--horizontal-length { + margin-right: 65px +} + +.gw-apps-management--tabs-container .tabs-container--item { + margin-top: 1px; + flex-grow: 1; + flex-basis: auto; + position: relative; + margin-right: 2px; + height: 30px; + line-height: 30px; + flex-shrink: 0; + cursor: pointer; + list-style: none; + border-radius: 15px; + padding: 0 19px; + color: #333 +} + +.gw-apps-management--tabs-container .tabs-container--item.active { + color: #fff; + box-shadow: 0 4px 4px 0 rgba(25, 76, 164, .09) +} + +.listview---nav-vertical, +.tabs-container--vertical { + box-shadow: 0 0 6px 0 rgba(139, 139, 139, .27); + z-index: 1000 +} + +.tabs-container--vertical-smallscreen { + height: calc(100vh - 200px) !important +} + +.tabs-container--vertical { + display: none; + width: 247px; + height: 556px; + background: #fff; + overflow: auto +} + +.tabs-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.tabs-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.tabs-container--vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.tabs-container--vertical.show { + display: flex; + position: absolute; + right: 25px; + top: 51px +} + +.tabs-container--vertical .list-group { + flex: auto +} + +.tabs-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer +} + +.tabs-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.searce .searce-input, +.set-up, +.tips { + position: relative +} + +.set-up, +.set-up img { + width: 14px; + height: 14px +} + +.tabs-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1 +} + +.tabs-container--vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.set-up { + cursor: pointer; + float: right; + right: 0; + top: 15px; + margin-left: 16px +} + +.set-up .set-up-img { + display: block +} + +.set-up .set-up-img-down, +.set-up .set-up-img-hover, +.set-up:hover .set-up-img { + display: none +} + +.set-up:hover .set-up-img-hover { + display: block +} + +.setUpMousedown .set-up-img, +.setUpMousedown .set-up-img-hover { + display: none !important +} + +.setUpMousedown .set-up-img-down { + display: block !important +} + +.searce .searce-input { + border: none; + outline: 0; + background: #fff; + border-radius: 20px; + width: 200px; + height: 28px; + padding-left: 12px; + padding-right: 30px; + right: -20px; + float: left; + top: 0 +} + +.searce input::-webkit-input-placeholder { + font-size: 12px; + color: #999; + text-align: left +} + +.searce input::-ms-input-placeholder { + font-size: 12px; + color: #999; + text-align: left +} + +gsp-list-index { + background-color: #fff +} + +.tips { + display: inline-block; + width: 0; + margin: 0 -2px +} + +.tips .tips-content { + position: absolute; + top: -11px; + z-index: 2; + display: none; + width: 68px; + height: 28px; + background-color: #5a676f; + border-radius: 2px; + text-align: center; + line-height: 28px; + font-size: 12px; + color: #fff; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none +} + +.tips .magnetic-sticker-mode-tips { + left: -47px +} + +.tips .list-mode-tips { + left: -51px +} + +.tips .all-app-mode-tips { + left: -55px +} + +.select-show-mode:hover .tips-content { + display: block !important +} + +.keyApplication1, +.keyApplication2, +.keyApplication3, +.module { + display: none +} + +.international-nav-container .nav a { + padding: 0 19px; + margin-right: 2px +} + +.last-app-group /deep/ .app-group .content { + min-height: calc(100vh - 235px) +} + +.last-app-group .last-app-group-height { + min-height: calc(100vh - 165px) +} + +.search-fra { + background: #FFF !important; + border: 1px solid #E0E0E0 !important; + border-radius: 4px !important +} + +.search-fra:focus { + background: #FFF !important; + border: 1px solid #0068F3 !important; + border-radius: 4px !important +} + +input::-webkit-calendar-picker-indicator { + display: none +} + +.tabs-container--dropdown { + position: absolute; + right: 0; + top: 7px; + width: 52px; + height: 36px; + background: #fff; + box-shadow: -1px 0 1px 0 rgba(0, 0, 0, .12); + cursor: pointer +} + +.tabs-container--dropdown .f-icon { + width: 36px; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: rgba(0, 0, 0, .5) +} + +.tabs-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform .2s +} + +.module { + height: calc(100vh - 246px) +} + +.keyApplication, +.keyApplication-header-wrapper { + padding: 0 24px +} + +.keyApplication .module, +.keyApplication-header-wrapper .module-head .module-header--content { + margin-right: 54px +} + +.keyApplication-header-wrapper .module-head { + flex-shrink: 0 +} + +.keyApplication-header-wrapper .module-head .module-header--icon { + width: 20px; + height: 20px; + margin-right: 10px +} + +.keyApplication { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + width: 100%; + align-content: flex-start; + align-items: flex-start; + overflow: auto +} + +.keyApplication .keyApplication::-webkit-scrollbar { + width: 7px !important; + height: 7px !important; + background-color: #8e8e8e +} + +.keyApplication .module { + position: relative; + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-content: flex-start; + align-items: flex-start; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0 +} + +.keyApplication .module .module-title { + position: absolute; + top: -33px; + width: 100%; + height: 31px; + border-bottom: 1px solid #d2deea; + font-size: 16px; + color: #333 +} + +.keyApplication .group { + width: 200px; + margin-bottom: 5px; + margin-top: 14px +} + +.keyApplication .group .group-title { + font-size: 14px; + color: #999; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: flex; + align-items: center; + padding-bottom: 14px +} + +.keyApplication .group .group-title .group-title--icon-container { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + width: 18px; + height: 9px; + margin: 0 .375rem 0 0; + padding-left: 3px +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + -moz-transform: skewX(-22deg) +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + margin-left: 4px +} + +.keyApplication .group .group-title .group-title--text { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 14px; + color: rgba(0, 0, 0, .65) +} + +.keyApplication .group .module--list { + padding-left: 0; + margin-bottom: 0 +} + +.keyApplication .group .module--list .module--list-item { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + list-style: none; + font-size: 14px; + padding: 5px 33px 5px 10px; + margin-right: 24px; + position: relative; + color: rgba(0, 0, 0, .85) +} + +.keyApplication .group .module--list .module--list-item::after { + position: absolute; + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0 +} + +.keyApplication .group .module--list .module--list-item:hover { + cursor: pointer; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, .08) +} + +.keyApplication .group .module--list .module--list-item:hover::after { + opacity: 1 +} + +.keyApplication .group .module--list .module--list-item:hover .module--list-collect { + display: block +} + +.keyApplication .group .module--list .module--list-text { + font-size: 14px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer +} + +.keyApplication .group .module--list .module--list-collect { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + text-align: center; + cursor: pointer; + color: #FFC43B +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect, +.listview--nav-horizontal .active .tab-img { + display: block +} + +.keyApplication .group .module--list .module--list-collect .f-icon { + font-size: 15px; + line-height: 20px +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before { + content: '\e303' +} + +.keyApplication-active { + display: flex +} + +.keyApplication-background-show-right { + background-image: url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg); + background-position: 97% 92%; + background-repeat: no-repeat +} + +.listview--nav-horizontal { + overflow: hidden; + padding-left: 24px; + padding-right: 24px; + height: 52px; + width: 100%; + background-color: #fff; + position: relative; + top: -8px; + border-bottom: 2px solid #ebebeb; + margin-bottom: 12px; + flex-wrap: nowrap; + display: flex +} + +.listview--nav-horizontal .listview--nav-link { + display: inline-block; + height: 14px; + margin-right: 16px; + text-decoration: none +} + +.listview--nav-horizontal .listview--nav-link .keyApplicationName { + font-size: 16px; + color: grey; + text-align: center; + padding: 0 17px 0 20px; + height: 40px; + line-height: 40px; + margin-left: 5px; + margin-right: 5px; + position: relative; + top: 11px; + border-top-left-radius: 2px; + white-space: nowrap +} + +.listview--nav-horizontal .active .keyApplicationName { + color: #fff +} + +.listview--nav-horizontal .tab-img { + float: right; + height: 40px; + position: relative; + top: -45px; + left: 3px; + display: none +} + +.imgyinying { + background: url(../../../img/矩形@2x.png); + width: 8px +} + +.out-keyApplication { + overflow: hidden; + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0 +} + +.out-keyApplication .module-head { + position: relative +} + +.out-keyApplication .module-head .module-header--content { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid #e5e5e5 +} + +.out-keyApplication .module-head .module-title-img { + display: block; + width: 16px; + height: 16px; + margin-right: 10px +} + +.out-keyApplication .module-head .module-title { + width: 200px; + font-size: 15px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0 +} + +.international-nav .nav-a .keyApplicationName { + font-size: 14px; + padding: 0 18px 0 20px +} + +.international-content .keyApplication .module-head .module-title { + font-size: 14px; + position: relative; + top: 2px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.international-content .keyApplication .group { + width: auto; + padding-right: 10px +} + +.international-content .keyApplication .group .group-title { + max-width: 240px +} + +.international-content .keyApplication .module .module--list-item { + font-size: 12px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.listview--nav-container { + display: flex; + width: 100%; + position: relative; + padding-right: 22px; + overflow: auto +} + +.listview--nav-container .nav { + flex-wrap: nowrap; + overflow: hidden +} + +.listview---nav-vertical { + display: none; + width: 247px; + height: 556px; + background: #fff +} + +.listview---nav-vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.listview---nav-vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.listview---nav-vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.listview---nav-vertical.show { + display: flex; + position: absolute; + right: 25px; + top: 45px +} + +.listview---nav-vertical .list-group { + flex: auto +} + +.listview---nav-vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px +} + +.listview---nav-vertical .list-group .list-group-item.active, +.listview---nav-vertical .list-group .list-group-item:hover { + background: #ddecff +} + +.listview---nav-vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.jianyin { + width: 30px; + height: 30px; + background-color: #f6f6f6; + background: linear-gradient(to bottom, #fff, #f6f6f6); + position: absolute; + right: 52px; + opacity: 0 +} + +.btn-nav-all-dropdown, +.btn-nav-all-dropdown2 { + padding: 2px 1px 1px; + background-color: #f6f6f6; + line-height: 1 +} + +.btn-nav-all-dropdown { + flex: none; + height: 30px; + position: absolute; + right: 20px; + top: 10px +} + +.btn-nav-all-dropdown .active, +.btn-nav-all-dropdown2 .active { + top: 4px +} + +.btn-nav-all-dropdown:focus { + box-shadow: none +} + +.double-slash { + font-family: PingFangSC-Regular; + font-size: 14px !important; + color: #0F4D9E !important; + line-height: 14px; + background: -30px center no-repeat #F9F9F9; + border-radius: 2px; + height: 26px; + background-size: 50% 50%; + display: flex; + align-items: center; + padding-left: 33px +} + +.gw-apps-management--listview, +.gw-apps-management--listview .listview--keyapp-list { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column; + overflow: hidden +} + +.gw-apps-management--tileview { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: 1px solid rgba(0, 0, 0, .06); + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + overflow: hidden +} + +.gw-apps-management--tileview .tileview--nav { + width: 230px; + background: rgba(247, 249, 250, .8); + border-right: 1px solid rgba(0, 0, 0, .06); + overflow-y: auto +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-apps-management--tileview .tileview--content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding: 0 0 24px 30px; + background: #fff; + overflow-y: auto +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-apps-management--tileview .tileview--app-wrapper { + padding: 0; + margin: .875rem 1rem 0 0 +} + +.tileview--menu-item-height-default { + height: 37px +} + +.menu-submenu--title-height-default { + height: 45px +} + +.menu-submenu--title, +.tileview--menu-item { + padding: 0 0 0 63px; + position: relative; + cursor: pointer +} + +.menu-submenu--title .menu-item--icon, +.tileview--menu-item .menu-item--icon { + position: absolute; + top: 12px; + left: 29px; + line-height: 21px; + overflow: hidden +} + +.menu-submenu--title .menu-item--icon .gw-icon, +.tileview--menu-item .menu-item--icon img { + font-size: 16px +} + +.menu-submenu--title .menu-item--right { + display: none; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title .menu-item--right-selected { + display: none !important; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title .menu-item--text-length, +.tileview--menu-item .menu-item--text-length { + white-space: nowrap; + overflow: hidden; + width: 127px; + text-overflow: ellipsis +} + +.menu-submenu--title .menu-item--text, +.tileview--menu-item .menu-item--text { + display: block; + line-height: 21px; + font-size: 15px; + color: rgba(0, 0, 0, .85) +} + +.menu-submenu--title .menu-item--text { + padding: .75rem 0 +} + +.tileview--menu-item .menu-item--text { + padding: .5rem 0 +} + +.menu-submenu--title:hover .menu-item--right, +.tileview--menu-item:hover .menu-item--right { + display: block; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title:hover .menu-item--right-selected, +.tileview--menu-item:hover .menu-item--right-selected { + display: block !important; + line-height: 24px; + transform: rotate(270deg) !important; + right: 1.65rem; + top: .95rem +} + +.tileview--menu-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.tileview--menu-item-selected::after { + transform: scaleY(1) !important; + opacity: 1 !important +} + +.tileview--menu-top { + margin-top: 1px +} + +.tileview--menu .menu-list-item--arrow { + display: none; + position: absolute; + top: .75rem; + right: 1.375rem +} + +.tileview--menu .tileview--menu-item-selected .menu-list-item--arrow { + display: block +} + +.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text { + color: #000 +} + +.tileview--menu-sub { + transition: all .1s linear +} + +.tileview--menu-submenu-open .tileview--menu-sub { + height: 100% +} + +.tileview--menu-image { + transform: translateX(-20px) +} + +.application-wrapper--header { + padding: 0 0 4px +} + +.application-wrapper--header-title { + display: flex; + align-items: center; + font-size: .9375rem; + font-size: 15px; + line-height: 1.3125rem; + color: rgba(0, 0, 0, .85); + margin: 0; + font-weight: 600 +} + +.application-wrapper--header-title span { + display: inline-block; + vertical-align: middle +} + +.application-list--header-title--icon { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + width: 18px; + height: 9px; + margin: 0 .375rem 0 0; + padding-left: 3px +} + +.application-list--header-title--icon .header-title--icon-item { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + -moz-transform: skewX(-22deg) +} + +.application-list--header-title--icon .header-title--icon-item-right { + margin-left: 4px +} + +.application-wrapper--content { + padding: 0 0 16px +} + +.application-wrapper--list-title { + margin-top: 8px; + margin-bottom: 18px +} + +.application-wrapper--list { + padding: 0 0 0 14px +} + +.application-wrapper--list:after { + content: ""; + display: block; + clear: both +} + +.application-wrapper--list-item { + position: relative; + width: 199px; + float: left; + padding: 5px 10px; + margin: 0 2px 0 0; + list-style: none +} + +.application-wrapper--list-item .application-wrapper--list-item-text { + font-size: 14px; + color: rgba(0, 0, 0, .85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer +} + +.application-wrapper--list-item .application-wrapper--list-item-tip { + padding: 0 6px; + white-space: nowrap; + background: #FFF; + border: 1px solid #D6D6D6; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .15); + font-family: PingFangSC-Regular; + font-size: 12px; + color: #313131; + line-height: 20px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top { + width: 12px; + height: 12px; + transform: rotate(45deg); + position: absolute; + margin-top: 7px; + top: -1px; + background: #FFF; + border: 1px solid #D6D6D6; + border-radius: 2px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame { + width: 12px; + height: 10px; + overflow: hidden; + position: absolute; + top: -9px; + left: 12px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: none; + transition: all 0s linear .7s +} + +.application-wrapper--list-item .application-wrapper--list-item-start { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + cursor: pointer +} + +.application-wrapper--list-item .application-wrapper--list-item-start .f-icon { + display: block; + margin: 0 auto; + font-size: 15px; + line-height: 20px; + color: #FFC43B +} + +.talk_input, +.talk_show { + margin: 10px auto 0 +} + +.application-wrapper--list-item::after { + position: absolute; + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0 +} + +.application-wrapper--list-item:hover { + display: block; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, .08) +} + +.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: flex +} + +.application-wrapper--list-item:hover::after { + opacity: 1 +} + +.talk_con { + background: #f9f9f9 +} + +.talk_show { + border: 1px solid #666; + overflow: auto; + height: 400px; + width: auto +} + +.atalk, +.btalk { + margin: 10px +} + +.whotalk { + float: left; + outline: 0 +} + +.talk_word { + padding: 0; + float: left; + outline: 0; + text-indent: 10px; + width: 350px; + height: 30px +} + +.atalk span, +.btalk span { + display: inline-block; + color: #fff; + padding: 5px 10px; + border-radius: 10px +} + +.custom-class, +.talk_sub { + float: right +} + +.talk_sub { + margin-left: 10px +} + +.atalk span { + background: #0181cc +} + +.btalk { + text-align: right +} + +.btalk span { + background: #ef8201 +} + +.modal-dialog { + position: absolute; + right: 0; + bottom: 0; + margin: 0 +} + +:host { + display: flex; + flex-direction: column +} + +.notactive { + position: relative +} + +.borderactive+li>a { + padding-right: 10px; + padding-left: 12px; + font-family: PingFangSC-Regular; + color: rgba(0, 0, 0, .65); + border: 1px solid #dae0e6 !important; + border-top: 0 !important; + border-right: 0 !important; + border-bottom: 0 !important; + border-left: 0 !important; + border-top-left-radius: 0 !important +} + +.notinimg { + visibility: hidden +} + +.noimghover { + visibility: visible +} + +.btn-nav-all-dropdown2 { + flex: none; + height: 30px; + position: absolute; + right: 20px +} + +.btn-nav-all-dropdown2:focus { + box-shadow: none +} + +.down-arrow { + display: inline-block; + position: relative; + width: 28px; + height: 32px +} + +.down-arrow::after { + display: inline-block; + content: " "; + height: 9px; + width: 9px; + border-width: 0 2px 2px 0; + border-color: #999; + border-style: solid; + transform: matrix(.71, .71, -.71, .71, 0, 0); + transform-origin: center; + transition: transform .3s; + position: absolute; + top: 50%; + right: 10px; + margin-top: -10px +} + +.down-arrow.active::after { + transform-origin: center; + transform: rotate(-135deg); + transition: transform .3s +} + +.list-group-items { + height: 32px; + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px +} + +.list-group-items:hover { + background: #ddecff +} + +.list-group-items.active { + background: #c8e0ff +} + +.list-group-items:first-child { + border-radius: 0 +} + +.tabset--nav-container { + display: flex; + width: 100%; + position: relative +} + +.tabset--nav-container .active-bg { + display: none +} + +.tabset--nav-container .tabset--tab-content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column +} + +.tabset--nav-container .nav { + border: none +} + +.tabset--nav-container .tabset-container--dropdown { + position: absolute; + height: 36px; + line-height: 36px; + border-right: 1px solid #f0f0f0; + color: rgba(0, 0, 0, .45); + z-index: 10; + cursor: pointer; + right: 0; + top: 0; + display: flex; + flex-direction: row; + align-items: center +} + +.tabset--nav-container .tabset-container--dropdown .f-icon { + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + font-size: 18px +} + +.tabset--nav-container .tabset-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform .2s +} + +.tabset--nav-container .tabset-container--vertical { + display: none; + width: 247px; + background: #fff; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, .2); + z-index: 1000; + overflow: auto +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close { + font-size: 14px; + color: rgba(0, 0, 0, .15); + vertical-align: inherit +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close::before { + content: "\e11b" +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover { + color: #f74242 !important +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before { + content: "\e11d" +} + +.tabset--nav-container .tabset-container--vertical .list-group-header { + padding: 14px 24px 6px; + display: flex; + align-items: center; + justify-content: space-between +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title { + font-size: 16px; + color: rgba(0, 0, 0, .95); + margin: 0 +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper { + font-size: 14px; + display: flex; + align-items: center; + cursor: pointer +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon { + width: 14px; + height: 14px; + margin: 0 6px 0 0; + background: #d1d5db; + border-radius: 2px +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon { + color: #fff; + font-size: 14px; + display: block +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before { + content: "\e11b" +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text { + color: rgba(0, 0, 0, .85) +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon { + background: #ff6060 +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon { + background: #f94c4c +} + +.tabset--nav-container .tabset-container--vertical.show { + display: flex; + position: fixed; + right: 1px; + top: 80px; + bottom: 1px +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.tabset--nav-container .tabset-container--vertical .list-group { + flex: auto; + padding-left: 0; + width: 247px +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active, +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(144deg, #eef4ff 0, #f6fcff 100%) +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1 +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.newdh:hover .gjdh, +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps { + display: none +} + +.newdh:hover .gjdh2 { + display: inline +} + +.gjdh2 { + display: none +} + +.tabshow { + display: inline +} + +.tabhid, +.tabset--nav-container .nav .tabset--nav-item:hover::after, +.tabset--nav-container .nav .tabset--nav-item:last-child::after { + display: none +} + +.tabset--nav-container .nav { + flex-wrap: nowrap; + overflow: inherit; + line-height: 16px; + text-align: center; + margin-right: 60px +} + +.tabset--nav-container .nav .tabset--nav-item { + flex-shrink: 0; + position: relative +} + +.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before { + left: 3px +} + +.tabset--nav-container .nav .tabset--nav-item::after { + position: absolute; + content: ''; + background: #CCD2E1; + width: 1px; + right: 0; + z-index: 100; + height: 14px; + top: 50%; + margin-top: -7px; + opacity: .38 +} + +.tabset--nav-container .nav .tabset--nav-link { + border: none; + display: flex; + flex-direction: row; + align-items: center +} + +.gw-navbar-user-name::after, +.menu-userinfo-wrapper .menu-userinfo--item-name::after { + border-left: 3px solid transparent; + border-bottom: 3px solid #fff; + border-right: 3px solid #fff +} + +.tabset--nav-container .nav .tabset--nav-link-text { + display: block; + max-width: 110px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.tabset--nav-container .nav .tabset--nav-link-overlay, +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + bottom: 0; + width: 15px; + height: 15.45px; + position: relative; + float: left; + margin-left: -14px +} + +.tabset--nav-container .nav .tabset--nav-link-overlay { + background: linear-gradient(top, rgba(255, 255, 255, 0), #f5f5f5); + filter: progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff, endColorstr=whitesmoke, GradientType=0 +} + +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + background: linear-gradient(top, rgba(255, 255, 255, 0), #fafbfc); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0) +} + +.tabset--nav-container .nav .nav-link-close { + width: 15px; + height: 15px; + color: #d8d8d8; + margin-left: 24px +} + +.tabset--nav-container .nav .nav-link-close .f-icon { + vertical-align: top; + font-size: 12px; + line-height: 15px +} + +.tabset--nav-container .nav .nav-link-close:hover { + color: #f74242 !important +} + +.tabset--nav-container .nav .nav-link-close:hover .f-icon::before { + font-size: 15px; + content: "\e11d" +} + +.tabset--nav-container .nav .spanlib { + display: inline-block; + white-space: nowrap; + max-width: 230px; + overflow: hidden +} + +.tabset--nav-container .nav .tabset--nav-link.active { + box-shadow: inset 0 0 1px 0 rgba(0, 0, 0, .1); + z-index: 11 +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link { + padding: 0 19px 0 20px; + height: 38px; + line-height: 38px +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close { + display: none +} + +.tabset--nav-container .nav .nav-item--home .nav-item--home-icon { + display: inline-block; + width: 16px; + height: 16px; + background: url(../../../launcher/home-icon.svg) center center no-repeat +} + +.gw-header--menu-panel .menu-panel--close:hover::before, +.tabset--nav-container .nav .nav-item--apps, +.tabset--nav-container .nav .nav-item--apps .nav-link-close { + display: none +} + +.workarea { + overflow: hidden; + background-color: #f4f6f9 +} + +.gw-header--menu-panel-wrapper { + position: fixed; + width: 90%; + top: 40px; + left: 0; + bottom: 0; + z-index: 980; + max-width: none; + transform: translateX(-120%); + box-shadow: 0 2px 26px 0 rgba(0, 0, 0, .3) +} + +@media (min-width:1600px) { + .gw-header--menu-panel-wrapper { + width: 70%; + max-width: none + } +} + +.gw-header--menu-panel-wrapper.f-state-show { + transform: translateX(0) +} + +.gw-header--menu-panel-wrapper.f-state-hidden { + transform: translateX(-500%) +} + +.gw-header--menu-panel-mask-top { + top: 40px !important +} + +.gw-header--menu-panel-mask-bottom { + bottom: calc(100vh - 40px) !important; + background-color: transparent !important +} + +.gw-header--menu-panel-mask { + overflow: hidden; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 970; + transform: translateX(-120%); + background-color: #000; + opacity: .4 +} + +.gw-header--menu-panel-mask.f-state-show { + transform: translateX(0) +} + +.gw-header--menu-panel-mask.f-state-hidden { + transform: translateX(-120%) +} + +.gw-header--menu-panel { + min-width: 600px; + height: 100%; + margin: 0; + z-index: 982; + position: relative; + background: #fff +} + +.gw-header--menu-panel .gw-apps-management { + top: 0; + position: absolute; + background: 0 0 +} + +.gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper { + margin: 0 +} + +.gw-header--menu-panel .menu-panel--close { + position: absolute; + cursor: pointer; + z-index: 1001; + width: 56px; + height: 56px; + top: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center +} + +.gw-header--menu-panel .menu-panel--close::before { + background: rgba(0, 0, 0, .06); + border-radius: .5px; + position: absolute; + left: 0; + width: 1px; + height: 14px; + content: ''; + top: 50%; + margin-top: -7px +} + +.gw-header--menu-panel .menu-panel--close .menu-panel--close-area { + width: 22px; + height: 22px; + text-align: center; + background: rgba(0, 0, 0, .1); + border-radius: 11px; + color: rgba(0, 0, 0, .5) +} + +.gw-header--menu-panel .menu-panel--close .f-icon { + font-size: 14px; + line-height: 22px +} + +.gw-header--menu-panel .menu-panel--close:hover { + background: #F6F6F6 +} + +.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area { + color: #fff; + background: #FF6060 +} + +.menu-userinfo-wrapper { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.menu-userinfo-wrapper::after { + display: none +} + +.menu-userinfo-wrapper.active, +.menu-userinfo-wrapper.hover { + background-color: #075EBB +} + +.menu-userinfo-wrapper .menu-userinfo--item { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.menu-userinfo-wrapper .menu-userinfo--item::after { + display: none +} + +.menu-userinfo-wrapper .menu-userinfo--item-avatar { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + margin-right: 4px +} + +.menu-userinfo-wrapper .menu-userinfo--item-name { + font-size: 14px; + color: #fff; + position: relative; + opacity: .8 +} + +.menu-userinfo-wrapper .menu-userinfo--item-name::after { + content: ''; + position: absolute; + right: -7px; + bottom: 8px; + width: 0; + height: 0; + border-top: 3px solid transparent +} + +.menu-userinfo--detail { + right: 0; + min-width: 220px; + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + padding-top: 2px +} + +.menu-userinfo--detail-content { + background-color: #fff +} + +.detail-content--item, +.detail-content--user { + white-space: nowrap; + overflow: hidden; + text-align: left +} + +.detail-content--user { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 10px +} + +.detail-content--user .detail-content--user-avatar-container { + margin-right: 10px +} + +.detail-content--user .detail-content--user-avatar { + display: block; + width: 38px; + height: 38px; + border-radius: 100% +} + +.detail-content--user .detail-content--user-info { + line-height: 20px +} + +.detail-content--user .detail-content--user-info-sub { + font-size: 13px; + margin-top: 2px +} + +.detail-content--item { + line-height: 20px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + padding: 0 10px; + cursor: pointer +} + +.detail-content--item:hover { + color: #247AEC +} + +.detail-content--item .detail-content--icon { + width: 20px; + margin-right: 10px; + margin-left: 9px; + font-size: 20px +} + +.detail-content--item-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 0 +} + +.curtenant, +.setdefault, +.setdefault:hover { + font-size: 12px; + width: 64px; + line-height: 20px; + align-items: center; + height: 20px; + font-family: PingFangSC-Regular; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + align-self: start; + text-align: center +} + +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input { + border: 0 +} + +.setdefault { + border-radius: 10px; + color: #666; + flex-shrink: 0; + justify-content: flex-end; + flex-direction: row +} + +.curtenant, +.setdefault:hover { + border-radius: 10px; + color: #fff; + flex-shrink: 0; + justify-content: flex-end; + flex-direction: row +} + +.tenant-title { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .85); + letter-spacing: -.38px; + display: flex; + align-items: center; + width: 94px; + flex-shrink: 0; + margin-left: .75rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + justify-content: flex-start; + flex-direction: row; + align-self: start; + margin-right: 20px +} + +.name-space { + height: 38px +} + +.gw-navbar-user-dropdown { + position: relative; + padding: 0 16px 0 14px; + cursor: pointer +} + +.gw-navbar-user-dropdown.active.gw-navbar-user-name { + opacity: 1 +} + +.gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail { + display: block !important +} + +.gw-navbar-user-info { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.gw-navbar-user-avatar { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + margin-right: 4px +} + +.gw-navbar-user-name { + font-size: 14px; + color: #fff; + position: relative; + opacity: .8 +} + +.gw-navbar-user-name::after { + content: ''; + position: absolute; + right: -7px; + bottom: 8px; + width: 0; + height: 0; + border-top: 3px solid transparent +} + +.gw-navbar-user-info-detail { + position: absolute; + right: 0; + top: calc(100% + 1px); + z-index: 1000; + min-width: 220px +} + +.gw-navbar-user-info-content { + background-color: #fff; + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border: 1px solid rgba(56, 138, 255, .2); + border-radius: 2px +} + +.gw-navbar-user-info-content--menu { + background-color: #fff; + border-radius: 2px +} + +.gw-navbar-user-info-content-list-item { + line-height: 20px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + white-space: nowrap; + overflow: hidden; + text-align: left; + cursor: pointer +} + +.gw-navbar-user-info-content-list-item .user-item-icon { + width: 20px; + margin-right: 10px; + margin-left: 9px; + font-size: 18px +} + +.gw-navbar-user-info-content-list-item .user-item-icon::before { + vertical-align: bottom +} + +.gw-navbar-user-info-content-list-msg { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 10px +} + +.gw-navbar-user-info-content-list-msg .user-item-img { + width: 38px; + height: 38px; + margin-right: 10px +} + +.gw-navbar-user-info-content-list-msg .user-item-img img { + display: block; + width: 38px; + height: 38px; + border-radius: 100% +} + +.gw-navbar-user-info-content-list-msg .user-item-data { + font-size: 14px; + font-weight: 400; + color: rgba(0, 0, 0, .8) +} + +.gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section { + font-size: 13px; + margin-top: 2px +} + +.gw-navbar-user-info-content-list-item.item-setting-list { + color: rgba(0, 0, 0, .85); + padding: 0 14px +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 0 +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size, +.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { + width: 14px; + height: 14px +} + +.dialog-user-edit { + display: flex; + flex-direction: row; + align-items: center; + padding: 16px 26px; + padding-left: 18px !important +} + +.dialog-user-edit .dialog-user-edit-icon { + margin-right: 12px; + font-size: 22px; + color: #f49730 +} + +.dialog-user-edit .dialog-user-edit-text { + font-size: 16px; + color: #000 +} + +.gw-user-edit-dialog { + display: none +} + +.gw-user-edit-dialog.show { + display: block +} + +.gw-user-edit-modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + overflow: hidden; + outline: 0 +} + +.gw-user-edit-modal .modal-dialog { + transform: translate(0, 0); + width: 420px; + height: 180px; + margin-left: -210px !important; + margin-top: -90px !important +} + +.edit-modal-dialog { + position: absolute; + width: 420px; + height: 180px; + left: 50%; + top: 50%; + margin-left: -210px; + margin-top: -90px +} + +.edit-modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + border: 0 solid rgba(0, 0, 0, .2); + border-radius: 2px; + box-shadow: 0 4px 12px 0 rgba(0, 0, 0, .2); + outline: 0 +} + +.edit-modal-header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #e2e8f0; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + flex-shrink: 0; + background: #fff; + color: #000; + padding: 12px 8px 12px 18px +} + +.edit-modal-title { + margin-bottom: 0; + line-height: 22px; + font-size: 16px +} + +.edit-modal-actions { + flex: 1; + margin: -4px 0; + display: flex; + justify-content: flex-end +} + +.edit-modal-actions-close { + padding: 2px; + color: #bfbfbf; + cursor: pointer +} + +.edit-modal-actions-close:hover { + color: rgba(0, 0, 0, .85) +} + +.edit-modal-body { + height: auto; + overflow: hidden +} + +.edit-modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + flex-shrink: 0; + padding: 16px 20px 20px +} + +.edit-modal-footer .btn { + margin-right: 8px; + padding: 4px 15px; + line-height: 20px !important; + font-size: 14px +} + +.edit-modal-footer .btn:last-child { + margin-right: 0 +} + +.gw-user-edit-modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: rgba(0, 0, 0, .15) +} + +.tab-list-menu-back { + background: #FDFEFF; + box-shadow: 0 0 10px 0 rgba(57, 66, 100, .1); + border-radius: 4px +} + +.tab-list-menu-back-item-name { + font-family: PingFangSC-Regular; + font-size: 14px; + letter-spacing: -.38px; + text-align: right; + z-index: 980 +} + +.tab-list-menu-back-item-out { + height: 37.5px; + border-radius: 4px; + margin: 0 3px +} + +.tab-list-menu-back-item-out-content { + display: flex; + flex-direction: row; + align-items: center; + line-height: 37.5px +} + +.tab-list-menu-whole { + position: absolute; + z-index: 1000; + width: auto; + top: 30px !important; + display: none +} + +.tab-list-menu-whole-menu { + position: absolute; + z-index: 1000; + width: auto; + top: 100% !important +} + +.tab-list-menu-whole-menu-mask { + overflow: hidden; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 970; + transform: translateX(-120%); + background-color: transparent; + opacity: .4 +} + +.tab-list-menu-whole-menu-mask-state-show { + transform: translateX(0) +} + +.tab-list-menu-whole-menu-mask-state-hidden { + transform: translateX(-500%) +} + +.gw-view-tiled--container { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0 +} + +.gw-view-tiled--container .gw-view-tiled--nav { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 24px 8px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select { + position: relative; + width: 218px; + margin-right: 18px; + background: #fff; + border: 1px solid rgba(0, 0, 0, .08); + border-radius: 2px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + height: 28px; + padding: 0 36px 0 10px; + line-height: 28px; + cursor: pointer +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text { + font-size: 15px; + color: rgba(0, 0, 0, .85); + margin-right: 8px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow { + position: absolute; + right: 0; + top: 1px; + width: 30px; + height: 26px; + cursor: pointer; + font-size: 12px; + color: rgba(0, 0, 0, .85) +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { + display: none; + position: absolute; + left: 0; + top: 30px; + width: 218px; + z-index: 999; + background: #fff; + box-shadow: 0 4px 6px 0 rgba(139, 139, 139, .1); + max-height: calc(100vh - 200px); + overflow: auto +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item { + height: 36px; + padding-left: 10px; + line-height: 36px; + font-size: 14px; + color: #333; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true { + display: block +} + +.gw-view-tiled--container .gw-view-tiled--content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 16px 24px; + overflow-y: auto +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item { + display: inline-block; + position: relative; + width: 240px; + height: 80px; + padding: 17px 58px 17px 14px; + margin-right: 14px; + margin-bottom: 18px; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, .06); + border-radius: 2px; + transition: all .2s +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon { + flex-shrink: 0; + width: 46px; + height: 46px; + margin-right: 10px +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img { + display: block; + width: 36px; + height: 36px; + margin: 5px auto +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title { + font-size: 14px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after { + position: absolute; + content: '\e302'; + right: 10px; + top: 10px; + width: 20px; + height: 20px; + line-height: 20px; + text-align: center; + cursor: pointer; + font-size: 14px; + color: #FFC43B; + font-family: FarrisExtend; + text-transform: none; + display: none +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after { + display: inline-block; + content: '\e303' +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, .06) +} + +.menu-search-wrapper { + height: 40px; + transition: all .2s linear; + transform: translateY(-40px); + margin: 0 24px 0 0 +} + +.menu-search-wrapper.f-state-focus { + transform: translateY(0) +} + +.menu-search-wrapper .menu-search--placerholder { + position: relative; + height: 40px; + line-height: 40px; + padding-right: 22px; + text-align: right +} + +.menu-search-wrapper .menu-search--placerholder .f-icon-search { + margin-right: 10px; + color: #fff +} + +.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text { + display: inline-block; + line-height: 18px; + font-size: 13px; + color: rgba(255, 255, 255, .49) +} + +.menu-search-wrapper .menu-search--placerholder::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .5) +} + +.menu-search-wrapper .menu-search--search { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select { + position: relative; + padding: 0 8px 0 16px; + height: 40px; + line-height: 40px; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text { + font-size: 14px; + color: rgba(255, 255, 255, .85) +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow { + margin-left: 5px; + font-size: 14px; + color: #fff +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .3) +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px; + padding: 0 6px +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input { + display: block; + height: 40px; + line-height: 40px; + border: 0; + box-shadow: none; + font-size: 14px; + color: #fff; + background: 0 0 +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append { + padding-right: 13px; + height: 40px; + line-height: 40px; + color: #fff; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear { + position: relative; + padding-left: 13px; + color: #fff; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .3) +} + +.menu-colllection-wrapper .dropdown-toggle::after { + display: none +} + +.menu-colllection-wrapper .menu-colllection--detail { + width: 280px +} + +.menu-colllection-wrapper .menu-colllection--detail-title { + padding: 6px 16px 8px; + font-size: 13px; + color: rgba(0, 0, 0, .6) +} + +.menu-colllection-wrapper .menu-colllection--detail-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 11px 15px; + cursor: pointer +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img { + width: 28px; + height: 28px +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img img { + display: block; + width: 28px; + height: 28px +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content { + flex: 1; + padding-left: 14px; + overflow: hidden +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title { + margin-bottom: 3px; + line-height: 18px; + font-size: 13px; + color: rgba(0, 0, 0, .85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle { + line-height: 16px; + font-size: 12px; + color: rgba(0, 0, 0, .3); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-single-app-wrapper { + position: relative; + width: 198px; + height: 116px; + padding: 12px 18px; + margin-right: 14px; + margin-bottom: 14px; + background: #FFF; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, .06); + border-radius: 2px; + transition: all .2s +} + +.gw-single-app-wrapper:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, .06) +} + +.gw-single-app--title { + padding-right: 20px; + margin-bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-single-app--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, .45); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-single-app--icon-container { + position: absolute; + right: 14px; + bottom: 12px +} + +.gw-single-app--icon-container img { + width: 36px; + height: 36px +} + +.gw-app-group--header { + display: flex; + flex-direction: row; + align-items: center; + padding-bottom: 14px; + margin-right: 10px +} + +.gw-app-group--header .header--icon-container { + width: 20px; + height: 20px; + margin: 0 10px 0 0; + line-height: 20px +} + +.gw-app-group--header .header--icon-container .header--icon { + font-size: 20px; + color: rgba(0, 0, 0, .45) +} + +.gw-app-group--header .header--title { + font-size: 14px; + color: rgba(0, 0, 0, .75); + margin-right: 6px +} + +.gw-app-group--header .header--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, .3) +} + +.gw-app-group-wrapper { + padding: 10px 0 0 +} + +.gw-app-group--list { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-bottom: 0 +} + +.gw-apps-management { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + overflow: hidden; + display: flex; + flex-direction: column; + position: fixed; + top: 40px; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + background-color: rgba(0, 0, 0, .15) +} + +.gw-apps-management .gw-apps-management--close { + position: absolute; + right: 24px; + top: 17px; + width: 22px; + height: 22px; + cursor: pointer +} + +.gw-apps-management .gw-apps-management--close .f-icon { + font-size: 22px; + color: rgba(0, 0, 0, .06) +} + +.gw-apps-management .gw-apps-management--close:hover .f-icon { + color: rgba(0, 0, 0, .25) +} + +.gw-apps-management--header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + padding: 10px 56px 10px 21px +} + +.gw-apps-management--header .header--caption { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-apps-management--header .header--caption .header--caption-logo { + padding-right: 11px +} + +.gw-apps-management--header .header--caption .header--caption-logo img { + display: block; + width: 30px; + height: 30px +} + +.gw-apps-management--header .header--caption .header--caption-title { + font-size: 18px; + color: #000 +} + +.gw-apps-management--header .header--search { + position: relative; + max-width: 508px; + height: 36px; + padding: 0 14px 0 34px; + margin: 0 auto; + border-radius: 18px +} + +.gw-apps-management--header .header--search .search--input { + display: block; + height: 34px; + border: 0; + box-shadow: none; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.gw-apps-management--header .header--search .search--append { + position: absolute; + left: 14px; + top: 0 +} + +.gw-apps-management--header .header--search .search--append .f-icon { + display: block; + height: 34px; + line-height: 34px; + font-size: 18px +} + +.gw-apps-management--header .header--search .search--placeholder { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + position: absolute; + left: -1px; + top: -1px; + width: calc(100% + 2px); + height: 36px; + line-height: 36px; + border-radius: 18px +} + +.gw-apps-management--header .header--search .search--placeholder .f-icon { + display: block; + margin-right: 14px; + color: #979797 +} + +.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text { + font-size: 14px; + color: rgba(0, 0, 0, .25) +} + +.gw-apps-management--header .header--search .search--result-panel { + position: absolute; + top: 40px; + left: 0; + right: 0; + padding: 10px 18px 0; + background: #FFF; + border: 1px solid rgba(56, 138, 255, .2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + z-index: 100; + max-height: 310px; + overflow-y: auto +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-title { + font-size: 13px; + color: rgba(0, 0, 0, .6) +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list { + margin: 8px -18px +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + list-style: none; + height: 30px; + line-height: 30px; + padding: 0 18px; + cursor: pointer +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name { + display: flex; + flex-direction: row; + align-items: center; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding-left: 16px; + font-size: 12px; + color: rgba(0, 0, 0, .45); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-more { + height: 40px; + line-height: 40px; + text-align: center; + border-top: 1px solid #ECECEC; + font-size: 12px; + color: rgba(0, 0, 0, .75); + cursor: pointer; + margin: 0 -18px +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap; + margin-top: 14px +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item { + height: 20px; + padding: 0 10px; + margin: 0 10px 14px 0; + background: rgba(219, 224, 230, .5); + border-radius: 13px; + font-size: 13px; + line-height: 20px; + color: #8A96A5; + list-style: none; + cursor: pointer +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + color: #fff; + box-shadow: 0 2px 4px 0 rgba(25, 76, 164, .09) +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match { + color: #fff +} + +.gw-apps-management--header .header--search .search--prompt-panel { + padding-bottom: 14px +} + +.gw-apps-management--header .header--view { + flex-shrink: 0; + display: flex; + flex-direction: row; + align-items: center +} + +.gw-apps-management--header .header--view .view--btn { + text-align: center; + white-space: nowrap; + vertical-align: middle; + padding: 0 10px; + line-height: 28px; + background: rgba(240, 240, 240, .6); + margin-left: -1px; + cursor: pointer +} + +.gw-apps-management--header .header--view .view--btn .view--btn-icon { + font-size: 13px; + color: rgba(0, 0, 0, .2) +} + +.gw-apps-management--header .header--view .view--btn.active { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, .06) +} + +.gw-apps-management--header .header--view .view--btn.active .view--btn-icon { + color: #fff +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, .06); + position: relative +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon { + color: #fff +} + +.gw-apps-management--header .header--view .view--btn:first-child { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.gw-apps-management--header .header--view .view--btn:last-child { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px +} + +.gw-apps-management--header .header--settings { + position: relative +} + +.gw-apps-management--header .header--settings .header--settings-icon { + display: inline-block; + height: 28px; + width: 48px; + text-align: center; + line-height: 28px; + color: #979797; + cursor: pointer +} + +.gw-apps-management--header .header--settings .header--settings-panel { + position: absolute; + background: #FFF; + border: 1px solid rgba(56, 138, 255, .2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + padding: 16px 14px; + top: 34px; + width: 162px; + right: 0; + opacity: 0; + transition: opacity .1s linear +} + +.gw-apps-management--header .header--settings .header--settings-panel.f-state-show { + opacity: 1 +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow { + width: 16px; + height: 8px; + margin: 0 2px; + position: absolute; + top: -8px; + right: 13px +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before { + content: ''; + position: absolute; + border-width: 0 .5rem .5rem; + border-color: transparent; + border-style: solid; + border-bottom-color: rgba(56, 138, 255, .2); + top: 0 +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after { + content: ''; + position: absolute; + border-color: transparent transparent #fff; + border-style: solid; + border-width: 0 .5rem .5rem; + top: 1px +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content { + font-size: 13px; + color: rgba(0, 0, 0, .8) +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item { + display: flex; + align-items: center; + justify-content: space-between +} + +.gw-apps-management--content { + overflow-y: auto; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 20px 0 20px 24px +} + +.gw-apps-management--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.search--result-item-keyboard--control { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + list-style: none; + height: 30px; + line-height: 30px; + padding: 0 18px; + cursor: pointer +} + +.launchpad-full-view { + margin-right: 16px +} + +.launchpad-full-icon { + transform: rotate(180deg) +} + +.launchpad-full { + margin-bottom: 2px; + cursor: pointer +} + +.gw-switch { + position: relative; + display: inline-block; + box-sizing: content-box; + padding: 0; + margin: 0; + cursor: pointer; + transition: .3s ease-out all; + -webkit-transition: .3s ease-out all; + white-space: nowrap; + min-width: 32px; + height: 18px; + border-radius: 20px; + background-color: #d9d9d9 +} + +.gw-switch.f-state-checked { + background: #49C265 +} + +.gw-switch.f-state-checked small { + right: 2px; + left: auto +} + +.gw-switch small { + left: 2px; + border-radius: 100%; + position: absolute; + top: 1px; + transition: .2s ease-out all; + -webkit-transition: .3s ease-out all; + background: #fff; + width: 16px; + height: 16px; + font-size: 80% +} + +.f-component-walk-page.active { + display: block +} + +.f-component-walk-page .f-page-walker-detail-wrapper { + position: absolute; + z-index: 333333 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-img { + background: 0 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content { + position: absolute +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-right { + left: calc(100% + 6px); + top: -13px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-left { + right: calc(100% + 6px); + top: -13px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom, +.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom { + top: calc(100% + 6px); + left: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-top { + bottom: calc(100% + 6px); + left: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow { + position: absolute; + display: block; + width: 12px; + height: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default { + box-shadow: 0 3px 10px 0 rgba(0, 0, 0, .15); + border-radius: 2px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top { + margin-bottom: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow { + bottom: -12px; + left: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { + border-width: 10px 8px 0; + bottom: 2px; + border-top-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right { + margin-left: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow { + left: -12px; + top: 28px; + width: 12px; + height: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { + border-width: 8px 10px 8px 0; + left: 2px; + border-right-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom { + margin-top: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow { + top: -12px; + left: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px; + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left { + margin-right: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow { + top: 28px; + right: -12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { + border-width: 8px 0 8px 10px; + right: 2px; + border-left-color: #fff +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom { + margin-top: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow { + top: -12px; + right: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px; + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default { + box-shadow: 0 2px 10px 0 rgba(38, 40, 56, .23) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner { + position: relative; + display: flex; + flex-direction: column; + min-width: 419px; + min-height: 165px; + padding: 24px 12px; + background-color: #fff; + border-radius: 3px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content { + position: relative; + min-height: 60px; + padding-left: 74px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img { + position: absolute; + left: 0; + top: 0; + width: 60px; + height: 60px; + border-radius: 3px; + overflow: hidden +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img { + display: block; + width: 60px; + height: 60px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title { + display: flex; + flex-direction: row; + align-items: center +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number { + flex-shrink: 0; + padding-right: 6px; + font-size: 12px; + color: rgba(0, 0, 0, .85) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current { + font-size: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text { + font-size: 16px; + color: rgba(0, 0, 0, .85); + font-weight: 600; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + margin-top: 6px; + font-size: 13px; + min-height: 44px; + color: rgba(0, 0, 0, .65); + line-height: 22px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns { + display: flex; + flex-direction: row; + align-items: center; + padding-top: 17px; + padding-right: 10px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn { + flex-grow: 1; + flex-shrink: 0; + flex-basis: 0; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn { + margin-right: 6px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child { + margin-right: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close { + position: absolute; + right: 10px; + top: 10px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + cursor: pointer +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon { + font-size: 18px; + color: rgba(0, 0, 0, .45) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon { + color: rgba(0, 0, 0, .85) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip { + display: flex; + flex-direction: row; + align-items: center; + padding-left: 74px; + background-color: #fff +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn { + color: rgba(0, 0, 0, .35) +} + +.user-setting { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0 +} + +.user-setting-list { + width: 286px; + min-width: 286px; + background-color: #fff; + overflow-y: auto; + overflow-x: hidden +} + +.user-setting-list .user-setting-message { + padding-bottom: 32px; + padding-top: 32px +} + +.user-setting-list .user-setting-message .user-avatar { + width: 86px; + height: 86px; + margin: 0 auto 18px; + position: relative +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-img { + display: block; + width: 86px; + height: 86px; + border-radius: 100% +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-icon { + position: absolute; + width: 86px; + height: 86px; + border-radius: 100%; + background: rgba(0, 0, 0, .3); + top: 0; + left: 0; + line-height: 86px; + text-align: center; + display: none +} + +.user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon { + display: block +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon { + font-size: 24px; + color: #fff +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex { + position: absolute; + width: 22px; + height: 22px; + line-height: 22px; + border: 1px solid #fff; + right: 0; + bottom: 0; + border-radius: 100%; + color: #fff; + text-align: center +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon { + font-size: 12px; + vertical-align: initial +} + +.user-setting-list .user-setting-message .user-title { + text-align: center +} + +.user-setting-list .user-setting-message .user-title .user-name { + font-size: 16px; + color: rgba(0, 0, 0, .75); + margin-bottom: 6px +} + +.user-setting-list .user-setting-message .user-title .user-post { + font-size: 12px; + color: rgba(0, 0, 0, .45) +} + +.user-setting-list .user-setting-menu { + padding: 24px 0; + border-top: 1px solid #f0f0f0 +} + +.user-setting-list .user-setting-menu .menu-item-inner { + width: 286px; + height: 48px; + line-height: 48px; + padding-left: 38px; + padding-right: 20px; + cursor: pointer +} + +.user-setting-list .user-setting-menu .menu-item-inner.active { + padding-left: 35px +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-title { + display: flex; + flex-direction: row; + align-items: center +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon { + margin-right: 18px +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-text { + font-size: 14px; + color: rgba(0, 0, 0, .75); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.user-setting-content { + flex-grow: 1; + padding: 0 10px 10px; + overflow-x: auto; + overflow-y: hidden +} + +.user-setting-content-inner { + height: 100%; + background: #fff; + padding: 24px; + overflow-y: auto +} + +.user-setting-content-wrapper-title { + color: #000; + display: inline-flex; + align-items: center; + line-height: 1.375rem; + position: relative; + overflow: hidden; + padding: 0 0 0 1rem; + min-width: 760px +} + +.user-setting-content-wrapper-title::before { + content: ''; + width: .25rem; + height: 1.125rem; + border-radius: 1px; + position: absolute; + top: 50%; + left: 0; + margin-top: -.5625rem +} + +.user-setting-content-wrapper-title .title-text { + font-size: 1rem; + line-height: 1.375rem; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-bottom: 0; + margin-right: 10px +} + +.user-setting-content-wrapper-title .title-line { + flex-grow: 1; + border-bottom: 1px dashed rgba(0, 0, 0, .1) +} + +.user-setting-content-wrapper-title .title-edit-btn { + font-size: 14px; + padding-left: 10px; + cursor: pointer +} + +.user-setting-content-wrapper-title .title-edit-btn .f-icon { + font-size: 14px; + margin-right: 4px; + vertical-align: inherit +} + +.user-setting-content-wrapper-main { + padding: 27px 0 32px +} + +.user-setting-content-wrapper-main .user-setting-form { + padding-left: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap { + max-width: 25rem; + display: flex; + flex-grow: 0; + flex-shrink: 0; + flex-basis: auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: .875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns { + margin-bottom: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label { + display: flex; + align-items: center; + width: 6rem; + flex-shrink: 0; + margin-right: .75rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + justify-content: flex-end; + flex-direction: row; + align-self: start; + height: 1.875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap { + flex-grow: 1; + flex-shrink: 1; + flex-basis: auto +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip { + font-size: 14px; + color: rgba(0, 0, 0, .45); + margin-top: 10px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control { + height: 28px !important +} + +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control, +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group { + border: 1px solid transparent; + border-bottom-color: #ececec +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn { + margin-left: 10px; + padding-top: 4px; + padding-bottom: 4px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child { + margin-left: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link { + color: rgba(0, 0, 0, .75) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size { + display: flex; + flex-direction: row +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list { + margin-right: 40px; + position: relative; + cursor: pointer +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child { + margin-right: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { + width: 50px; + height: 50px; + border-radius: 100% +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img { + background-color: rgba(217, 38, 44, .9) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img { + background-color: rgba(0, 192, 222, .9) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name { + font-size: 14px; + color: rgba(0, 0, 0, .65); + margin-top: 14px; + text-align: center +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + content: ''; + position: absolute; + width: 58px; + height: 58px; + background: 0 0; + left: -4px; + top: -4px; + border-radius: 100% +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { + position: absolute; + right: -1px; + top: 35px; + border-radius: 100%; + background-color: #fff; + display: none +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon { + display: block; + width: 16px; + height: 16px; + vertical-align: inherit; + border-radius: 100%; + border: 1px solid #fff; + font-size: 14px; + overflow: hidden +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check { + display: block +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img { + width: 64px; + height: 52px; + overflow: hidden +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + width: 72px; + height: 60px; + border-radius: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { + right: -10px; + top: 45px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color { + margin-bottom: 44px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label { + height: 50px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label { + height: 60px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto { + min-width: 43.875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap { + display: flex; + flex-direction: row +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list { + flex: 1; + padding-right: 10px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child { + padding-right: 0 +} + +.dialog-user-avatar-tips { + padding: 0 24px 14px; + margin-top: 12px; + font-size: 12px; + color: rgba(0, 0, 0, .45) +} + +.dialog-user-avatar { + padding: 24px 32px 0 24px; + display: flex; + flex-direction: row +} + +.dialog-user-avatar-change { + padding-right: 36px; + border-right: 1px solid #EFEFEF +} + +.dialog-user-avatar-view { + padding-left: 36px +} + +.dialog-user-avatar-view .avatar-view-title { + font-size: 14px; + color: rgba(0, 0, 0, .75); + text-align: center; + margin-bottom: 15px +} + +.dialog-user-avatar-view .avatar-view-size { + margin-bottom: 32px +} + +.dialog-user-avatar-view .avatar-view-size:last-child { + margin-bottom: 0 +} + +.dialog-user-avatar-view .avatar-view-size .img { + display: block; + width: 100px; + height: 100px; + border-radius: 100%; + overflow: hidden; + margin: 0 auto; + border: 1px solid #EFEFEF +} + +.dialog-user-avatar-view .avatar-view-size .avatar-view-size-text { + font-size: 12px; + color: rgba(0, 0, 0, .45); + display: block; + text-align: center; + margin-top: 10px +} + +.mode-active, +.searce .select-show-mode .show-mode-active, +.subcount-info:hover { + color: #0AABAB !important +} + +.dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img { + width: 50px; + height: 50px +} + +.isdisplay { + display: none +} + +.themesdefault { + background-color: #00ACB8 +} + +.themesdefault:hover { + background-color: #86E5E1 +} + +.gw-header { + background: linear-gradient(207deg, #13C2C2 0, #09B7B7 100%) +} + +.gw-header .gw-header--exitfullscreen-wrapper { + border-top: 1px solid #0AABAB +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + background: url(../../../img/orishow-green.svg) no-repeat +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover { + background-image: url(../../../img/passshow-green.svg) no-repeat +} + +.gw-header--application-icon-container.f-state-active, +.gw-header--application-icon-container:hover { + background: linear-gradient(269deg, #0099A6 0, #00A8B6 50%, #0099A6 100%) +} + +.gw-header-toolbar--content:hover { + background-color: #00B4C0 +} + +.gw-apps-management--tabs-container .tabs-container--item.active { + background-image: linear-gradient(225deg, #13C2C2 0, #0AABAB 100%) +} + +.tabs-container--vertical .list-group .list-group-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #08B6B6 26%, #0AABAB 67%, rgba(9, 113, 255, .13) 95%) !important +} + +.tabs-container--vertical .list-group .list-group-item.active, +.tabs-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(243deg, #EFF8F8 0, #EFF8F8 26%, #EFF8F8 67%, #EFF8F8 95%) !important +} + +.keyApplication .group .module--list .module--list-item::after { + background-image: linear-gradient(90deg, #ECECEC 0, #0CBABA 50%, #A3EDEB 100%) +} + +.keyApplication .group .module--list .module--list-item:hover { + color: #00ACB8 +} + +.listview--nav-horizontal .active .keyApplicationName { + background-color: #00ACB8 +} + +.menu-submenu--title .menu-item--icon .gw-icon, +.tileview--menu-item .menu-item--icon img { + color: #09ABAB +} + +.menu-submenu--title-selected { + color: #00ACB8 !important +} + +.menu-submenu--title:hover, +.menu-submenu--title:hover .menu-item--text, +.tileview--menu-item:hover, +.tileview--menu-item:hover .menu-item--text { + color: #00ACB8 +} + +.tileview--menu-item-selected { + color: #00B4C0; + background: #E9F2F2 +} + +.tileview--menu .menu-list-item--arrow, +.tileview--menu-item-selected .menu-item--text { + color: #00B4C0 +} + +.application-list--header-title--icon .header-title--icon-item { + background: rgba(9, 183, 183, .9) +} + +.application-list--header-title--icon .header-title--icon-item-right { + background: rgba(13, 187, 187, .5) +} + +.application-wrapper--list-item::after { + background-image: linear-gradient(90deg, #ECECEC 0, #0CBABA 50%, #A3EDEB 100%) +} + +.application-wrapper--list-item:hover .application-wrapper--list-item-text { + color: #00ACB8 +} + +.tileview--menu-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #08B6B6 26%, #0AABAB 67%, rgba(9, 113, 255, .13) 95%) +} + +.keyApplication-header-wrapper .module-head .module-header--icon { + color: #09ABAB +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon { + background: rgba(9, 183, 183, .9) +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + background: rgba(13, 187, 187, .5) +} + +.tileview--menu-image { + -webkit-filter: drop-shadow(#00ACB8 20px 0); + filter: drop-shadow(#00ACB8 20px 0) +} + +.notactive { + color: #596580 !important +} + +.down-arrow.active::after { + border-color: #00ACB8 +} + +.detail-content--item-content, +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { + border-top: 1px solid #F5F8F9 +} + +.tabset--nav-container { + background: #EBEEF4 +} + +.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon { + background-image: url(../../../launcher/home-icon-selected-green.svg) +} + +.tabset--nav-container .nav .tabset--nav-link { + color: #596580; + font-size: 13px; + padding: 0 10px 0 16px; + height: 36px; + line-height: 36px +} + +.tabset--nav-container .nav .tabset--nav-link:hover { + background: #E1E5EE +} + +.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close { + color: #666 +} + +.tabset--nav-container .nav .tabset--nav-link.active { + color: #3E4A65; + background: #F8F9FB +} + +.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close { + color: #666 +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #08B6B6 26%, #0AABAB 67%, rgba(9, 113, 255, .13) 95%) +} + +.detail-content--item:hover { + background-color: #F5F8F9 +} + +.curtenant, +.setdefault:hover { + background: #00B4C0 +} + +.curtenant { + color: #fff +} + +.curtenant-font-color { + color: #00ACB8 !important +} + +.gw-navbar-user-dropdown.active, +.gw-navbar-user-dropdown:hover { + background-color: #00B4C0 +} + +.gw-navbar-user-info-content-list-item.item-setting-list:hover { + color: #00ACB8; + background-color: #F5F8F9 +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background, +.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { + background-image: url(../../../img/tenant_change-green.svg) +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { + border: 1px solid #F5F8F9 +} + +.gw-single-app-wrapper:hover, +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { + -o-border-image: linear-gradient(135deg, #6AD4DA, #A3EDEB) 30 30; + border-image: linear-gradient(135deg, #6AD4DA, #A3EDEB) 30 30 +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { + background-color: #EFF8F8 +} + +.menu-search-wrapper .menu-search--search { + background: #00B4C0 +} + +.menu-colllection-wrapper .menu-colllection--detail-item:hover { + background: #F5F8F9 +} + +.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title { + color: #00ACB8 +} + +.menu-colllection-wrapper.show .menu-colllection--item { + background-color: #00B4C0 +} + +.gw-app-group.f-state-active .gw-app-group--header .header--icon { + color: #09ABAB +} + +.gw-apps-management--header .header--search { + background: #F5F8F9; + border: 1px solid #F5F8F9 +} + +.gw-apps-management--header .header--search .search--input { + background: #F5F8F9 +} + +.gw-apps-management--header .header--search .search--append .f-icon { + color: #0CBABA +} + +.gw-apps-management--header .header--search.f-state-focuse, +.gw-apps-management--header .header--search:hover { + border: 1px solid #86E5E1 +} + +.gw-apps-management--header .header--search .search--placeholder { + background: #F5F8F9; + border: 1px solid #F5F8F9 +} + +.gw-apps-management--header .header--search .search--result-panel .match { + color: #00B4C0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check, +.user-setting-content-wrapper-title .title-edit-btn, +.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon, +.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text { + color: #0CBABA +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover { + background: #F5F8F9 +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + background-image: linear-gradient(215deg, #1C7CEA 0, #00ACB8 100%) +} + +.gw-apps-management--header .header--view .view--btn.active, +.gw-apps-management--header .header--view .view--btn:hover:not(.active) { + background-image: linear-gradient(225deg, #13C2C2 0, #0AABAB 100%) +} + +.search--result-item-keyboard--control { + background: #F5F8F9 +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex { + background-color: #86E5E1 +} + +.user-setting-list .user-setting-menu .menu-item-inner.active { + border-left: 3px solid #0CBABA +} + +.user-setting-content-wrapper-title::before { + background: #86E5E1 +} + +.user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before { + background-color: #50BA77 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { + background-color: #0CBABA +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + border: 1px solid rgba(13, 187, 187, .5) +} + +.user-setting-list .user-setting-menu .menu-item-inner.active, +.user-setting-list .user-setting-menu .menu-item-inner:hover { + background-color: #F5F8F9 +} + +.tabset--nav-container .nav { + height: 36px +} + +.tabset--nav-container .nav .nav-link-close { + margin: 0 0 0 14px +} diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/red/gsp-cloud-web.min.css b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/red/gsp-cloud-web.min.css index 8e661826af61682983e2ec6d52c22bd017dd2224..b5f0ed15037f8c1953d2dc21ba66859cc11fa86a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/red/gsp-cloud-web.min.css +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/framework/themes/red/gsp-cloud-web.min.css @@ -1 +1,5042 @@ -@charset "UTF-8";.g-main,.gw-page-wrapper{top:0;right:0;position:absolute;left:0;bottom:0}.g-main{margin:0 auto;font-size:.875rem}.font-size-13{font-size:.8125rem!important}.font-size-14{font-size:.875rem!important}.font-size-normal{font-size:1rem!important}.font-size-middle{font-size:1.5rem!important}.font-size-lg{font-size:3rem!important}.flex-auto{flex-grow:1;flex-shrink:1;flex-basis:auto}.g-pointer{cursor:pointer}.gw-page-wrapper{overflow:hidden;display:flex;flex-direction:column}.login-section,.subcount-info,.themesdefault,.themesgreen,.themesred,.wrapper-content{position:relative}.gw-page-header>.row{overflow:hidden}.wrapper-content{margin:0}.themestitle{display:inline-block;margin-left:35px;text-align:center;font-family:PingFangSC-Light;font-size:14px;color:rgba(0,0,0,.85)}.themesheader{margin-left:25px;margin-bottom:25px;font-family:PingFangSC-Regular;font-size:16px;color:rgba(0,0,0,.85)}.module-title2,.themesd{margin-bottom:10px}.themesd{display:inline-block;vertical-align:middle;margin-top:-20px}.themesdefault,.themesdefault:hover,.themesgreen,.themesgreen:hover,.themesred,.themesred:hover{height:50px;border-radius:5px;cursor:pointer;margin-top:5px;width:50px}.themesred{background-color:#D9262C}.themesred:hover{background-color:#DF464B}.themesgreen{background-color:#00C0DE}.themesgreen:hover{background-color:#30CFE8}.themebanIn,.themebanOut{height:50px;border-radius:5px;opacity:.25;margin-top:-40px;cursor:pointer}.themesinimg{padding-left:17px;padding-top:19px;display:flex}.themesoutimg{padding-left:17px;padding-top:19px;display:none}.themessize{display:flex;padding-left:7px;padding-top:10px}.themebanIn{background:#000;width:50px}.themebanOut{background:#000;width:50px;display:none}.themesizeIn{margin-top:-52px;position:absolute}.applicationhome{border-right:1px solid rgba(255,255,255,.3)!important;padding-right:13px!important}.collection-10,.collection-100,.collection-max{border-radius:9px;background:red;font-size:12px!important;text-align:center;color:rgba(255,255,255,.9);line-height:18px!important;padding:0 6px!important;font-family:arial,sans-serif}.gw-header--caption{margin:0 0 0 20px}.gw-header--caption-img{display:block;max-height:38px}.collection-10,.collection-100,.collection-max,.subcount-info{display:inline-block}.collection-10{margin:2px -5px}.collection-100{margin:2px -11px}.collection-max{margin:2px -13px}.subcount-info{color:rgba(0,0,0,.25)!important;padding:0 7px;cursor:pointer;line-height:28px!important}.subcount-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.subcount-info .material-icons{display:block}#search:-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-moz-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}#search::-webkit-input-placeholder{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.25);letter-spacing:0;line-height:20px;align-items:center}app-login-container{background:#fff;position:absolute;top:0;left:0;bottom:0;right:0;overflow:auto}.login-logo{width:26.69rem;height:18rem;overflow:hidden;margin-right:4.5rem;background:url(../../../img/login-logo@2x.png) no-repeat;background-size:427px 288px}.login-logo h1{font-family:PingFangSC,'Segoe UI','microsoft yahei',sans-serif;font-size:1.625rem;line-height:2.5rem;padding:9.5rem 0 0 5rem;color:#666560;margin:0}.login-logo .logo-en{font-size:1.375rem}.login-section{width:24.31rem;padding-left:2.56rem;float:left}.login-section h2{font-size:1.75rem;color:#333;margin:.25rem 0 1.31rem}.login-form .custom-select,.login-form .form-control{margin:0 0 1.13rem;line-height:26px;border-radius:.25rem;padding-top:.3125rem;padding-bottom:.3125rem;height:32px}.btn-login{background:#24abe9;color:#fff;height:3.25rem;font-size:1rem}.btn-regist{padding:1.25rem 0 0;font-size:.875rem}.btn-regist a{border-bottom:1px solid #24abe9;color:#24abe9;padding:0 0 .125rem}.btn-regist a:hover{text-decoration:none}.remember-info{padding:0 0 0 1.25rem}.login-lg{display:inline-block;width:1.88rem;height:1.31rem;background:url(../../../img/language@2x.png) no-repeat;background-size:30px auto}.lg-en{background-position:0 0}.lg-zh-cn{background-position:0 -24px}.login-lg-text{color:#373d41}.auth-form-container{padding:6.56rem 0 0}.login-lg-area{position:absolute;top:-5rem;right:-65%}.login-lg-dropdown .btn:active,.login-lg-dropdown .btn:focus{outline:0}.login-lg-dropdown .dropdown-menu{right:0;left:auto}.login-log-container{flex-direction:row-reverse!important}@media (max-width:1200px){.login-lg-area{right:0}}@media (max-width:992px){.login-logo{margin:0 auto}.login-section{width:90%;padding:0 0 0 10%;margin:0 auto}}@media (max-width:768px){.login-log-container{flex-direction:row!important}}@media (max-width:576px){.login-lg-area{right:0;top:.5rem}.auth-form-container{padding:1rem 0 0}.login-section{padding:0;float:none;border-left:none}}.gw-header-toolbar .material-icons{font-size:22px}.gw-header-toolbar .count-info{color:rgba(255,255,255,.65)!important;position:relative;display:block;padding:9px 11px;cursor:pointer}.gw-header-toolbar .count-info:hover{color:#fff!important}.gw-header-toolbar .count-info .label{line-height:14px;padding:0 4px;position:absolute;right:2px;top:1px;font-size:.625rem}.gw-header-toolbar .count-info .material-icons{display:block}.gw-userinfo-menu .leftMenu{left:-100px!important}.gw-userinfo .user-profile{outline:#000;text-align:left;color:#000;border:1px solid #000;margin:20px;width:700px;padding:10px}.gw-userinfo span.title{display:block;width:80px;height:30px;position:relative;top:-20px;text-align:center;background:#fff}.gw-header-toolbar .leftMenu a{display:block;padding:0}.gw-page-header-tabscontrol{display:none}.full-width{width:100%!important}.scrollbar-x-hidden{overflow-x:hidden}.border-none{border:0!important}.gw-header{color:#f5f5f5;padding:0;z-index:910;box-shadow:0 0 10px 0 rgba(57,66,100,.1)}.gw-header .gw-header--exitfullscreen-wrapper{position:fixed;top:0;left:0;right:0;height:12px;z-index:900}.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn{display:block}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{display:none;cursor:pointer!important;height:18px;width:120px;margin:0 auto;position:relative;z-index:2000}.gw-header--toast{background:#333;opacity:.9;color:#FFF;line-height:43px;text-align:center;border-radius:4px;height:46px;width:256px;margin:46px auto;display:none}.gw-header--toast-show{display:block;-webkit-animation-name:exitFullScreenToastFadeInDown;animation-name:exitFullScreenToastFadeInDown;-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;position:fixed;left:50%;margin-left:-128px}@-webkit-keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}@keyframes exitFullScreenToastFadeInDown{0%,to{opacity:0;transform:translate3d(0,-100%,0)}50%{opacity:1;transform:translateZ(0)}}.gw-header--wrapper{display:flex;flex-direction:row;align-items:center}.gw-header--application-icon-container .application-icon-active,.gw-header--application-icon-container.f-state-active::after,.gw-header--application-icon-container:hover::after{display:none}.gw-header--application-icon-container{position:relative;width:55px;height:40px;color:#fff;text-align:center;cursor:pointer}.gw-header--application-icon-container::after{position:absolute;content:'';width:1px;height:16px;right:0;top:50%;margin-top:-8px;background-color:rgba(255,255,255,.3)}.gw-header--application-icon-container .f-icon{font-size:1rem;line-height:38px}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{color:#fff}.gw-header--application-icon-container.f-state-active .application-icon-active,.gw-header--application-icon-container:hover .application-icon-active{display:inline-block}.gw-header--application-icon-container.f-state-active .application-icon,.gw-header--application-icon-container:hover .application-icon{display:none}.gw-header-toolbar--list{display:flex;align-items:center}.gw-header-toolbar--content{display:block;height:40px;padding:0 11px;line-height:40px;cursor:pointer}.gw-apps-management-wrapper{background:#fff;min-width:600px;height:100%;display:flex;flex-direction:column;margin:0 70px 0 0;position:relative}.gw-apps-management-wrapper .header{padding:11px 0 17px 20px;height:56px}.gw-apps-management-wrapper .header .intro{font-weight:700;font-family:PingFangSC-Medium;font-size:18px;color:#333;text-align:left;display:inline-block}.gw-apps-management-wrapper .header .searce{float:right;margin-right:21px;position:relative;top:0;height:28px}.gw-apps-management-wrapper .header .searce .searce-img1{width:14px;position:relative;right:8px;top:7px;cursor:pointer;float:left}.gw-apps-management-wrapper .header .searce .setup-img{position:relative;top:-1px;margin-left:9px}.last-app-group>.app-group{min-height:calc(100vh - 171px);margin-bottom:25px!important}.searce .select-show-mode{display:inline-block;margin:0 -2px 0 -3px}.searce .select-show-mode .show-mode{display:inline-block;width:30px;height:26px;background:#eaeaea;position:relative;top:8px;cursor:pointer}.searce .select-show-mode .show-mode img{width:14px;height:14px;position:relative;top:6px;left:8px}.searce .select-show-mode .show-mode .default-img{display:block}.searce .select-show-mode .show-mode .hover-img,.searce .select-show-mode .show-mode .selected-img,.searce .select-show-mode .show-mode:hover .default-img,.searce .select-show-mode .show-mode:hover .selected-img{display:none}.searce .select-show-mode .magnetic-sticker-mode{border-top-left-radius:2px;border-bottom-left-radius:2px;margin-left:15px;position:relative;left:4px}.searce .select-show-mode .all-app-mode{border-top-right-radius:2px;border-bottom-right-radius:2px;position:relative;left:-4px}.searce .select-show-mode .show-mode:hover .hover-img{display:block}.searce .select-show-mode .show-mode-active .default-img{display:none}.searce .select-show-mode .show-mode-active .selected-img{display:block}.gw-apps-management--tabs-container{display:flex;width:100%;position:relative;padding:9px 0 9px 19px;border-bottom:1px solid rgba(0,0,0,.06)}.gw-apps-management--tabs-container .tabs-container--horizontal{flex-wrap:nowrap;overflow:hidden;margin:0;cursor:pointer}.gw-apps-management--tabs-container .tabs-container--horizontal-length{margin-right:65px}.gw-apps-management--tabs-container .tabs-container--item{margin-top:1px;flex-grow:1;flex-basis:auto;position:relative;margin-right:2px;height:30px;line-height:30px;flex-shrink:0;cursor:pointer;list-style:none;border-radius:15px;padding:0 19px;color:#333}.gw-apps-management--tabs-container .tabs-container--item.active{color:#fff;box-shadow:0 4px 4px 0 rgba(25,76,164,.09)}.listview---nav-vertical,.tabs-container--vertical{box-shadow:0 0 6px 0 rgba(139,139,139,.27);z-index:1000}.tabs-container--vertical-smallscreen{height:calc(100vh - 200px)!important}.tabs-container--vertical{display:none;width:247px;height:556px;background:#fff;overflow:auto}.tabs-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabs-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabs-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabs-container--vertical.show{display:flex;position:absolute;right:25px;top:51px}.tabs-container--vertical .list-group{flex:auto}.tabs-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;cursor:pointer}.tabs-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.searce .searce-input,.set-up,.tips{position:relative}.set-up,.set-up img{width:14px;height:14px}.tabs-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabs-container--vertical .list-group .list-group-item:first-child{border-radius:0}.set-up{cursor:pointer;float:right;right:0;top:15px;margin-left:16px}.set-up .set-up-img{display:block}.set-up .set-up-img-down,.set-up .set-up-img-hover,.set-up:hover .set-up-img{display:none}.set-up:hover .set-up-img-hover{display:block}.setUpMousedown .set-up-img,.setUpMousedown .set-up-img-hover{display:none!important}.setUpMousedown .set-up-img-down{display:block!important}.searce .searce-input{border:none;outline:0;background:#fff;border-radius:20px;width:200px;height:28px;padding-left:12px;padding-right:30px;right:-20px;float:left;top:0}.searce input::-webkit-input-placeholder{font-size:12px;color:#999;text-align:left}.searce input::-ms-input-placeholder{font-size:12px;color:#999;text-align:left}gsp-list-index{background-color:#fff}.tips{display:inline-block;width:0;margin:0 -2px}.tips .tips-content{position:absolute;top:-11px;z-index:2;display:none;width:68px;height:28px;background-color:#5a676f;border-radius:2px;text-align:center;line-height:28px;font-size:12px;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tips .magnetic-sticker-mode-tips{left:-47px}.tips .list-mode-tips{left:-51px}.tips .all-app-mode-tips{left:-55px}.select-show-mode:hover .tips-content{display:block!important}.keyApplication1,.keyApplication2,.keyApplication3,.module{display:none}.international-nav-container .nav a{padding:0 19px;margin-right:2px}.last-app-group /deep/ .app-group .content{min-height:calc(100vh - 235px)}.last-app-group .last-app-group-height{min-height:calc(100vh - 165px)}.search-fra{background:#FFF!important;border:1px solid #E0E0E0!important;border-radius:4px!important}.search-fra:focus{background:#FFF!important;border:1px solid #0068F3!important;border-radius:4px!important}input::-webkit-calendar-picker-indicator{display:none}.tabs-container--dropdown{position:absolute;right:0;top:7px;width:52px;height:36px;background:#fff;box-shadow:-1px 0 1px 0 rgba(0,0,0,.12);cursor:pointer}.tabs-container--dropdown .f-icon{width:36px;height:36px;line-height:36px;text-align:center;font-size:18px;color:rgba(0,0,0,.5)}.tabs-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.module{height:calc(100vh - 246px)}.keyApplication,.keyApplication-header-wrapper{padding:0 24px}.keyApplication .module,.keyApplication-header-wrapper .module-head .module-header--content{margin-right:54px}.keyApplication-header-wrapper .module-head{flex-shrink:0}.keyApplication-header-wrapper .module-head .module-header--icon{width:20px;height:20px;margin-right:10px}.keyApplication{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0;width:100%;align-content:flex-start;align-items:flex-start;overflow:auto}.keyApplication .keyApplication::-webkit-scrollbar{width:7px!important;height:7px!important;background-color:#8e8e8e}.keyApplication .module{position:relative;display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-start;align-items:flex-start;flex-grow:1;flex-shrink:1;flex-basis:0}.keyApplication .module .module-title{position:absolute;top:-33px;width:100%;height:31px;border-bottom:1px solid #d2deea;font-size:16px;color:#333}.keyApplication .group{width:200px;margin-bottom:5px;margin-top:14px}.keyApplication .group .group-title{font-size:14px;color:#999;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;padding-bottom:14px}.keyApplication .group .group-title .group-title--icon-container{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{margin-left:4px}.keyApplication .group .group-title .group-title--text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px;color:rgba(0,0,0,.65)}.keyApplication .group .module--list{padding-left:0;margin-bottom:0}.keyApplication .group .module--list .module--list-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;list-style:none;font-size:14px;padding:5px 33px 5px 10px;margin-right:24px;position:relative;color:rgba(0,0,0,.85)}.keyApplication .group .module--list .module--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.keyApplication .group .module--list .module--list-item:hover{cursor:pointer;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.keyApplication .group .module--list .module--list-item:hover::after{opacity:1}.keyApplication .group .module--list .module--list-item:hover .module--list-collect{display:block}.keyApplication .group .module--list .module--list-text{font-size:14px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.keyApplication .group .module--list .module--list-collect{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;text-align:center;cursor:pointer;color:#FFC43B}.keyApplication .group .module--list.f-state-collected .module--list-collect,.listview--nav-horizontal .active .tab-img{display:block}.keyApplication .group .module--list .module--list-collect .f-icon{font-size:15px;line-height:20px}.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before{content:'\e303'}.keyApplication-active{display:flex}.keyApplication-background-show-right{background-image:url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg);background-position:97% 92%;background-repeat:no-repeat}.listview--nav-horizontal{overflow:hidden;padding-left:24px;padding-right:24px;height:52px;width:100%;background-color:#fff;position:relative;top:-8px;border-bottom:2px solid #ebebeb;margin-bottom:12px;flex-wrap:nowrap;display:flex}.listview--nav-horizontal .listview--nav-link{display:inline-block;height:14px;margin-right:16px;text-decoration:none}.listview--nav-horizontal .listview--nav-link .keyApplicationName{font-size:16px;color:grey;text-align:center;padding:0 17px 0 20px;height:40px;line-height:40px;margin-left:5px;margin-right:5px;position:relative;top:11px;border-top-left-radius:2px;white-space:nowrap}.listview--nav-horizontal .active .keyApplicationName{color:#fff}.listview--nav-horizontal .tab-img{float:right;height:40px;position:relative;top:-45px;left:3px;display:none}.imgyinying{background:url(../../../img/矩形@2x.png);width:8px}.out-keyApplication{overflow:hidden;display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;flex-basis:0}.out-keyApplication .module-head{position:relative}.out-keyApplication .module-head .module-header--content{display:flex;flex-direction:row;align-items:center;padding:10px 0;border-bottom:1px solid #e5e5e5}.out-keyApplication .module-head .module-title-img{display:block;width:16px;height:16px;margin-right:10px}.out-keyApplication .module-head .module-title{width:200px;font-size:15px;color:rgba(0,0,0,.85);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:0}.international-nav .nav-a .keyApplicationName{font-size:14px;padding:0 18px 0 20px}.international-content .keyApplication .module-head .module-title{font-size:14px;position:relative;top:2px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.international-content .keyApplication .group{width:auto;padding-right:10px}.international-content .keyApplication .group .group-title{max-width:240px}.international-content .keyApplication .module .module--list-item{font-size:12px;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.listview--nav-container{display:flex;width:100%;position:relative;padding-right:22px;overflow:auto}.listview--nav-container .nav{flex-wrap:nowrap;overflow:hidden}.listview---nav-vertical{display:none;width:247px;height:556px;background:#fff}.listview---nav-vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.listview---nav-vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.listview---nav-vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.listview---nav-vertical.show{display:flex;position:absolute;right:25px;top:45px}.listview---nav-vertical .list-group{flex:auto}.listview---nav-vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px}.listview---nav-vertical .list-group .list-group-item.active,.listview---nav-vertical .list-group .list-group-item:hover{background:#ddecff}.listview---nav-vertical .list-group .list-group-item:first-child{border-radius:0}.jianyin{width:30px;height:30px;background-color:#f6f6f6;background:linear-gradient(to bottom,#fff,#f6f6f6);position:absolute;right:52px;opacity:0}.btn-nav-all-dropdown,.btn-nav-all-dropdown2{padding:2px 1px 1px;background-color:#f6f6f6;line-height:1}.btn-nav-all-dropdown{flex:none;height:30px;position:absolute;right:20px;top:10px}.btn-nav-all-dropdown .active,.btn-nav-all-dropdown2 .active{top:4px}.btn-nav-all-dropdown:focus{box-shadow:none}.double-slash{font-family:PingFangSC-Regular;font-size:14px!important;color:#0F4D9E!important;line-height:14px;background:-30px center no-repeat #F9F9F9;border-radius:2px;height:26px;background-size:50% 50%;display:flex;align-items:center;padding-left:33px}.gw-apps-management--listview,.gw-apps-management--listview .listview--keyapp-list{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column;overflow:hidden}.gw-apps-management--tileview{display:flex;flex-direction:row;flex-wrap:nowrap;border-top:1px solid rgba(0,0,0,.06);flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden}.gw-apps-management--tileview .tileview--nav{width:230px;background:rgba(247,249,250,.8);border-right:1px solid rgba(0,0,0,.06);overflow-y:auto}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--content{flex-grow:1;flex-shrink:1;flex-basis:0;padding:0 0 24px 30px;background:#fff;overflow-y:auto}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-apps-management--tileview .tileview--app-wrapper{padding:0;margin:.875rem 1rem 0 0}.tileview--menu-item-height-default{height:37px}.menu-submenu--title-height-default{height:45px}.menu-submenu--title,.tileview--menu-item{padding:0 0 0 63px;position:relative;cursor:pointer}.menu-submenu--title .menu-item--icon,.tileview--menu-item .menu-item--icon{position:absolute;top:12px;left:29px;line-height:21px;overflow:hidden}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{font-size:16px}.menu-submenu--title .menu-item--right{display:none;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--right-selected{display:none!important;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title .menu-item--text-length,.tileview--menu-item .menu-item--text-length{white-space:nowrap;overflow:hidden;width:127px;text-overflow:ellipsis}.menu-submenu--title .menu-item--text,.tileview--menu-item .menu-item--text{display:block;line-height:21px;font-size:15px;color:rgba(0,0,0,.85)}.menu-submenu--title .menu-item--text{padding:.75rem 0}.tileview--menu-item .menu-item--text{padding:.5rem 0}.menu-submenu--title:hover .menu-item--right,.tileview--menu-item:hover .menu-item--right{display:block;line-height:24px;transform:rotate(90deg);right:1.2rem;top:.95rem}.menu-submenu--title:hover .menu-item--right-selected,.tileview--menu-item:hover .menu-item--right-selected{display:block!important;line-height:24px;transform:rotate(270deg)!important;right:1.65rem;top:.95rem}.tileview--menu-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tileview--menu-item-selected::after{transform:scaleY(1)!important;opacity:1!important}.tileview--menu-top{margin-top:1px}.tileview--menu .menu-list-item--arrow{display:none;position:absolute;top:.75rem;right:1.375rem}.tileview--menu .tileview--menu-item-selected .menu-list-item--arrow{display:block}.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text{color:#000}.tileview--menu-sub{transition:all .1s linear}.tileview--menu-submenu-open .tileview--menu-sub{height:100%}.tileview--menu-image{transform:translateX(-20px)}.application-wrapper--header{padding:0 0 4px}.application-wrapper--header-title{display:flex;align-items:center;font-size:.9375rem;font-size:15px;line-height:1.3125rem;color:rgba(0,0,0,.85);margin:0;font-weight:600}.application-wrapper--header-title span{display:inline-block;vertical-align:middle}.application-list--header-title--icon{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;width:18px;height:9px;margin:0 .375rem 0 0;padding-left:3px}.application-list--header-title--icon .header-title--icon-item{display:block;width:4px;height:10px;transform:skewX(22deg);-webkit-transform:skewX(-22deg);-moz-transform:skewX(-22deg)}.application-list--header-title--icon .header-title--icon-item-right{margin-left:4px}.application-wrapper--content{padding:0 0 16px}.application-wrapper--list-title{margin-top:8px;margin-bottom:18px}.application-wrapper--list{padding:0 0 0 14px}.application-wrapper--list:after{content:"";display:block;clear:both}.application-wrapper--list-item{position:relative;width:199px;float:left;padding:5px 10px;margin:0 2px 0 0;list-style:none}.application-wrapper--list-item .application-wrapper--list-item-text{font-size:14px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-tip{padding:0 6px;white-space:nowrap;background:#FFF;border:1px solid #D6D6D6;box-shadow:0 2px 12px 0 rgba(0,0,0,.15);font-family:PingFangSC-Regular;font-size:12px;color:#313131;line-height:20px}.application-wrapper--list-item .application-wrapper--list-item-tip-top{width:12px;height:12px;transform:rotate(45deg);position:absolute;margin-top:7px;top:-1px;background:#FFF;border:1px solid #D6D6D6;border-radius:2px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame{width:12px;height:10px;overflow:hidden;position:absolute;top:-9px;left:12px}.application-wrapper--list-item .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:none;transition:all 0s linear .7s}.application-wrapper--list-item .application-wrapper--list-item-start{display:none;position:absolute;right:4px;top:5px;width:20px;height:20px;cursor:pointer}.application-wrapper--list-item .application-wrapper--list-item-start .f-icon{display:block;margin:0 auto;font-size:15px;line-height:20px;color:#FFC43B}.talk_input,.talk_show{margin:10px auto 0}.application-wrapper--list-item::after{position:absolute;content:"";left:0;right:0;bottom:0;height:1px;opacity:0}.application-wrapper--list-item:hover{display:block;box-shadow:0 2px 4px 0 rgba(3,62,125,.08)}.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border{top:38px;left:70%;position:absolute;justify-content:center;transform:translate(-50%,0);z-index:500;display:flex}.application-wrapper--list-item:hover::after{opacity:1}.talk_con{background:#f9f9f9}.talk_show{border:1px solid #666;overflow:auto;height:400px;width:auto}.atalk,.btalk{margin:10px}.whotalk{float:left;outline:0}.talk_word{padding:0;float:left;outline:0;text-indent:10px;width:350px;height:30px}.atalk span,.btalk span{display:inline-block;color:#fff;padding:5px 10px;border-radius:10px}.custom-class,.talk_sub{float:right}.talk_sub{margin-left:10px}.atalk span{background:#0181cc}.btalk{text-align:right}.btalk span{background:#ef8201}.modal-dialog{position:absolute;right:0;bottom:0;margin:0}:host{display:flex;flex-direction:column}.notactive{position:relative}.borderactive+li>a{padding-right:10px;padding-left:12px;font-family:PingFangSC-Regular;color:rgba(0,0,0,.65);border:1px solid #dae0e6!important;border-top:0!important;border-right:0!important;border-bottom:0!important;border-left:0!important;border-top-left-radius:0!important}.notinimg{visibility:hidden}.noimghover{visibility:visible}.btn-nav-all-dropdown2{flex:none;height:30px;position:absolute;right:20px}.btn-nav-all-dropdown2:focus{box-shadow:none}.down-arrow{display:inline-block;position:relative;width:28px;height:32px}.down-arrow::after{display:inline-block;content:" ";height:9px;width:9px;border-width:0 2px 2px 0;border-color:#999;border-style:solid;transform:matrix(.71,.71,-.71,.71,0,0);transform-origin:center;transition:transform .3s;position:absolute;top:50%;right:10px;margin-top:-10px}.down-arrow.active::after{transform-origin:center;transform:rotate(-135deg);transition:transform .3s}.list-group-items{height:32px;border:none;color:#333;padding-top:8px;padding-bottom:8px}.list-group-items:hover{background:#ddecff}.list-group-items.active{background:#c8e0ff}.list-group-items:first-child{border-radius:0}.tabset--nav-container{display:flex;width:100%;position:relative}.tabset--nav-container .active-bg{display:none}.tabset--nav-container .tabset--tab-content{flex-grow:1;flex-shrink:1;flex-basis:0;display:flex;flex-direction:column}.tabset--nav-container .nav{border:none}.tabset--nav-container .tabset-container--dropdown{position:absolute;height:36px;line-height:36px;border-right:1px solid #f0f0f0;color:rgba(0,0,0,.45);z-index:10;cursor:pointer;right:0;top:0;display:flex;flex-direction:row;align-items:center}.tabset--nav-container .tabset-container--dropdown .f-icon{width:34px;height:34px;line-height:34px;text-align:center;font-size:18px}.tabset--nav-container .tabset-container--dropdown.active .f-icon{transform:rotate(180deg);transition:transform .2s}.tabset--nav-container .tabset-container--vertical{display:none;width:247px;background:#fff;box-shadow:0 0 10px 0 rgba(0,0,0,.2);z-index:1000;overflow:auto}.tabset--nav-container .tabset-container--vertical .nav-link-close{font-size:14px;color:rgba(0,0,0,.15);vertical-align:inherit}.tabset--nav-container .tabset-container--vertical .nav-link-close::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before{content:"\e11d"}.tabset--nav-container .tabset-container--vertical .list-group-header{padding:14px 24px 6px;display:flex;align-items:center;justify-content:space-between}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title{font-size:16px;color:rgba(0,0,0,.95);margin:0}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper{font-size:14px;display:flex;align-items:center;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon{width:14px;height:14px;margin:0 6px 0 0;background:#d1d5db;border-radius:2px}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon{color:#fff;font-size:14px;display:block}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before{content:"\e11b"}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text{color:rgba(0,0,0,.85)}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon{background:#ff6060}.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon{background:#f94c4c}.tabset--nav-container .tabset-container--vertical.show{display:flex;position:fixed;right:1px;top:80px;bottom:1px}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.tabset--nav-container .tabset-container--vertical .list-group{flex:auto;padding-left:0;width:247px}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item{border:none;color:#333;padding-top:8px;padding-bottom:8px;display:flex;align-items:center;justify-content:space-between;cursor:pointer}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{position:absolute;content:'';left:0;right:0;bottom:0;height:1px;transform:scaleY(.0001);opacity:0;transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(144deg,#eef4ff 0,#f6fcff 100%)}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after{transform:scaleY(1);opacity:1}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child{border-radius:0}.newdh:hover .gjdh,.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps{display:none}.newdh:hover .gjdh2{display:inline}.gjdh2{display:none}.tabshow{display:inline}.tabhid,.tabset--nav-container .nav .tabset--nav-item:hover::after,.tabset--nav-container .nav .tabset--nav-item:last-child::after{display:none}.tabset--nav-container .nav{flex-wrap:nowrap;overflow:inherit;line-height:16px;text-align:center;margin-right:60px}.tabset--nav-container .nav .tabset--nav-item{flex-shrink:0;position:relative}.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before{left:3px}.tabset--nav-container .nav .tabset--nav-item::after{position:absolute;content:'';background:#CCD2E1;width:1px;right:0;z-index:100;height:14px;top:50%;margin-top:-7px;opacity:.38}.tabset--nav-container .nav .tabset--nav-link{border:none;display:flex;flex-direction:row;align-items:center}.gw-navbar-user-name::after,.menu-userinfo-wrapper .menu-userinfo--item-name::after{border-left:3px solid transparent;border-bottom:3px solid #fff;border-right:3px solid #fff}.tabset--nav-container .nav .tabset--nav-link-text{display:block;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tabset--nav-container .nav .tabset--nav-link-overlay,.tabset--nav-container .nav .tabset--nav-link-overlay-active{bottom:0;width:15px;height:15.45px;position:relative;float:left;margin-left:-14px}.tabset--nav-container .nav .tabset--nav-link-overlay{background:linear-gradient(top,rgba(255,255,255,0),#f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff , endColorstr=whitesmoke , GradientType=0}.tabset--nav-container .nav .tabset--nav-link-overlay-active{background:linear-gradient(top,rgba(255,255,255,0),#fafbfc);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0)}.tabset--nav-container .nav .nav-link-close{width:15px;height:15px;color:#d8d8d8;margin-left:24px}.tabset--nav-container .nav .nav-link-close .f-icon{vertical-align:top;font-size:12px;line-height:15px}.tabset--nav-container .nav .nav-link-close:hover{color:#f74242!important}.tabset--nav-container .nav .nav-link-close:hover .f-icon::before{font-size:15px;content:"\e11d"}.tabset--nav-container .nav .spanlib{display:inline-block;white-space:nowrap;max-width:230px;overflow:hidden}.tabset--nav-container .nav .tabset--nav-link.active{box-shadow:inset 0 0 1px 0 rgba(0,0,0,.1);z-index:11}.tabset--nav-container .nav .nav-item--home .tabset--nav-link{padding:0 19px 0 20px;height:38px;line-height:38px}.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close{display:none}.tabset--nav-container .nav .nav-item--home .nav-item--home-icon{display:inline-block;width:16px;height:16px;background:url(../../../launcher/home-icon.svg) center center no-repeat}.gw-header--menu-panel .menu-panel--close:hover::before,.tabset--nav-container .nav .nav-item--apps,.tabset--nav-container .nav .nav-item--apps .nav-link-close{display:none}.workarea{overflow:hidden;background-color:#f4f6f9}.gw-header--menu-panel-wrapper{position:fixed;width:90%;top:40px;left:0;bottom:0;z-index:980;max-width:none;transform:translateX(-120%);box-shadow:0 2px 26px 0 rgba(0,0,0,.3)}@media (min-width:1600px){.gw-header--menu-panel-wrapper{width:70%;max-width:none}}.gw-header--menu-panel-wrapper.f-state-show{transform:translateX(0)}.gw-header--menu-panel-wrapper.f-state-hidden{transform:translateX(-500%)}.gw-header--menu-panel-mask-top{top:40px!important}.gw-header--menu-panel-mask-bottom{bottom:calc(100vh - 40px)!important;background-color:transparent!important}.gw-header--menu-panel-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:#000;opacity:.4}.gw-header--menu-panel-mask.f-state-show{transform:translateX(0)}.gw-header--menu-panel-mask.f-state-hidden{transform:translateX(-120%)}.gw-header--menu-panel{min-width:600px;height:100%;margin:0;z-index:982;position:relative;background:#fff}.gw-header--menu-panel .gw-apps-management{top:0;position:absolute;background:0 0}.gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper{margin:0}.gw-header--menu-panel .menu-panel--close{position:absolute;cursor:pointer;z-index:1001;width:56px;height:56px;top:0;right:0;display:flex;align-items:center;justify-content:center}.gw-header--menu-panel .menu-panel--close::before{background:rgba(0,0,0,.06);border-radius:.5px;position:absolute;left:0;width:1px;height:14px;content:'';top:50%;margin-top:-7px}.gw-header--menu-panel .menu-panel--close .menu-panel--close-area{width:22px;height:22px;text-align:center;background:rgba(0,0,0,.1);border-radius:11px;color:rgba(0,0,0,.5)}.gw-header--menu-panel .menu-panel--close .f-icon{font-size:14px;line-height:22px}.gw-header--menu-panel .menu-panel--close:hover{background:#F6F6F6}.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area{color:#fff;background:#FF6060}.menu-userinfo-wrapper{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper::after{display:none}.menu-userinfo-wrapper.active,.menu-userinfo-wrapper.hover{background-color:#075EBB}.menu-userinfo-wrapper .menu-userinfo--item{display:flex;flex-direction:row;align-items:center;line-height:38px}.menu-userinfo-wrapper .menu-userinfo--item::after{display:none}.menu-userinfo-wrapper .menu-userinfo--item-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.menu-userinfo-wrapper .menu-userinfo--item-name{font-size:14px;color:#fff;position:relative;opacity:.8}.menu-userinfo-wrapper .menu-userinfo--item-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.menu-userinfo--detail{right:0;min-width:220px;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding-top:2px}.menu-userinfo--detail-content{background-color:#fff}.detail-content--item,.detail-content--user{white-space:nowrap;overflow:hidden;text-align:left}.detail-content--user{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.detail-content--user .detail-content--user-avatar-container{margin-right:10px}.detail-content--user .detail-content--user-avatar{display:block;width:38px;height:38px;border-radius:100%}.detail-content--user .detail-content--user-info{line-height:20px}.detail-content--user .detail-content--user-info-sub{font-size:13px;margin-top:2px}.detail-content--item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);padding:0 10px;cursor:pointer}.detail-content--item:hover{color:#247AEC}.detail-content--item .detail-content--icon{width:20px;margin-right:10px;margin-left:9px;font-size:20px}.detail-content--item-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.curtenant,.setdefault,.setdefault:hover{font-size:12px;width:64px;line-height:20px;align-items:center;height:20px;font-family:PingFangSC-Regular;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-self:start;text-align:center}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input{border:0}.setdefault{border-radius:10px;color:#666;flex-shrink:0;justify-content:flex-end;flex-direction:row}.curtenant,.setdefault:hover{border-radius:10px;color:#fff;flex-shrink:0;justify-content:flex-end;flex-direction:row}.tenant-title{font-family:PingFangSC-Regular;font-size:14px;color:rgba(0,0,0,.85);letter-spacing:-.38px;display:flex;align-items:center;width:94px;flex-shrink:0;margin-left:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-start;flex-direction:row;align-self:start;margin-right:20px}.name-space{height:38px}.gw-navbar-user-dropdown{position:relative;padding:0 16px 0 14px;cursor:pointer}.gw-navbar-user-dropdown.active.gw-navbar-user-name{opacity:1}.gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail{display:block!important}.gw-navbar-user-info{display:flex;flex-direction:row;align-items:center;line-height:38px}.gw-navbar-user-avatar{display:inline-block;width:20px;height:20px;border-radius:100%;margin-right:4px}.gw-navbar-user-name{font-size:14px;color:#fff;position:relative;opacity:.8}.gw-navbar-user-name::after{content:'';position:absolute;right:-7px;bottom:8px;width:0;height:0;border-top:3px solid transparent}.gw-navbar-user-info-detail{position:absolute;right:0;top:calc(100% + 1px);z-index:1000;min-width:220px}.gw-navbar-user-info-content{background-color:#fff;box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border:1px solid rgba(56,138,255,.2);border-radius:2px}.gw-navbar-user-info-content--menu{background-color:#fff;border-radius:2px}.gw-navbar-user-info-content-list-item{line-height:20px;font-size:14px;color:rgba(0,0,0,.85);white-space:nowrap;overflow:hidden;text-align:left;cursor:pointer}.gw-navbar-user-info-content-list-item .user-item-icon{width:20px;margin-right:10px;margin-left:9px;font-size:18px}.gw-navbar-user-info-content-list-item .user-item-icon::before{vertical-align:bottom}.gw-navbar-user-info-content-list-msg{display:flex;flex-direction:row;align-items:center;padding:12px 10px}.gw-navbar-user-info-content-list-msg .user-item-img{width:38px;height:38px;margin-right:10px}.gw-navbar-user-info-content-list-msg .user-item-img img{display:block;width:38px;height:38px;border-radius:100%}.gw-navbar-user-info-content-list-msg .user-item-data{font-size:14px;font-weight:400;color:rgba(0,0,0,.8)}.gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section{font-size:13px;margin-top:2px}.gw-navbar-user-info-content-list-item.item-setting-list{color:rgba(0,0,0,.85);padding:0 14px}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{display:flex;flex-direction:row;align-items:center;padding:12px 0}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{width:14px;height:14px}.dialog-user-edit{display:flex;flex-direction:row;align-items:center;padding:16px 26px;padding-left:18px!important}.dialog-user-edit .dialog-user-edit-icon{margin-right:12px;font-size:22px;color:#f49730}.dialog-user-edit .dialog-user-edit-text{font-size:16px;color:#000}.gw-user-edit-dialog{display:none}.gw-user-edit-dialog.show{display:block}.gw-user-edit-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;overflow:hidden;outline:0}.gw-user-edit-modal .modal-dialog{transform:translate(0,0);width:420px;height:180px;margin-left:-210px!important;margin-top:-90px!important}.edit-modal-dialog{position:absolute;width:420px;height:180px;left:50%;top:50%;margin-left:-210px;margin-top:-90px}.edit-modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;border:0 solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 4px 12px 0 rgba(0,0,0,.2);outline:0}.edit-modal-header{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #e2e8f0;border-top-left-radius:2px;border-top-right-radius:2px;flex-shrink:0;background:#fff;color:#000;padding:12px 8px 12px 18px}.edit-modal-title{margin-bottom:0;line-height:22px;font-size:16px}.edit-modal-actions{flex:1;margin:-4px 0;display:flex;justify-content:flex-end}.edit-modal-actions-close{padding:2px;color:#bfbfbf;cursor:pointer}.edit-modal-actions-close:hover{color:rgba(0,0,0,.85)}.edit-modal-body{height:auto;overflow:hidden}.edit-modal-footer{display:flex;align-items:center;justify-content:flex-end;flex-shrink:0;padding:16px 20px 20px}.edit-modal-footer .btn{margin-right:8px;padding:4px 15px;line-height:20px!important;font-size:14px}.edit-modal-footer .btn:last-child{margin-right:0}.gw-user-edit-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:rgba(0,0,0,.15)}.tab-list-menu-back{background:#FDFEFF;box-shadow:0 0 10px 0 rgba(57,66,100,.1);border-radius:4px}.tab-list-menu-back-item-name{font-family:PingFangSC-Regular;font-size:14px;letter-spacing:-.38px;text-align:right;z-index:980}.tab-list-menu-back-item-out{height:37.5px;border-radius:4px;margin:0 3px}.tab-list-menu-back-item-out-content{display:flex;flex-direction:row;align-items:center;line-height:37.5px}.tab-list-menu-whole{position:absolute;z-index:1000;width:auto;top:30px!important;display:none}.tab-list-menu-whole-menu{position:absolute;z-index:1000;width:auto;top:100%!important}.tab-list-menu-whole-menu-mask{overflow:hidden;position:fixed;top:0;bottom:0;left:0;right:0;z-index:970;transform:translateX(-120%);background-color:transparent;opacity:.4}.tab-list-menu-whole-menu-mask-state-show{transform:translateX(0)}.tab-list-menu-whole-menu-mask-state-hidden{transform:translateX(-500%)}.gw-view-tiled--container{display:flex;flex-direction:column;flex-shrink:1;flex-grow:1;flex-basis:0}.gw-view-tiled--container .gw-view-tiled--nav{display:flex;flex-direction:row;align-items:center;padding:10px 24px 8px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select{position:relative;width:218px;margin-right:18px;background:#fff;border:1px solid rgba(0,0,0,.08);border-radius:2px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select{position:relative;display:flex;flex-direction:row;align-items:center;height:28px;padding:0 36px 0 10px;line-height:28px;cursor:pointer}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text{font-size:15px;color:rgba(0,0,0,.85);margin-right:8px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow{position:absolute;right:0;top:1px;width:30px;height:26px;cursor:pointer;font-size:12px;color:rgba(0,0,0,.85)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{display:none;position:absolute;left:0;top:30px;width:218px;z-index:999;background:#fff;box-shadow:0 4px 6px 0 rgba(139,139,139,.1);max-height:calc(100vh - 200px);overflow:auto}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item{height:36px;padding-left:10px;line-height:36px;font-size:14px;color:#333;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true{display:block}.gw-view-tiled--container .gw-view-tiled--content{flex-shrink:1;flex-grow:1;flex-basis:0;padding:16px 24px;overflow-y:auto}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item{display:inline-block;position:relative;width:240px;height:80px;padding:17px 58px 17px 14px;margin-right:14px;margin-bottom:18px;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner{display:flex;flex-direction:row;align-items:center}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon{flex-shrink:0;width:46px;height:46px;margin-right:10px}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img{display:block;width:36px;height:36px;margin:5px auto}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title{font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after{position:absolute;content:'\e302';right:10px;top:10px;width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;font-size:14px;color:#FFC43B;font-family:FarrisExtend;text-transform:none;display:none}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after{display:inline-block;content:'\e303'}.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.menu-search-wrapper{height:40px;transition:all .2s linear;transform:translateY(-40px);margin:0 24px 0 0}.menu-search-wrapper.f-state-focus{transform:translateY(0)}.menu-search-wrapper .menu-search--placerholder{position:relative;height:40px;line-height:40px;padding-right:22px;text-align:right}.menu-search-wrapper .menu-search--placerholder .f-icon-search{margin-right:10px;color:#fff}.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text{display:inline-block;line-height:18px;font-size:13px;color:rgba(255,255,255,.49)}.menu-search-wrapper .menu-search--placerholder::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.5)}.menu-search-wrapper .menu-search--search{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px}.menu-search-wrapper .menu-search--search .menu-search--search-select{position:relative;padding:0 8px 0 16px;height:40px;line-height:40px;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text{font-size:14px;color:rgba(255,255,255,.85)}.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow{margin-left:5px;font-size:14px;color:#fff}.menu-search-wrapper .menu-search--search .menu-search--search-select::after{content:'';position:absolute;right:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-search-wrapper .menu-search--search .menu-search--search-form{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;height:40px;padding:0 6px}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input{display:block;height:40px;line-height:40px;border:0;box-shadow:none;font-size:14px;color:#fff;background:0 0}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append{padding-right:13px;height:40px;line-height:40px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear{position:relative;padding-left:13px;color:#fff;cursor:pointer}.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after{content:'';position:absolute;left:0;top:50%;width:1px;height:16px;margin-top:-8px;background:rgba(255,255,255,.3)}.menu-colllection-wrapper .dropdown-toggle::after{display:none}.menu-colllection-wrapper .menu-colllection--detail{width:280px}.menu-colllection-wrapper .menu-colllection--detail-title{padding:6px 16px 8px;font-size:13px;color:rgba(0,0,0,.6)}.menu-colllection-wrapper .menu-colllection--detail-item{display:flex;flex-direction:row;align-items:center;padding:11px 15px;cursor:pointer}.menu-colllection-wrapper .menu-colllection--detail-item .item-img{width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-img img{display:block;width:28px;height:28px}.menu-colllection-wrapper .menu-colllection--detail-item .item-content{flex:1;padding-left:14px;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title{margin-bottom:3px;line-height:18px;font-size:13px;color:rgba(0,0,0,.85);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle{line-height:16px;font-size:12px;color:rgba(0,0,0,.3);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-single-app-wrapper{position:relative;width:198px;height:116px;padding:12px 18px;margin-right:14px;margin-bottom:14px;background:#FFF;border:1px solid #EBEEF2;box-shadow:2px 2px 16px 0 rgba(3,27,78,.06);border-radius:2px;transition:all .2s}.gw-single-app-wrapper:hover{transform:translateY(-5px);box-shadow:2px 2px 10px 0 rgba(0,28,64,.06)}.gw-single-app--title{padding-right:20px;margin-bottom:4px;font-size:14px;color:rgba(0,0,0,.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--subtitle{font-size:12px;color:rgba(0,0,0,.45);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gw-single-app--icon-container{position:absolute;right:14px;bottom:12px}.gw-single-app--icon-container img{width:36px;height:36px}.gw-app-group--header{display:flex;flex-direction:row;align-items:center;padding-bottom:14px;margin-right:10px}.gw-app-group--header .header--icon-container{width:20px;height:20px;margin:0 10px 0 0;line-height:20px}.gw-app-group--header .header--icon-container .header--icon{font-size:20px;color:rgba(0,0,0,.45)}.gw-app-group--header .header--title{font-size:14px;color:rgba(0,0,0,.75);margin-right:6px}.gw-app-group--header .header--subtitle{font-size:12px;color:rgba(0,0,0,.3)}.gw-app-group-wrapper{padding:10px 0 0}.gw-app-group--list{display:flex;flex-direction:row;flex-wrap:wrap;padding-bottom:0}.gw-apps-management{flex-grow:1;flex-shrink:1;flex-basis:0;overflow:hidden;display:flex;flex-direction:column;position:fixed;top:40px;bottom:0;left:0;right:0;z-index:1000;background-color:rgba(0,0,0,.15)}.gw-apps-management .gw-apps-management--close{position:absolute;right:24px;top:17px;width:22px;height:22px;cursor:pointer}.gw-apps-management .gw-apps-management--close .f-icon{font-size:22px;color:rgba(0,0,0,.06)}.gw-apps-management .gw-apps-management--close:hover .f-icon{color:rgba(0,0,0,.25)}.gw-apps-management--header{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;padding:10px 56px 10px 21px}.gw-apps-management--header .header--caption{display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--caption .header--caption-logo{padding-right:11px}.gw-apps-management--header .header--caption .header--caption-logo img{display:block;width:30px;height:30px}.gw-apps-management--header .header--caption .header--caption-title{font-size:18px;color:#000}.gw-apps-management--header .header--search{position:relative;max-width:508px;height:36px;padding:0 14px 0 34px;margin:0 auto;border-radius:18px}.gw-apps-management--header .header--search .search--input{display:block;height:34px;border:0;box-shadow:none;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--append{position:absolute;left:14px;top:0}.gw-apps-management--header .header--search .search--append .f-icon{display:block;height:34px;line-height:34px;font-size:18px}.gw-apps-management--header .header--search .search--placeholder{display:flex;flex-direction:row;align-items:center;justify-content:center;position:absolute;left:-1px;top:-1px;width:calc(100% + 2px);height:36px;line-height:36px;border-radius:18px}.gw-apps-management--header .header--search .search--placeholder .f-icon{display:block;margin-right:14px;color:#979797}.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text{font-size:14px;color:rgba(0,0,0,.25)}.gw-apps-management--header .header--search .search--result-panel{position:absolute;top:40px;left:0;right:0;padding:10px 18px 0;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;z-index:100;max-height:310px;overflow-y:auto}.gw-apps-management--header .header--search .search--result-panel .search--result-title{font-size:13px;color:rgba(0,0,0,.6)}.gw-apps-management--header .header--search .search--result-panel .search--result-list{margin:8px -18px}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name{display:flex;flex-direction:row;align-items:center;font-size:14px;color:rgba(0,0,0,.85)}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path{flex-grow:1;flex-shrink:1;flex-basis:0;padding-left:16px;font-size:12px;color:rgba(0,0,0,.45);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.gw-apps-management--header .header--search .search--result-panel .search--result-more{height:40px;line-height:40px;text-align:center;border-top:1px solid #ECECEC;font-size:12px;color:rgba(0,0,0,.75);cursor:pointer;margin:0 -18px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;margin-top:14px}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item{height:20px;padding:0 10px;margin:0 10px 14px 0;background:rgba(219,224,230,.5);border-radius:13px;font-size:13px;line-height:20px;color:#8A96A5;list-style:none;cursor:pointer}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{color:#fff;box-shadow:0 2px 4px 0 rgba(25,76,164,.09)}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match{color:#fff}.gw-apps-management--header .header--search .search--prompt-panel{padding-bottom:14px}.gw-apps-management--header .header--view{flex-shrink:0;display:flex;flex-direction:row;align-items:center}.gw-apps-management--header .header--view .view--btn{text-align:center;white-space:nowrap;vertical-align:middle;padding:0 10px;line-height:28px;background:rgba(240,240,240,.6);margin-left:-1px;cursor:pointer}.gw-apps-management--header .header--view .view--btn .view--btn-icon{font-size:13px;color:rgba(0,0,0,.2)}.gw-apps-management--header .header--view .view--btn.active{border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06)}.gw-apps-management--header .header--view .view--btn.active .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:hover:not(.active){border-radius:2px;box-shadow:0 0 4px 0 rgba(0,0,0,.06);position:relative}.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon{color:#fff}.gw-apps-management--header .header--view .view--btn:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}.gw-apps-management--header .header--view .view--btn:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.gw-apps-management--header .header--settings{position:relative}.gw-apps-management--header .header--settings .header--settings-icon{display:inline-block;height:28px;width:48px;text-align:center;line-height:28px;color:#979797;cursor:pointer}.gw-apps-management--header .header--settings .header--settings-panel{position:absolute;background:#FFF;border:1px solid rgba(56,138,255,.2);box-shadow:0 2px 10px 0 rgba(0,0,0,.1);border-radius:2px;padding:16px 14px;top:34px;width:162px;right:0;opacity:0;transition:opacity .1s linear}.gw-apps-management--header .header--settings .header--settings-panel.f-state-show{opacity:1}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow{width:16px;height:8px;margin:0 2px;position:absolute;top:-8px;right:13px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before{content:'';position:absolute;border-width:0 .5rem .5rem;border-color:transparent;border-style:solid;border-bottom-color:rgba(56,138,255,.2);top:0}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after{content:'';position:absolute;border-color:transparent transparent #fff;border-style:solid;border-width:0 .5rem .5rem;top:1px}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content{font-size:13px;color:rgba(0,0,0,.8)}.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item{display:flex;align-items:center;justify-content:space-between}.gw-apps-management--content{overflow-y:auto;flex-shrink:1;flex-grow:1;flex-basis:0;padding:20px 0 20px 24px}.gw-apps-management--content::-webkit-scrollbar{width:7px;height:7px;background-color:#8e8e8e}.gw-apps-management--content::-webkit-scrollbar-track{border-radius:0;background-color:#fff;border:none;background-clip:padding-box;border-right:none}.gw-apps-management--content::-webkit-scrollbar-thumb{background-color:#dbdbdb;border:none;background-clip:content-box;opacity:.6;transform:rotate(90deg);border-radius:3px}.search--result-item-keyboard--control{display:flex;flex-direction:row;align-items:center;flex-wrap:nowrap;list-style:none;height:30px;line-height:30px;padding:0 18px;cursor:pointer}.launchpad-full-view{margin-right:16px}.launchpad-full-icon{transform:rotate(180deg)}.launchpad-full{margin-bottom:2px;cursor:pointer}.gw-switch{position:relative;display:inline-block;box-sizing:content-box;padding:0;margin:0;cursor:pointer;transition:.3s ease-out all;-webkit-transition:.3s ease-out all;white-space:nowrap;min-width:32px;height:18px;border-radius:20px;background-color:#d9d9d9}.gw-switch.f-state-checked{background:#49C265}.gw-switch.f-state-checked small{right:2px;left:auto}.gw-switch small{left:2px;border-radius:100%;position:absolute;top:1px;transition:.2s ease-out all;-webkit-transition:.3s ease-out all;background:#fff;width:16px;height:16px;font-size:80%}.f-component-walk-page.active{display:block}.f-component-walk-page .f-page-walker-detail-wrapper{position:absolute;z-index:333333}.f-component-walk-page .f-page-walker-detail-wrapper-img{background:0 0}.f-component-walk-page .f-page-walker-detail-wrapper-content{position:absolute}.f-component-walk-page .f-page-walker-detail-wrapper-content-right{left:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-left{right:calc(100% + 6px);top:-13px}.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom,.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom{top:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content-top{bottom:calc(100% + 6px);left:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow{position:absolute;display:block;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.f-component-walk-page .f-page-walker-detail-wrapper-content-default{box-shadow:0 3px 10px 0 rgba(0,0,0,.15);border-radius:2px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top{margin-bottom:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow{bottom:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after{border-width:10px 8px 0;bottom:2px;border-top-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right{margin-left:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow{left:-12px;top:28px;width:12px;height:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after{border-width:8px 10px 8px 0;left:2px;border-right-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow{top:-12px;left:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left{margin-right:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow{top:28px;right:-12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after{border-width:8px 0 8px 10px;right:2px;border-left-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom{margin-top:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow{top:-12px;right:12px;width:16px;height:12px}.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after{border-width:0 8px 10px;top:2px;border-bottom-color:#fff;box-shadow:-2px -2px 5px rgba(0,0,0,.08)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default{box-shadow:0 2px 10px 0 rgba(38,40,56,.23)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner{position:relative;display:flex;flex-direction:column;min-width:419px;min-height:165px;padding:24px 12px;background-color:#fff;border-radius:3px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content{position:relative;min-height:60px;padding-left:74px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img{position:absolute;left:0;top:0;width:60px;height:60px;border-radius:3px;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img{display:block;width:60px;height:60px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title{display:flex;flex-direction:row;align-items:center}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number{flex-shrink:0;padding-right:6px;font-size:12px;color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current{font-size:16px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text{font-size:16px;color:rgba(0,0,0,.85);font-weight:600;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle{flex-shrink:1;flex-grow:1;flex-basis:0;margin-top:6px;font-size:13px;min-height:44px;color:rgba(0,0,0,.65);line-height:22px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns{display:flex;flex-direction:row;align-items:center;padding-top:17px;padding-right:10px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn{flex-grow:1;flex-shrink:0;flex-basis:0;display:flex;flex-direction:row;align-items:center;justify-content:flex-end}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn{margin-right:6px}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child{margin-right:0}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close{position:absolute;right:10px;top:10px;width:30px;height:30px;line-height:30px;text-align:center;cursor:pointer}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon{font-size:18px;color:rgba(0,0,0,.45)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon{color:rgba(0,0,0,.85)}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip{display:flex;flex-direction:row;align-items:center;padding-left:74px;background-color:#fff}.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn{color:rgba(0,0,0,.35)}.user-setting{position:absolute;top:0;right:0;bottom:0;left:0}.user-setting-list{width:286px;min-width:286px;background-color:#fff;overflow-y:auto;overflow-x:hidden}.user-setting-list .user-setting-message{padding-bottom:32px;padding-top:32px}.user-setting-list .user-setting-message .user-avatar{width:86px;height:86px;margin:0 auto 18px;position:relative}.user-setting-list .user-setting-message .user-avatar .user-avatar-img{display:block;width:86px;height:86px;border-radius:100%}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon{position:absolute;width:86px;height:86px;border-radius:100%;background:rgba(0,0,0,.3);top:0;left:0;line-height:86px;text-align:center;display:none}.user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon{display:block}.user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon{font-size:24px;color:#fff}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{position:absolute;width:22px;height:22px;line-height:22px;border:1px solid #fff;right:0;bottom:0;border-radius:100%;color:#fff;text-align:center}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon{font-size:12px;vertical-align:initial}.user-setting-list .user-setting-message .user-title{text-align:center}.user-setting-list .user-setting-message .user-title .user-name{font-size:16px;color:rgba(0,0,0,.75);margin-bottom:6px}.user-setting-list .user-setting-message .user-title .user-post{font-size:12px;color:rgba(0,0,0,.45)}.user-setting-list .user-setting-menu{padding:24px 0;border-top:1px solid #f0f0f0}.user-setting-list .user-setting-menu .menu-item-inner{width:286px;height:48px;line-height:48px;padding-left:38px;padding-right:20px;cursor:pointer}.user-setting-list .user-setting-menu .menu-item-inner.active{padding-left:35px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-title{display:flex;flex-direction:row;align-items:center}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon{margin-right:18px}.user-setting-list .user-setting-menu .menu-item-inner .menu-item-text{font-size:14px;color:rgba(0,0,0,.75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-setting-content{flex-grow:1;padding:0 10px 10px;overflow-x:auto;overflow-y:hidden}.user-setting-content-inner{height:100%;background:#fff;padding:24px;overflow-y:auto}.user-setting-content-wrapper-title{color:#000;display:inline-flex;align-items:center;line-height:1.375rem;position:relative;overflow:hidden;padding:0 0 0 1rem;min-width:760px}.user-setting-content-wrapper-title::before{content:'';width:.25rem;height:1.125rem;border-radius:1px;position:absolute;top:50%;left:0;margin-top:-.5625rem}.user-setting-content-wrapper-title .title-text{font-size:1rem;line-height:1.375rem;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-bottom:0;margin-right:10px}.user-setting-content-wrapper-title .title-line{flex-grow:1;border-bottom:1px dashed rgba(0,0,0,.1)}.user-setting-content-wrapper-title .title-edit-btn{font-size:14px;padding-left:10px;cursor:pointer}.user-setting-content-wrapper-title .title-edit-btn .f-icon{font-size:14px;margin-right:4px;vertical-align:inherit}.user-setting-content-wrapper-main{padding:27px 0 32px}.user-setting-content-wrapper-main .user-setting-form{padding-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap{max-width:25rem;display:flex;flex-grow:0;flex-shrink:0;flex-basis:auto;flex-flow:row wrap;align-items:center;margin-bottom:.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns{margin-bottom:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label{display:flex;align-items:center;width:6rem;flex-shrink:0;margin-right:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;justify-content:flex-end;flex-direction:row;align-self:start;height:1.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap{flex-grow:1;flex-shrink:1;flex-basis:auto}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip{font-size:14px;color:rgba(0,0,0,.45);margin-top:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control{height:28px!important}.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control,.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group{border:1px solid transparent;border-bottom-color:#ececec}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn{margin-left:10px;padding-top:4px;padding-bottom:4px}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child{margin-left:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link{color:rgba(0,0,0,.75)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list{margin-right:40px;position:relative;cursor:pointer}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child{margin-right:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{width:50px;height:50px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img{background-color:rgba(217,38,44,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img{background-color:rgba(0,192,222,.9)}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name{font-size:14px;color:rgba(0,0,0,.65);margin-top:14px;text-align:center}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{content:'';position:absolute;width:58px;height:58px;background:0 0;left:-4px;top:-4px;border-radius:100%}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{position:absolute;right:-1px;top:35px;border-radius:100%;background-color:#fff;display:none}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon{display:block;width:16px;height:16px;vertical-align:inherit;border-radius:100%;border:1px solid #fff;font-size:14px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check{display:block}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img{width:64px;height:52px;overflow:hidden}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{width:72px;height:60px;border-radius:0}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check{right:-10px;top:45px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color{margin-bottom:44px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label{height:50px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label{height:60px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto{min-width:43.875rem}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap{display:flex;flex-direction:row}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list{flex:1;padding-right:10px}.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child{padding-right:0}.dialog-user-avatar-tips{padding:0 24px 14px;margin-top:12px;font-size:12px;color:rgba(0,0,0,.45)}.dialog-user-avatar{padding:24px 32px 0 24px;display:flex;flex-direction:row}.dialog-user-avatar-change{padding-right:36px;border-right:1px solid #EFEFEF}.dialog-user-avatar-view{padding-left:36px}.dialog-user-avatar-view .avatar-view-title{font-size:14px;color:rgba(0,0,0,.75);text-align:center;margin-bottom:15px}.dialog-user-avatar-view .avatar-view-size{margin-bottom:32px}.dialog-user-avatar-view .avatar-view-size:last-child{margin-bottom:0}.dialog-user-avatar-view .avatar-view-size .img{display:block;width:100px;height:100px;border-radius:100%;overflow:hidden;margin:0 auto;border:1px solid #EFEFEF}.dialog-user-avatar-view .avatar-view-size .avatar-view-size-text{font-size:12px;color:rgba(0,0,0,.45);display:block;text-align:center;margin-top:10px}.mode-active,.searce .select-show-mode .show-mode-active,.subcount-info:hover{color:#CF242A!important}.dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img{width:50px;height:50px}.isdisplay{display:none}.themesdefault{background-color:#C81217}.themesdefault:hover{background-color:#FF9191}.gw-header{background:linear-gradient(207deg,#E53131 0,#CF242A 100%)}.gw-header .gw-header--exitfullscreen-wrapper{border-top:1px solid #CF242A}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn{background:url(../../../img/orishow-red.svg) no-repeat}.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover{background-image:url(../../../img/passshow-red.svg) no-repeat}.gw-header--application-icon-container.f-state-active,.gw-header--application-icon-container:hover{background:linear-gradient(269deg,#af0303 0,#BB0707 50%,#af0303 100%)}.gw-header-toolbar--content:hover{background-color:#D5161B}.gw-apps-management--tabs-container .tabs-container--item.active{background-image:linear-gradient(225deg,#F52828 0,#D2171E 100%)}.tabs-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#B60808 26%,#D2171E 67%,rgba(9,113,255,.13) 95%)!important}.tabs-container--vertical .list-group .list-group-item.active,.tabs-container--vertical .list-group .list-group-item:hover{background-image:linear-gradient(243deg,#F6EFEF 0,#F6EFEF 26%,#F6EFEF 67%,#F6EFEF 95%)!important}.keyApplication .group .module--list .module--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#D0242A 50%,#FFD3D3 100%)}.keyApplication .group .module--list .module--list-item:hover{color:#C81217}.listview--nav-horizontal .active .keyApplicationName{background-color:#C81217}.menu-submenu--title .menu-item--icon .gw-icon,.tileview--menu-item .menu-item--icon img{color:#DD1C21}.menu-submenu--title-selected{color:#C81217!important}.menu-submenu--title:hover,.menu-submenu--title:hover .menu-item--text,.tileview--menu-item:hover,.tileview--menu-item:hover .menu-item--text{color:#C81217}.tileview--menu-item-selected{color:#D5161B;background:#FBEEEE}.tileview--menu .menu-list-item--arrow,.tileview--menu-item-selected .menu-item--text{color:#D5161B}.application-list--header-title--icon .header-title--icon-item{background:rgba(208,37,42,.9)}.application-list--header-title--icon .header-title--icon-item-right{background:rgba(207,36,42,.5)}.application-wrapper--list-item::after{background-image:linear-gradient(90deg,#ECECEC 0,#D0242A 50%,#FFD3D3 100%)}.application-wrapper--list-item:hover .application-wrapper--list-item-text{color:#C81217}.tileview--menu-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#B60808 26%,#D2171E 67%,rgba(9,113,255,.13) 95%)}.keyApplication-header-wrapper .module-head .module-header--icon{color:#DD1C21}.keyApplication .group .group-title .group-title--icon-container .group-title--icon{background:rgba(208,37,42,.9)}.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right{background:rgba(207,36,42,.5)}.tileview--menu-image{-webkit-filter:drop-shadow(#C81217 20px 0);filter:drop-shadow(#C81217 20px 0)}.notactive{color:#596580!important}.down-arrow.active::after{border-color:#C81217}.detail-content--item-content,.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content{border-top:1px solid #F9F5F5}.tabset--nav-container{background:#EBEEF4}.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon{background-image:url(../../../launcher/home-icon-selected-red.svg)}.tabset--nav-container .nav .tabset--nav-link{color:#596580;font-size:13px;padding:0 10px 0 16px;height:36px;line-height:36px}.tabset--nav-container .nav .tabset--nav-link:hover{background:#E1E5EE}.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close{color:#666}.tabset--nav-container .nav .tabset--nav-link.active{color:#3E4A65;background:#F8F9FB}.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close{color:#666}.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after{background-image:linear-gradient(243deg,rgba(4,159,255,.09) 0,#B60808 26%,#D2171E 67%,rgba(9,113,255,.13) 95%)}.detail-content--item:hover{background-color:#F9F5F5}.curtenant,.setdefault:hover{background:#D5161B}.curtenant{color:#fff}.curtenant-font-color{color:#C81217!important}.gw-navbar-user-dropdown.active,.gw-navbar-user-dropdown:hover{background-color:#D5161B}.gw-navbar-user-info-content-list-item.item-setting-list:hover{color:#C81217;background-color:#F9F5F5}.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background,.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size{background-image:url(../../../img/tenant_change-red.svg)}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all{border:1px solid #F9F5F5}.gw-single-app-wrapper:hover,.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover{-o-border-image:linear-gradient(135deg,#FF9F9F,#FFD3D3) 30 30;border-image:linear-gradient(135deg,#FF9F9F,#FFD3D3) 30 30}.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover{background-color:#F6EFEF}.menu-search-wrapper .menu-search--search{background:#D5161B}.menu-colllection-wrapper .menu-colllection--detail-item:hover{background:#F9F5F5}.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title{color:#C81217}.menu-colllection-wrapper.show .menu-colllection--item{background-color:#D5161B}.gw-app-group.f-state-active .gw-app-group--header .header--icon{color:#DD1C21}.gw-apps-management--header .header--search{background:#F9F5F5;border:1px solid #F9F5F5}.gw-apps-management--header .header--search .search--input{background:#F9F5F5}.gw-apps-management--header .header--search .search--append .f-icon{color:#D0242A}.gw-apps-management--header .header--search.f-state-focuse,.gw-apps-management--header .header--search:hover{border:1px solid #FF9191}.gw-apps-management--header .header--search .search--placeholder{background:#F9F5F5;border:1px solid #F9F5F5}.gw-apps-management--header .header--search .search--result-panel .match{color:#D5161B}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check,.user-setting-content-wrapper-title .title-edit-btn,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon,.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text{color:#D0242A}.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover{background:#F9F5F5}.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover{background-image:linear-gradient(215deg,#1C7CEA 0,#C81217 100%)}.gw-apps-management--header .header--view .view--btn.active,.gw-apps-management--header .header--view .view--btn:hover:not(.active){background-image:linear-gradient(225deg,#F52828 0,#D2171E 100%)}.search--result-item-keyboard--control{background:#F9F5F5}.user-setting-list .user-setting-message .user-avatar .user-avatar-sex{background-color:#FF9191}.user-setting-list .user-setting-menu .menu-item-inner.active{border-left:3px solid #D0242A}.user-setting-content-wrapper-title::before{background:#FF9191}.user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before{background-color:#ED5858}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img{background-color:#D0242A}.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before,.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before{border:1px solid rgba(207,36,42,.5)}.user-setting-list .user-setting-menu .menu-item-inner.active,.user-setting-list .user-setting-menu .menu-item-inner:hover{background-color:#F9F5F5}.tabset--nav-container .nav{height:36px}.tabset--nav-container .nav .nav-link-close{margin:0 0 0 14px} \ No newline at end of file +@charset "UTF-8"; + +.g-main, +.gw-page-wrapper { + top: 0; + right: 0; + position: absolute; + left: 0; + bottom: 0 +} + +.g-main { + margin: 0 auto; + font-size: .875rem +} + +.font-size-13 { + font-size: .8125rem !important +} + +.font-size-14 { + font-size: .875rem !important +} + +.font-size-normal { + font-size: 1rem !important +} + +.font-size-middle { + font-size: 1.5rem !important +} + +.font-size-lg { + font-size: 3rem !important +} + +.flex-auto { + flex-grow: 1; + flex-shrink: 1; + flex-basis: auto +} + +.g-pointer { + cursor: pointer +} + +.gw-page-wrapper { + overflow: hidden; + display: flex; + flex-direction: column +} + +.login-section, +.subcount-info, +.themesdefault, +.themesgreen, +.themesred, +.wrapper-content { + position: relative +} + +.gw-page-header>.row { + overflow: hidden +} + +.wrapper-content { + margin: 0 +} + +.themestitle { + display: inline-block; + margin-left: 35px; + text-align: center; + font-family: PingFangSC-Light; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.themesheader { + margin-left: 25px; + margin-bottom: 25px; + font-family: PingFangSC-Regular; + font-size: 16px; + color: rgba(0, 0, 0, .85) +} + +.module-title2, +.themesd { + margin-bottom: 10px +} + +.themesd { + display: inline-block; + vertical-align: middle; + margin-top: -20px +} + +.themesdefault, +.themesdefault:hover, +.themesgreen, +.themesgreen:hover, +.themesred, +.themesred:hover { + height: 50px; + border-radius: 5px; + cursor: pointer; + margin-top: 5px; + width: 50px +} + +.themesred { + background-color: #D9262C +} + +.themesred:hover { + background-color: #DF464B +} + +.themesgreen { + background-color: #00C0DE +} + +.themesgreen:hover { + background-color: #30CFE8 +} + +.themebanIn, +.themebanOut { + height: 50px; + border-radius: 5px; + opacity: .25; + margin-top: -40px; + cursor: pointer +} + +.themesinimg { + padding-left: 17px; + padding-top: 19px; + display: flex +} + +.themesoutimg { + padding-left: 17px; + padding-top: 19px; + display: none +} + +.themessize { + display: flex; + padding-left: 7px; + padding-top: 10px +} + +.themebanIn { + background: #000; + width: 50px +} + +.themebanOut { + background: #000; + width: 50px; + display: none +} + +.themesizeIn { + margin-top: -52px; + position: absolute +} + +.applicationhome { + border-right: 1px solid rgba(255, 255, 255, .3) !important; + padding-right: 13px !important +} + +.collection-10, +.collection-100, +.collection-max { + border-radius: 9px; + background: red; + font-size: 12px !important; + text-align: center; + color: rgba(255, 255, 255, .9); + line-height: 18px !important; + padding: 0 6px !important; + font-family: arial, sans-serif +} + +.gw-header--caption { + margin: 0 0 0 20px +} + +.gw-header--caption-img { + display: block; + max-height: 38px +} + +.collection-10, +.collection-100, +.collection-max, +.subcount-info { + display: inline-block +} + +.collection-10 { + margin: 2px -5px +} + +.collection-100 { + margin: 2px -11px +} + +.collection-max { + margin: 2px -13px +} + +.subcount-info { + color: rgba(0, 0, 0, .25) !important; + padding: 0 7px; + cursor: pointer; + line-height: 28px !important +} + +.subcount-info .label { + line-height: 14px; + padding: 0 4px; + position: absolute; + right: 2px; + top: 1px; + font-size: .625rem +} + +.subcount-info .material-icons { + display: block +} + +#search:-moz-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +#search::-moz-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +#search::-webkit-input-placeholder { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .25); + letter-spacing: 0; + line-height: 20px; + align-items: center +} + +app-login-container { + background: #fff; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow: auto +} + +.login-logo { + width: 26.69rem; + height: 18rem; + overflow: hidden; + margin-right: 4.5rem; + background: url(../../../img/login-logo@2x.png) no-repeat; + background-size: 427px 288px +} + +.login-logo h1 { + font-family: PingFangSC, 'Segoe UI', 'microsoft yahei', sans-serif; + font-size: 1.625rem; + line-height: 2.5rem; + padding: 9.5rem 0 0 5rem; + color: #666560; + margin: 0 +} + +.login-logo .logo-en { + font-size: 1.375rem +} + +.login-section { + width: 24.31rem; + padding-left: 2.56rem; + float: left +} + +.login-section h2 { + font-size: 1.75rem; + color: #333; + margin: .25rem 0 1.31rem +} + +.login-form .custom-select, +.login-form .form-control { + margin: 0 0 1.13rem; + line-height: 26px; + border-radius: .25rem; + padding-top: .3125rem; + padding-bottom: .3125rem; + height: 32px +} + +.btn-login { + background: #24abe9; + color: #fff; + height: 3.25rem; + font-size: 1rem +} + +.btn-regist { + padding: 1.25rem 0 0; + font-size: .875rem +} + +.btn-regist a { + border-bottom: 1px solid #24abe9; + color: #24abe9; + padding: 0 0 .125rem +} + +.btn-regist a:hover { + text-decoration: none +} + +.remember-info { + padding: 0 0 0 1.25rem +} + +.login-lg { + display: inline-block; + width: 1.88rem; + height: 1.31rem; + background: url(../../../img/language@2x.png) no-repeat; + background-size: 30px auto +} + +.lg-en { + background-position: 0 0 +} + +.lg-zh-cn { + background-position: 0 -24px +} + +.login-lg-text { + color: #373d41 +} + +.auth-form-container { + padding: 6.56rem 0 0 +} + +.login-lg-area { + position: absolute; + top: -5rem; + right: -65% +} + +.login-lg-dropdown .btn:active, +.login-lg-dropdown .btn:focus { + outline: 0 +} + +.login-lg-dropdown .dropdown-menu { + right: 0; + left: auto +} + +.login-log-container { + flex-direction: row-reverse !important +} + +@media (max-width:1200px) { + .login-lg-area { + right: 0 + } +} + +@media (max-width:992px) { + .login-logo { + margin: 0 auto + } + + .login-section { + width: 90%; + padding: 0 0 0 10%; + margin: 0 auto + } +} + +@media (max-width:768px) { + .login-log-container { + flex-direction: row !important + } +} + +@media (max-width:576px) { + .login-lg-area { + right: 0; + top: .5rem + } + + .auth-form-container { + padding: 1rem 0 0 + } + + .login-section { + padding: 0; + float: none; + border-left: none + } +} + +.gw-header-toolbar .material-icons { + font-size: 22px +} + +.gw-header-toolbar .count-info { + color: rgba(255, 255, 255, .65) !important; + position: relative; + display: block; + padding: 9px 11px; + cursor: pointer +} + +.gw-header-toolbar .count-info:hover { + color: #fff !important +} + +.gw-header-toolbar .count-info .label { + line-height: 14px; + padding: 0 4px; + position: absolute; + right: 2px; + top: 1px; + font-size: .625rem +} + +.gw-header-toolbar .count-info .material-icons { + display: block +} + +.gw-userinfo-menu .leftMenu { + left: -100px !important +} + +.gw-userinfo .user-profile { + outline: #000; + text-align: left; + color: #000; + border: 1px solid #000; + margin: 20px; + width: 700px; + padding: 10px +} + +.gw-userinfo span.title { + display: block; + width: 80px; + height: 30px; + position: relative; + top: -20px; + text-align: center; + background: #fff +} + +.gw-header-toolbar .leftMenu a { + display: block; + padding: 0 +} + +.gw-page-header-tabscontrol { + display: none +} + +.full-width { + width: 100% !important +} + +.scrollbar-x-hidden { + overflow-x: hidden +} + +.border-none { + border: 0 !important +} + +.gw-header { + color: #f5f5f5; + padding: 0; + z-index: 910; + box-shadow: 0 0 10px 0 rgba(57, 66, 100, .1) +} + +.gw-header .gw-header--exitfullscreen-wrapper { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 12px; + z-index: 900 +} + +.gw-header .gw-header--exitfullscreen-wrapper:hover .gw-header--exitfullscreen-btn { + display: block +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + display: none; + cursor: pointer !important; + height: 18px; + width: 120px; + margin: 0 auto; + position: relative; + z-index: 2000 +} + +.gw-header--toast { + background: #333; + opacity: .9; + color: #FFF; + line-height: 43px; + text-align: center; + border-radius: 4px; + height: 46px; + width: 256px; + margin: 46px auto; + display: none +} + +.gw-header--toast-show { + display: block; + -webkit-animation-name: exitFullScreenToastFadeInDown; + animation-name: exitFullScreenToastFadeInDown; + -webkit-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + position: fixed; + left: 50%; + margin-left: -128px +} + +@-webkit-keyframes exitFullScreenToastFadeInDown { + + 0%, + to { + opacity: 0; + transform: translate3d(0, -100%, 0) + } + + 50% { + opacity: 1; + transform: translateZ(0) + } +} + +@keyframes exitFullScreenToastFadeInDown { + + 0%, + to { + opacity: 0; + transform: translate3d(0, -100%, 0) + } + + 50% { + opacity: 1; + transform: translateZ(0) + } +} + +.gw-header--wrapper { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-header--application-icon-container .application-icon-active, +.gw-header--application-icon-container.f-state-active::after, +.gw-header--application-icon-container:hover::after { + display: none +} + +.gw-header--application-icon-container { + position: relative; + width: 55px; + height: 40px; + color: #fff; + text-align: center; + cursor: pointer +} + +.gw-header--application-icon-container::after { + position: absolute; + content: ''; + width: 1px; + height: 16px; + right: 0; + top: 50%; + margin-top: -8px; + background-color: rgba(255, 255, 255, .3) +} + +.gw-header--application-icon-container .f-icon { + font-size: 1rem; + line-height: 38px +} + +.gw-header--application-icon-container.f-state-active, +.gw-header--application-icon-container:hover { + color: #fff +} + +.gw-header--application-icon-container.f-state-active .application-icon-active, +.gw-header--application-icon-container:hover .application-icon-active { + display: inline-block +} + +.gw-header--application-icon-container.f-state-active .application-icon, +.gw-header--application-icon-container:hover .application-icon { + display: none +} + +.gw-header-toolbar--list { + display: flex; + align-items: center +} + +.gw-header-toolbar--content { + display: block; + height: 40px; + padding: 0 11px; + line-height: 40px; + cursor: pointer +} + +.gw-apps-management-wrapper { + background: #fff; + min-width: 600px; + height: 100%; + display: flex; + flex-direction: column; + margin: 0 70px 0 0; + position: relative +} + +.gw-apps-management-wrapper .header { + padding: 11px 0 17px 20px; + height: 56px +} + +.gw-apps-management-wrapper .header .intro { + font-weight: 700; + font-family: PingFangSC-Medium; + font-size: 18px; + color: #333; + text-align: left; + display: inline-block +} + +.gw-apps-management-wrapper .header .searce { + float: right; + margin-right: 21px; + position: relative; + top: 0; + height: 28px +} + +.gw-apps-management-wrapper .header .searce .searce-img1 { + width: 14px; + position: relative; + right: 8px; + top: 7px; + cursor: pointer; + float: left +} + +.gw-apps-management-wrapper .header .searce .setup-img { + position: relative; + top: -1px; + margin-left: 9px +} + +.last-app-group>.app-group { + min-height: calc(100vh - 171px); + margin-bottom: 25px !important +} + +.searce .select-show-mode { + display: inline-block; + margin: 0 -2px 0 -3px +} + +.searce .select-show-mode .show-mode { + display: inline-block; + width: 30px; + height: 26px; + background: #eaeaea; + position: relative; + top: 8px; + cursor: pointer +} + +.searce .select-show-mode .show-mode img { + width: 14px; + height: 14px; + position: relative; + top: 6px; + left: 8px +} + +.searce .select-show-mode .show-mode .default-img { + display: block +} + +.searce .select-show-mode .show-mode .hover-img, +.searce .select-show-mode .show-mode .selected-img, +.searce .select-show-mode .show-mode:hover .default-img, +.searce .select-show-mode .show-mode:hover .selected-img { + display: none +} + +.searce .select-show-mode .magnetic-sticker-mode { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + margin-left: 15px; + position: relative; + left: 4px +} + +.searce .select-show-mode .all-app-mode { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + position: relative; + left: -4px +} + +.searce .select-show-mode .show-mode:hover .hover-img { + display: block +} + +.searce .select-show-mode .show-mode-active .default-img { + display: none +} + +.searce .select-show-mode .show-mode-active .selected-img { + display: block +} + +.gw-apps-management--tabs-container { + display: flex; + width: 100%; + position: relative; + padding: 9px 0 9px 19px; + border-bottom: 1px solid rgba(0, 0, 0, .06) +} + +.gw-apps-management--tabs-container .tabs-container--horizontal { + flex-wrap: nowrap; + overflow: hidden; + margin: 0; + cursor: pointer +} + +.gw-apps-management--tabs-container .tabs-container--horizontal-length { + margin-right: 65px +} + +.gw-apps-management--tabs-container .tabs-container--item { + margin-top: 1px; + flex-grow: 1; + flex-basis: auto; + position: relative; + margin-right: 2px; + height: 30px; + line-height: 30px; + flex-shrink: 0; + cursor: pointer; + list-style: none; + border-radius: 15px; + padding: 0 19px; + color: #333 +} + +.gw-apps-management--tabs-container .tabs-container--item.active { + color: #fff; + box-shadow: 0 4px 4px 0 rgba(25, 76, 164, .09) +} + +.listview---nav-vertical, +.tabs-container--vertical { + box-shadow: 0 0 6px 0 rgba(139, 139, 139, .27); + z-index: 1000 +} + +.tabs-container--vertical-smallscreen { + height: calc(100vh - 200px) !important +} + +.tabs-container--vertical { + display: none; + width: 247px; + height: 556px; + background: #fff; + overflow: auto +} + +.tabs-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.tabs-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.tabs-container--vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.tabs-container--vertical.show { + display: flex; + position: absolute; + right: 25px; + top: 51px +} + +.tabs-container--vertical .list-group { + flex: auto +} + +.tabs-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + cursor: pointer +} + +.tabs-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.searce .searce-input, +.set-up, +.tips { + position: relative +} + +.set-up, +.set-up img { + width: 14px; + height: 14px +} + +.tabs-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1 +} + +.tabs-container--vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.set-up { + cursor: pointer; + float: right; + right: 0; + top: 15px; + margin-left: 16px +} + +.set-up .set-up-img { + display: block +} + +.set-up .set-up-img-down, +.set-up .set-up-img-hover, +.set-up:hover .set-up-img { + display: none +} + +.set-up:hover .set-up-img-hover { + display: block +} + +.setUpMousedown .set-up-img, +.setUpMousedown .set-up-img-hover { + display: none !important +} + +.setUpMousedown .set-up-img-down { + display: block !important +} + +.searce .searce-input { + border: none; + outline: 0; + background: #fff; + border-radius: 20px; + width: 200px; + height: 28px; + padding-left: 12px; + padding-right: 30px; + right: -20px; + float: left; + top: 0 +} + +.searce input::-webkit-input-placeholder { + font-size: 12px; + color: #999; + text-align: left +} + +.searce input::-ms-input-placeholder { + font-size: 12px; + color: #999; + text-align: left +} + +gsp-list-index { + background-color: #fff +} + +.tips { + display: inline-block; + width: 0; + margin: 0 -2px +} + +.tips .tips-content { + position: absolute; + top: -11px; + z-index: 2; + display: none; + width: 68px; + height: 28px; + background-color: #5a676f; + border-radius: 2px; + text-align: center; + line-height: 28px; + font-size: 12px; + color: #fff; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none +} + +.tips .magnetic-sticker-mode-tips { + left: -47px +} + +.tips .list-mode-tips { + left: -51px +} + +.tips .all-app-mode-tips { + left: -55px +} + +.select-show-mode:hover .tips-content { + display: block !important +} + +.keyApplication1, +.keyApplication2, +.keyApplication3, +.module { + display: none +} + +.international-nav-container .nav a { + padding: 0 19px; + margin-right: 2px +} + +.last-app-group /deep/ .app-group .content { + min-height: calc(100vh - 235px) +} + +.last-app-group .last-app-group-height { + min-height: calc(100vh - 165px) +} + +.search-fra { + background: #FFF !important; + border: 1px solid #E0E0E0 !important; + border-radius: 4px !important +} + +.search-fra:focus { + background: #FFF !important; + border: 1px solid #0068F3 !important; + border-radius: 4px !important +} + +input::-webkit-calendar-picker-indicator { + display: none +} + +.tabs-container--dropdown { + position: absolute; + right: 0; + top: 7px; + width: 52px; + height: 36px; + background: #fff; + box-shadow: -1px 0 1px 0 rgba(0, 0, 0, .12); + cursor: pointer +} + +.tabs-container--dropdown .f-icon { + width: 36px; + height: 36px; + line-height: 36px; + text-align: center; + font-size: 18px; + color: rgba(0, 0, 0, .5) +} + +.tabs-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform .2s +} + +.module { + height: calc(100vh - 246px) +} + +.keyApplication, +.keyApplication-header-wrapper { + padding: 0 24px +} + +.keyApplication .module, +.keyApplication-header-wrapper .module-head .module-header--content { + margin-right: 54px +} + +.keyApplication-header-wrapper .module-head { + flex-shrink: 0 +} + +.keyApplication-header-wrapper .module-head .module-header--icon { + width: 20px; + height: 20px; + margin-right: 10px +} + +.keyApplication { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: flex-start; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + width: 100%; + align-content: flex-start; + align-items: flex-start; + overflow: auto +} + +.keyApplication .keyApplication::-webkit-scrollbar { + width: 7px !important; + height: 7px !important; + background-color: #8e8e8e +} + +.keyApplication .module { + position: relative; + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-content: flex-start; + align-items: flex-start; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0 +} + +.keyApplication .module .module-title { + position: absolute; + top: -33px; + width: 100%; + height: 31px; + border-bottom: 1px solid #d2deea; + font-size: 16px; + color: #333 +} + +.keyApplication .group { + width: 200px; + margin-bottom: 5px; + margin-top: 14px +} + +.keyApplication .group .group-title { + font-size: 14px; + color: #999; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: flex; + align-items: center; + padding-bottom: 14px +} + +.keyApplication .group .group-title .group-title--icon-container { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + width: 18px; + height: 9px; + margin: 0 .375rem 0 0; + padding-left: 3px +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + -moz-transform: skewX(-22deg) +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + margin-left: 4px +} + +.keyApplication .group .group-title .group-title--text { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + font-size: 14px; + color: rgba(0, 0, 0, .65) +} + +.keyApplication .group .module--list { + padding-left: 0; + margin-bottom: 0 +} + +.keyApplication .group .module--list .module--list-item { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + list-style: none; + font-size: 14px; + padding: 5px 33px 5px 10px; + margin-right: 24px; + position: relative; + color: rgba(0, 0, 0, .85) +} + +.keyApplication .group .module--list .module--list-item::after { + position: absolute; + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0 +} + +.keyApplication .group .module--list .module--list-item:hover { + cursor: pointer; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, .08) +} + +.keyApplication .group .module--list .module--list-item:hover::after { + opacity: 1 +} + +.keyApplication .group .module--list .module--list-item:hover .module--list-collect { + display: block +} + +.keyApplication .group .module--list .module--list-text { + font-size: 14px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer +} + +.keyApplication .group .module--list .module--list-collect { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + text-align: center; + cursor: pointer; + color: #FFC43B +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect, +.listview--nav-horizontal .active .tab-img { + display: block +} + +.keyApplication .group .module--list .module--list-collect .f-icon { + font-size: 15px; + line-height: 20px +} + +.keyApplication .group .module--list.f-state-collected .module--list-collect .f-icon::before { + content: '\e303' +} + +.keyApplication-active { + display: flex +} + +.keyApplication-background-show-right { + background-image: url(/platform/runtime/sys/web/assets/launcher/launchpad-show-right.svg); + background-position: 97% 92%; + background-repeat: no-repeat +} + +.listview--nav-horizontal { + overflow: hidden; + padding-left: 24px; + padding-right: 24px; + height: 52px; + width: 100%; + background-color: #fff; + position: relative; + top: -8px; + border-bottom: 2px solid #ebebeb; + margin-bottom: 12px; + flex-wrap: nowrap; + display: flex +} + +.listview--nav-horizontal .listview--nav-link { + display: inline-block; + height: 14px; + margin-right: 16px; + text-decoration: none +} + +.listview--nav-horizontal .listview--nav-link .keyApplicationName { + font-size: 16px; + color: grey; + text-align: center; + padding: 0 17px 0 20px; + height: 40px; + line-height: 40px; + margin-left: 5px; + margin-right: 5px; + position: relative; + top: 11px; + border-top-left-radius: 2px; + white-space: nowrap +} + +.listview--nav-horizontal .active .keyApplicationName { + color: #fff +} + +.listview--nav-horizontal .tab-img { + float: right; + height: 40px; + position: relative; + top: -45px; + left: 3px; + display: none +} + +.imgyinying { + background: url(../../../img/矩形@2x.png); + width: 8px +} + +.out-keyApplication { + overflow: hidden; + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0 +} + +.out-keyApplication .module-head { + position: relative +} + +.out-keyApplication .module-head .module-header--content { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 0; + border-bottom: 1px solid #e5e5e5 +} + +.out-keyApplication .module-head .module-title-img { + display: block; + width: 16px; + height: 16px; + margin-right: 10px +} + +.out-keyApplication .module-head .module-title { + width: 200px; + font-size: 15px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin: 0 +} + +.international-nav .nav-a .keyApplicationName { + font-size: 14px; + padding: 0 18px 0 20px +} + +.international-content .keyApplication .module-head .module-title { + font-size: 14px; + position: relative; + top: 2px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.international-content .keyApplication .group { + width: auto; + padding-right: 10px +} + +.international-content .keyApplication .group .group-title { + max-width: 240px +} + +.international-content .keyApplication .module .module--list-item { + font-size: 12px; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.listview--nav-container { + display: flex; + width: 100%; + position: relative; + padding-right: 22px; + overflow: auto +} + +.listview--nav-container .nav { + flex-wrap: nowrap; + overflow: hidden +} + +.listview---nav-vertical { + display: none; + width: 247px; + height: 556px; + background: #fff +} + +.listview---nav-vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.listview---nav-vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.listview---nav-vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.listview---nav-vertical.show { + display: flex; + position: absolute; + right: 25px; + top: 45px +} + +.listview---nav-vertical .list-group { + flex: auto +} + +.listview---nav-vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px +} + +.listview---nav-vertical .list-group .list-group-item.active, +.listview---nav-vertical .list-group .list-group-item:hover { + background: #ddecff +} + +.listview---nav-vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.jianyin { + width: 30px; + height: 30px; + background-color: #f6f6f6; + background: linear-gradient(to bottom, #fff, #f6f6f6); + position: absolute; + right: 52px; + opacity: 0 +} + +.btn-nav-all-dropdown, +.btn-nav-all-dropdown2 { + padding: 2px 1px 1px; + background-color: #f6f6f6; + line-height: 1 +} + +.btn-nav-all-dropdown { + flex: none; + height: 30px; + position: absolute; + right: 20px; + top: 10px +} + +.btn-nav-all-dropdown .active, +.btn-nav-all-dropdown2 .active { + top: 4px +} + +.btn-nav-all-dropdown:focus { + box-shadow: none +} + +.double-slash { + font-family: PingFangSC-Regular; + font-size: 14px !important; + color: #0F4D9E !important; + line-height: 14px; + background: -30px center no-repeat #F9F9F9; + border-radius: 2px; + height: 26px; + background-size: 50% 50%; + display: flex; + align-items: center; + padding-left: 33px +} + +.gw-apps-management--listview, +.gw-apps-management--listview .listview--keyapp-list { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column; + overflow: hidden +} + +.gw-apps-management--tileview { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + border-top: 1px solid rgba(0, 0, 0, .06); + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + overflow: hidden +} + +.gw-apps-management--tileview .tileview--nav { + width: 230px; + background: rgba(247, 249, 250, .8); + border-right: 1px solid rgba(0, 0, 0, .06); + overflow-y: auto +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--tileview .tileview--nav::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-apps-management--tileview .tileview--content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding: 0 0 24px 30px; + background: #fff; + overflow-y: auto +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--tileview .tileview--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-apps-management--tileview .tileview--app-wrapper { + padding: 0; + margin: .875rem 1rem 0 0 +} + +.tileview--menu-item-height-default { + height: 37px +} + +.menu-submenu--title-height-default { + height: 45px +} + +.menu-submenu--title, +.tileview--menu-item { + padding: 0 0 0 63px; + position: relative; + cursor: pointer +} + +.menu-submenu--title .menu-item--icon, +.tileview--menu-item .menu-item--icon { + position: absolute; + top: 12px; + left: 29px; + line-height: 21px; + overflow: hidden +} + +.menu-submenu--title .menu-item--icon .gw-icon, +.tileview--menu-item .menu-item--icon img { + font-size: 16px +} + +.menu-submenu--title .menu-item--right { + display: none; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title .menu-item--right-selected { + display: none !important; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title .menu-item--text-length, +.tileview--menu-item .menu-item--text-length { + white-space: nowrap; + overflow: hidden; + width: 127px; + text-overflow: ellipsis +} + +.menu-submenu--title .menu-item--text, +.tileview--menu-item .menu-item--text { + display: block; + line-height: 21px; + font-size: 15px; + color: rgba(0, 0, 0, .85) +} + +.menu-submenu--title .menu-item--text { + padding: .75rem 0 +} + +.tileview--menu-item .menu-item--text { + padding: .5rem 0 +} + +.menu-submenu--title:hover .menu-item--right, +.tileview--menu-item:hover .menu-item--right { + display: block; + line-height: 24px; + transform: rotate(90deg); + right: 1.2rem; + top: .95rem +} + +.menu-submenu--title:hover .menu-item--right-selected, +.tileview--menu-item:hover .menu-item--right-selected { + display: block !important; + line-height: 24px; + transform: rotate(270deg) !important; + right: 1.65rem; + top: .95rem +} + +.tileview--menu-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.tileview--menu-item-selected::after { + transform: scaleY(1) !important; + opacity: 1 !important +} + +.tileview--menu-top { + margin-top: 1px +} + +.tileview--menu .menu-list-item--arrow { + display: none; + position: absolute; + top: .75rem; + right: 1.375rem +} + +.tileview--menu .tileview--menu-item-selected .menu-list-item--arrow { + display: block +} + +.tileview--menu-submenu-open>.menu-submenu--title .menu-item--text { + color: #000 +} + +.tileview--menu-sub { + transition: all .1s linear +} + +.tileview--menu-submenu-open .tileview--menu-sub { + height: 100% +} + +.tileview--menu-image { + transform: translateX(-20px) +} + +.application-wrapper--header { + padding: 0 0 4px +} + +.application-wrapper--header-title { + display: flex; + align-items: center; + font-size: .9375rem; + font-size: 15px; + line-height: 1.3125rem; + color: rgba(0, 0, 0, .85); + margin: 0; + font-weight: 600 +} + +.application-wrapper--header-title span { + display: inline-block; + vertical-align: middle +} + +.application-list--header-title--icon { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + width: 18px; + height: 9px; + margin: 0 .375rem 0 0; + padding-left: 3px +} + +.application-list--header-title--icon .header-title--icon-item { + display: block; + width: 4px; + height: 10px; + transform: skewX(22deg); + -webkit-transform: skewX(-22deg); + -moz-transform: skewX(-22deg) +} + +.application-list--header-title--icon .header-title--icon-item-right { + margin-left: 4px +} + +.application-wrapper--content { + padding: 0 0 16px +} + +.application-wrapper--list-title { + margin-top: 8px; + margin-bottom: 18px +} + +.application-wrapper--list { + padding: 0 0 0 14px +} + +.application-wrapper--list:after { + content: ""; + display: block; + clear: both +} + +.application-wrapper--list-item { + position: relative; + width: 199px; + float: left; + padding: 5px 10px; + margin: 0 2px 0 0; + list-style: none +} + +.application-wrapper--list-item .application-wrapper--list-item-text { + font-size: 14px; + color: rgba(0, 0, 0, .85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + cursor: pointer +} + +.application-wrapper--list-item .application-wrapper--list-item-tip { + padding: 0 6px; + white-space: nowrap; + background: #FFF; + border: 1px solid #D6D6D6; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .15); + font-family: PingFangSC-Regular; + font-size: 12px; + color: #313131; + line-height: 20px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top { + width: 12px; + height: 12px; + transform: rotate(45deg); + position: absolute; + margin-top: 7px; + top: -1px; + background: #FFF; + border: 1px solid #D6D6D6; + border-radius: 2px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-frame { + width: 12px; + height: 10px; + overflow: hidden; + position: absolute; + top: -9px; + left: 12px +} + +.application-wrapper--list-item .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: none; + transition: all 0s linear .7s +} + +.application-wrapper--list-item .application-wrapper--list-item-start { + display: none; + position: absolute; + right: 4px; + top: 5px; + width: 20px; + height: 20px; + cursor: pointer +} + +.application-wrapper--list-item .application-wrapper--list-item-start .f-icon { + display: block; + margin: 0 auto; + font-size: 15px; + line-height: 20px; + color: #FFC43B +} + +.talk_input, +.talk_show { + margin: 10px auto 0 +} + +.application-wrapper--list-item::after { + position: absolute; + content: ""; + left: 0; + right: 0; + bottom: 0; + height: 1px; + opacity: 0 +} + +.application-wrapper--list-item:hover { + display: block; + box-shadow: 0 2px 4px 0 rgba(3, 62, 125, .08) +} + +.application-wrapper--list-item:hover .application-wrapper--list-item-tip-top-border { + top: 38px; + left: 70%; + position: absolute; + justify-content: center; + transform: translate(-50%, 0); + z-index: 500; + display: flex +} + +.application-wrapper--list-item:hover::after { + opacity: 1 +} + +.talk_con { + background: #f9f9f9 +} + +.talk_show { + border: 1px solid #666; + overflow: auto; + height: 400px; + width: auto +} + +.atalk, +.btalk { + margin: 10px +} + +.whotalk { + float: left; + outline: 0 +} + +.talk_word { + padding: 0; + float: left; + outline: 0; + text-indent: 10px; + width: 350px; + height: 30px +} + +.atalk span, +.btalk span { + display: inline-block; + color: #fff; + padding: 5px 10px; + border-radius: 10px +} + +.custom-class, +.talk_sub { + float: right +} + +.talk_sub { + margin-left: 10px +} + +.atalk span { + background: #0181cc +} + +.btalk { + text-align: right +} + +.btalk span { + background: #ef8201 +} + +.modal-dialog { + position: absolute; + right: 0; + bottom: 0; + margin: 0 +} + +:host { + display: flex; + flex-direction: column +} + +.notactive { + position: relative +} + +.borderactive+li>a { + padding-right: 10px; + padding-left: 12px; + font-family: PingFangSC-Regular; + color: rgba(0, 0, 0, .65); + border: 1px solid #dae0e6 !important; + border-top: 0 !important; + border-right: 0 !important; + border-bottom: 0 !important; + border-left: 0 !important; + border-top-left-radius: 0 !important +} + +.notinimg { + visibility: hidden +} + +.noimghover { + visibility: visible +} + +.btn-nav-all-dropdown2 { + flex: none; + height: 30px; + position: absolute; + right: 20px +} + +.btn-nav-all-dropdown2:focus { + box-shadow: none +} + +.down-arrow { + display: inline-block; + position: relative; + width: 28px; + height: 32px +} + +.down-arrow::after { + display: inline-block; + content: " "; + height: 9px; + width: 9px; + border-width: 0 2px 2px 0; + border-color: #999; + border-style: solid; + transform: matrix(.71, .71, -.71, .71, 0, 0); + transform-origin: center; + transition: transform .3s; + position: absolute; + top: 50%; + right: 10px; + margin-top: -10px +} + +.down-arrow.active::after { + transform-origin: center; + transform: rotate(-135deg); + transition: transform .3s +} + +.list-group-items { + height: 32px; + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px +} + +.list-group-items:hover { + background: #ddecff +} + +.list-group-items.active { + background: #c8e0ff +} + +.list-group-items:first-child { + border-radius: 0 +} + +.tabset--nav-container { + display: flex; + width: 100%; + position: relative +} + +.tabset--nav-container .active-bg { + display: none +} + +.tabset--nav-container .tabset--tab-content { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + display: flex; + flex-direction: column +} + +.tabset--nav-container .nav { + border: none +} + +.tabset--nav-container .tabset-container--dropdown { + position: absolute; + height: 36px; + line-height: 36px; + border-right: 1px solid #f0f0f0; + color: rgba(0, 0, 0, .45); + z-index: 10; + cursor: pointer; + right: 0; + top: 0; + display: flex; + flex-direction: row; + align-items: center +} + +.tabset--nav-container .tabset-container--dropdown .f-icon { + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + font-size: 18px +} + +.tabset--nav-container .tabset-container--dropdown.active .f-icon { + transform: rotate(180deg); + transition: transform .2s +} + +.tabset--nav-container .tabset-container--vertical { + display: none; + width: 247px; + background: #fff; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, .2); + z-index: 1000; + overflow: auto +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close { + font-size: 14px; + color: rgba(0, 0, 0, .15); + vertical-align: inherit +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close::before { + content: "\e11b" +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover { + color: #f74242 !important +} + +.tabset--nav-container .tabset-container--vertical .nav-link-close:hover::before { + content: "\e11d" +} + +.tabset--nav-container .tabset-container--vertical .list-group-header { + padding: 14px 24px 6px; + display: flex; + align-items: center; + justify-content: space-between +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--title { + font-size: 16px; + color: rgba(0, 0, 0, .95); + margin: 0 +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper { + font-size: 14px; + display: flex; + align-items: center; + cursor: pointer +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon { + width: 14px; + height: 14px; + margin: 0 6px 0 0; + background: #d1d5db; + border-radius: 2px +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon { + color: #fff; + font-size: 14px; + display: block +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .f-icon::before { + content: "\e11b" +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper .header--close-icon .header--close-text { + color: rgba(0, 0, 0, .85) +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:hover .header--close-icon { + background: #ff6060 +} + +.tabset--nav-container .tabset-container--vertical .list-group-header .list-group-header--close-wrapper:active .header--close-icon { + background: #f94c4c +} + +.tabset--nav-container .tabset-container--vertical.show { + display: flex; + position: fixed; + right: 1px; + top: 80px; + bottom: 1px +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.tabset--nav-container .tabset-container--vertical::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.tabset--nav-container .tabset-container--vertical .list-group { + flex: auto; + padding-left: 0; + width: 247px +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item { + border: none; + color: #333; + padding-top: 8px; + padding-bottom: 8px; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + position: absolute; + content: ''; + left: 0; + right: 0; + bottom: 0; + height: 1px; + transform: scaleY(.0001); + opacity: 0; + transition: transform .15s cubic-bezier(.215, .61, .355, 1), opacity .15s cubic-bezier(.215, .61, .355, 1) +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active, +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(144deg, #eef4ff 0, #f6fcff 100%) +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.active::after { + transform: scaleY(1); + opacity: 1 +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item:first-child { + border-radius: 0 +} + +.newdh:hover .gjdh, +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item.nav-item--apps { + display: none +} + +.newdh:hover .gjdh2 { + display: inline +} + +.gjdh2 { + display: none +} + +.tabshow { + display: inline +} + +.tabhid, +.tabset--nav-container .nav .tabset--nav-item:hover::after, +.tabset--nav-container .nav .tabset--nav-item:last-child::after { + display: none +} + +.tabset--nav-container .nav { + flex-wrap: nowrap; + overflow: inherit; + line-height: 16px; + text-align: center; + margin-right: 60px +} + +.tabset--nav-container .nav .tabset--nav-item { + flex-shrink: 0; + position: relative +} + +.tabset--nav-container .nav .tabset--nav-item.nav-item--home::before { + left: 3px +} + +.tabset--nav-container .nav .tabset--nav-item::after { + position: absolute; + content: ''; + background: #CCD2E1; + width: 1px; + right: 0; + z-index: 100; + height: 14px; + top: 50%; + margin-top: -7px; + opacity: .38 +} + +.tabset--nav-container .nav .tabset--nav-link { + border: none; + display: flex; + flex-direction: row; + align-items: center +} + +.gw-navbar-user-name::after, +.menu-userinfo-wrapper .menu-userinfo--item-name::after { + border-left: 3px solid transparent; + border-bottom: 3px solid #fff; + border-right: 3px solid #fff +} + +.tabset--nav-container .nav .tabset--nav-link-text { + display: block; + max-width: 110px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.tabset--nav-container .nav .tabset--nav-link-overlay, +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + bottom: 0; + width: 15px; + height: 15.45px; + position: relative; + float: left; + margin-left: -14px +} + +.tabset--nav-container .nav .tabset--nav-link-overlay { + background: linear-gradient(top, rgba(255, 255, 255, 0), #f5f5f5); + filter: progid:DXImageTransform.Microsoft.gradient startColorstr=#00ffffff, endColorstr=whitesmoke, GradientType=0 +} + +.tabset--nav-container .nav .tabset--nav-link-overlay-active { + background: linear-gradient(top, rgba(255, 255, 255, 0), #fafbfc); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff, endColorstr=#fafbfc, GradientType=0) +} + +.tabset--nav-container .nav .nav-link-close { + width: 15px; + height: 15px; + color: #d8d8d8; + margin-left: 24px +} + +.tabset--nav-container .nav .nav-link-close .f-icon { + vertical-align: top; + font-size: 12px; + line-height: 15px +} + +.tabset--nav-container .nav .nav-link-close:hover { + color: #f74242 !important +} + +.tabset--nav-container .nav .nav-link-close:hover .f-icon::before { + font-size: 15px; + content: "\e11d" +} + +.tabset--nav-container .nav .spanlib { + display: inline-block; + white-space: nowrap; + max-width: 230px; + overflow: hidden +} + +.tabset--nav-container .nav .tabset--nav-link.active { + box-shadow: inset 0 0 1px 0 rgba(0, 0, 0, .1); + z-index: 11 +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link { + padding: 0 19px 0 20px; + height: 38px; + line-height: 38px +} + +.tabset--nav-container .nav .nav-item--home .tabset--nav-link .nav-link-close { + display: none +} + +.tabset--nav-container .nav .nav-item--home .nav-item--home-icon { + display: inline-block; + width: 16px; + height: 16px; + background: url(../../../launcher/home-icon.svg) center center no-repeat +} + +.gw-header--menu-panel .menu-panel--close:hover::before, +.tabset--nav-container .nav .nav-item--apps, +.tabset--nav-container .nav .nav-item--apps .nav-link-close { + display: none +} + +.workarea { + overflow: hidden; + background-color: #f4f6f9 +} + +.gw-header--menu-panel-wrapper { + position: fixed; + width: 90%; + top: 40px; + left: 0; + bottom: 0; + z-index: 980; + max-width: none; + transform: translateX(-120%); + box-shadow: 0 2px 26px 0 rgba(0, 0, 0, .3) +} + +@media (min-width:1600px) { + .gw-header--menu-panel-wrapper { + width: 70%; + max-width: none + } +} + +.gw-header--menu-panel-wrapper.f-state-show { + transform: translateX(0) +} + +.gw-header--menu-panel-wrapper.f-state-hidden { + transform: translateX(-500%) +} + +.gw-header--menu-panel-mask-top { + top: 40px !important +} + +.gw-header--menu-panel-mask-bottom { + bottom: calc(100vh - 40px) !important; + background-color: transparent !important +} + +.gw-header--menu-panel-mask { + overflow: hidden; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 970; + transform: translateX(-120%); + background-color: #000; + opacity: .4 +} + +.gw-header--menu-panel-mask.f-state-show { + transform: translateX(0) +} + +.gw-header--menu-panel-mask.f-state-hidden { + transform: translateX(-120%) +} + +.gw-header--menu-panel { + min-width: 600px; + height: 100%; + margin: 0; + z-index: 982; + position: relative; + background: #fff +} + +.gw-header--menu-panel .gw-apps-management { + top: 0; + position: absolute; + background: 0 0 +} + +.gw-header--menu-panel .gw-apps-management .gw-apps-management-wrapper { + margin: 0 +} + +.gw-header--menu-panel .menu-panel--close { + position: absolute; + cursor: pointer; + z-index: 1001; + width: 56px; + height: 56px; + top: 0; + right: 0; + display: flex; + align-items: center; + justify-content: center +} + +.gw-header--menu-panel .menu-panel--close::before { + background: rgba(0, 0, 0, .06); + border-radius: .5px; + position: absolute; + left: 0; + width: 1px; + height: 14px; + content: ''; + top: 50%; + margin-top: -7px +} + +.gw-header--menu-panel .menu-panel--close .menu-panel--close-area { + width: 22px; + height: 22px; + text-align: center; + background: rgba(0, 0, 0, .1); + border-radius: 11px; + color: rgba(0, 0, 0, .5) +} + +.gw-header--menu-panel .menu-panel--close .f-icon { + font-size: 14px; + line-height: 22px +} + +.gw-header--menu-panel .menu-panel--close:hover { + background: #F6F6F6 +} + +.gw-header--menu-panel .menu-panel--close:hover .menu-panel--close-area { + color: #fff; + background: #FF6060 +} + +.menu-userinfo-wrapper { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.menu-userinfo-wrapper::after { + display: none +} + +.menu-userinfo-wrapper.active, +.menu-userinfo-wrapper.hover { + background-color: #075EBB +} + +.menu-userinfo-wrapper .menu-userinfo--item { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.menu-userinfo-wrapper .menu-userinfo--item::after { + display: none +} + +.menu-userinfo-wrapper .menu-userinfo--item-avatar { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + margin-right: 4px +} + +.menu-userinfo-wrapper .menu-userinfo--item-name { + font-size: 14px; + color: #fff; + position: relative; + opacity: .8 +} + +.menu-userinfo-wrapper .menu-userinfo--item-name::after { + content: ''; + position: absolute; + right: -7px; + bottom: 8px; + width: 0; + height: 0; + border-top: 3px solid transparent +} + +.menu-userinfo--detail { + right: 0; + min-width: 220px; + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + padding-top: 2px +} + +.menu-userinfo--detail-content { + background-color: #fff +} + +.detail-content--item, +.detail-content--user { + white-space: nowrap; + overflow: hidden; + text-align: left +} + +.detail-content--user { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 10px +} + +.detail-content--user .detail-content--user-avatar-container { + margin-right: 10px +} + +.detail-content--user .detail-content--user-avatar { + display: block; + width: 38px; + height: 38px; + border-radius: 100% +} + +.detail-content--user .detail-content--user-info { + line-height: 20px +} + +.detail-content--user .detail-content--user-info-sub { + font-size: 13px; + margin-top: 2px +} + +.detail-content--item { + line-height: 20px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + padding: 0 10px; + cursor: pointer +} + +.detail-content--item:hover { + color: #247AEC +} + +.detail-content--item .detail-content--icon { + width: 20px; + margin-right: 10px; + margin-left: 9px; + font-size: 20px +} + +.detail-content--item-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 0 +} + +.curtenant, +.setdefault, +.setdefault:hover { + font-size: 12px; + width: 64px; + line-height: 20px; + align-items: center; + height: 20px; + font-family: PingFangSC-Regular; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + align-self: start; + text-align: center +} + +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-readonly .form-wrap .form-input-wrap .input-group input { + border: 0 +} + +.setdefault { + border-radius: 10px; + color: #666; + flex-shrink: 0; + justify-content: flex-end; + flex-direction: row +} + +.curtenant, +.setdefault:hover { + border-radius: 10px; + color: #fff; + flex-shrink: 0; + justify-content: flex-end; + flex-direction: row +} + +.tenant-title { + font-family: PingFangSC-Regular; + font-size: 14px; + color: rgba(0, 0, 0, .85); + letter-spacing: -.38px; + display: flex; + align-items: center; + width: 94px; + flex-shrink: 0; + margin-left: .75rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + justify-content: flex-start; + flex-direction: row; + align-self: start; + margin-right: 20px +} + +.name-space { + height: 38px +} + +.gw-navbar-user-dropdown { + position: relative; + padding: 0 16px 0 14px; + cursor: pointer +} + +.gw-navbar-user-dropdown.active.gw-navbar-user-name { + opacity: 1 +} + +.gw-navbar-user-dropdown.gw-navbar-user-dropdown-hover .gw-navbar-user-info-detail { + display: block !important +} + +.gw-navbar-user-info { + display: flex; + flex-direction: row; + align-items: center; + line-height: 38px +} + +.gw-navbar-user-avatar { + display: inline-block; + width: 20px; + height: 20px; + border-radius: 100%; + margin-right: 4px +} + +.gw-navbar-user-name { + font-size: 14px; + color: #fff; + position: relative; + opacity: .8 +} + +.gw-navbar-user-name::after { + content: ''; + position: absolute; + right: -7px; + bottom: 8px; + width: 0; + height: 0; + border-top: 3px solid transparent +} + +.gw-navbar-user-info-detail { + position: absolute; + right: 0; + top: calc(100% + 1px); + z-index: 1000; + min-width: 220px +} + +.gw-navbar-user-info-content { + background-color: #fff; + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border: 1px solid rgba(56, 138, 255, .2); + border-radius: 2px +} + +.gw-navbar-user-info-content--menu { + background-color: #fff; + border-radius: 2px +} + +.gw-navbar-user-info-content-list-item { + line-height: 20px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + white-space: nowrap; + overflow: hidden; + text-align: left; + cursor: pointer +} + +.gw-navbar-user-info-content-list-item .user-item-icon { + width: 20px; + margin-right: 10px; + margin-left: 9px; + font-size: 18px +} + +.gw-navbar-user-info-content-list-item .user-item-icon::before { + vertical-align: bottom +} + +.gw-navbar-user-info-content-list-msg { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 10px +} + +.gw-navbar-user-info-content-list-msg .user-item-img { + width: 38px; + height: 38px; + margin-right: 10px +} + +.gw-navbar-user-info-content-list-msg .user-item-img img { + display: block; + width: 38px; + height: 38px; + border-radius: 100% +} + +.gw-navbar-user-info-content-list-msg .user-item-data { + font-size: 14px; + font-weight: 400; + color: rgba(0, 0, 0, .8) +} + +.gw-navbar-user-info-content-list-msg .user-item-data .user-item-data-section { + font-size: 13px; + margin-top: 2px +} + +.gw-navbar-user-info-content-list-item.item-setting-list { + color: rgba(0, 0, 0, .85); + padding: 0 14px +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { + display: flex; + flex-direction: row; + align-items: center; + padding: 12px 0 +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-size, +.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { + width: 14px; + height: 14px +} + +.dialog-user-edit { + display: flex; + flex-direction: row; + align-items: center; + padding: 16px 26px; + padding-left: 18px !important +} + +.dialog-user-edit .dialog-user-edit-icon { + margin-right: 12px; + font-size: 22px; + color: #f49730 +} + +.dialog-user-edit .dialog-user-edit-text { + font-size: 16px; + color: #000 +} + +.gw-user-edit-dialog { + display: none +} + +.gw-user-edit-dialog.show { + display: block +} + +.gw-user-edit-modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + overflow: hidden; + outline: 0 +} + +.gw-user-edit-modal .modal-dialog { + transform: translate(0, 0); + width: 420px; + height: 180px; + margin-left: -210px !important; + margin-top: -90px !important +} + +.edit-modal-dialog { + position: absolute; + width: 420px; + height: 180px; + left: 50%; + top: 50%; + margin-left: -210px; + margin-top: -90px +} + +.edit-modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + border: 0 solid rgba(0, 0, 0, .2); + border-radius: 2px; + box-shadow: 0 4px 12px 0 rgba(0, 0, 0, .2); + outline: 0 +} + +.edit-modal-header { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #e2e8f0; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + flex-shrink: 0; + background: #fff; + color: #000; + padding: 12px 8px 12px 18px +} + +.edit-modal-title { + margin-bottom: 0; + line-height: 22px; + font-size: 16px +} + +.edit-modal-actions { + flex: 1; + margin: -4px 0; + display: flex; + justify-content: flex-end +} + +.edit-modal-actions-close { + padding: 2px; + color: #bfbfbf; + cursor: pointer +} + +.edit-modal-actions-close:hover { + color: rgba(0, 0, 0, .85) +} + +.edit-modal-body { + height: auto; + overflow: hidden +} + +.edit-modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + flex-shrink: 0; + padding: 16px 20px 20px +} + +.edit-modal-footer .btn { + margin-right: 8px; + padding: 4px 15px; + line-height: 20px !important; + font-size: 14px +} + +.edit-modal-footer .btn:last-child { + margin-right: 0 +} + +.gw-user-edit-modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: rgba(0, 0, 0, .15) +} + +.tab-list-menu-back { + background: #FDFEFF; + box-shadow: 0 0 10px 0 rgba(57, 66, 100, .1); + border-radius: 4px +} + +.tab-list-menu-back-item-name { + font-family: PingFangSC-Regular; + font-size: 14px; + letter-spacing: -.38px; + text-align: right; + z-index: 980 +} + +.tab-list-menu-back-item-out { + height: 37.5px; + border-radius: 4px; + margin: 0 3px +} + +.tab-list-menu-back-item-out-content { + display: flex; + flex-direction: row; + align-items: center; + line-height: 37.5px +} + +.tab-list-menu-whole { + position: absolute; + z-index: 1000; + width: auto; + top: 30px !important; + display: none +} + +.tab-list-menu-whole-menu { + position: absolute; + z-index: 1000; + width: auto; + top: 100% !important +} + +.tab-list-menu-whole-menu-mask { + overflow: hidden; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 970; + transform: translateX(-120%); + background-color: transparent; + opacity: .4 +} + +.tab-list-menu-whole-menu-mask-state-show { + transform: translateX(0) +} + +.tab-list-menu-whole-menu-mask-state-hidden { + transform: translateX(-500%) +} + +.gw-view-tiled--container { + display: flex; + flex-direction: column; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0 +} + +.gw-view-tiled--container .gw-view-tiled--nav { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px 24px 8px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select { + position: relative; + width: 218px; + margin-right: 18px; + background: #fff; + border: 1px solid rgba(0, 0, 0, .08); + border-radius: 2px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select { + position: relative; + display: flex; + flex-direction: row; + align-items: center; + height: 28px; + padding: 0 36px 0 10px; + line-height: 28px; + cursor: pointer +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-text { + font-size: 15px; + color: rgba(0, 0, 0, .85); + margin-right: 8px; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-select .select-arrow { + position: absolute; + right: 0; + top: 1px; + width: 30px; + height: 26px; + cursor: pointer; + font-size: 12px; + color: rgba(0, 0, 0, .85) +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { + display: none; + position: absolute; + left: 0; + top: 30px; + width: 218px; + z-index: 999; + background: #fff; + box-shadow: 0 4px 6px 0 rgba(139, 139, 139, .1); + max-height: calc(100vh - 200px); + overflow: auto +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item { + height: 36px; + padding-left: 10px; + line-height: 36px; + font-size: 14px; + color: #333; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all.gw-view-tiled--nav-show-all-true { + display: block +} + +.gw-view-tiled--container .gw-view-tiled--content { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 16px 24px; + overflow-y: auto +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-view-tiled--container .gw-view-tiled--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item { + display: inline-block; + position: relative; + width: 240px; + height: 80px; + padding: 17px 58px 17px 14px; + margin-right: 14px; + margin-bottom: 18px; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, .06); + border-radius: 2px; + transition: all .2s +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon { + flex-shrink: 0; + width: 46px; + height: 46px; + margin-right: 10px +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-icon img { + display: block; + width: 36px; + height: 36px; + margin: 5px auto +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item .gw-view-tiled--item-inner .gw-view-tiled--item-title { + font-size: 14px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item::after { + position: absolute; + content: '\e302'; + right: 10px; + top: 10px; + width: 20px; + height: 20px; + line-height: 20px; + text-align: center; + cursor: pointer; + font-size: 14px; + color: #FFC43B; + font-family: FarrisExtend; + text-transform: none; + display: none +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item.f-state-collected::after { + display: inline-block; + content: '\e303' +} + +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, .06) +} + +.menu-search-wrapper { + height: 40px; + transition: all .2s linear; + transform: translateY(-40px); + margin: 0 24px 0 0 +} + +.menu-search-wrapper.f-state-focus { + transform: translateY(0) +} + +.menu-search-wrapper .menu-search--placerholder { + position: relative; + height: 40px; + line-height: 40px; + padding-right: 22px; + text-align: right +} + +.menu-search-wrapper .menu-search--placerholder .f-icon-search { + margin-right: 10px; + color: #fff +} + +.menu-search-wrapper .menu-search--placerholder .menu-search--placerholder-text { + display: inline-block; + line-height: 18px; + font-size: 13px; + color: rgba(255, 255, 255, .49) +} + +.menu-search-wrapper .menu-search--placerholder::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .5) +} + +.menu-search-wrapper .menu-search--search { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select { + position: relative; + padding: 0 8px 0 16px; + height: 40px; + line-height: 40px; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-text { + font-size: 14px; + color: rgba(255, 255, 255, .85) +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select .menu-search--search-select-arrow { + margin-left: 5px; + font-size: 14px; + color: #fff +} + +.menu-search-wrapper .menu-search--search .menu-search--search-select::after { + content: ''; + position: absolute; + right: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .3) +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + height: 40px; + padding: 0 6px +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input { + display: block; + height: 40px; + line-height: 40px; + border: 0; + box-shadow: none; + font-size: 14px; + color: #fff; + background: 0 0 +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-append { + padding-right: 13px; + height: 40px; + line-height: 40px; + color: #fff; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear { + position: relative; + padding-left: 13px; + color: #fff; + cursor: pointer +} + +.menu-search-wrapper .menu-search--search .menu-search--search-form .menu-search--search-input-clear::after { + content: ''; + position: absolute; + left: 0; + top: 50%; + width: 1px; + height: 16px; + margin-top: -8px; + background: rgba(255, 255, 255, .3) +} + +.menu-colllection-wrapper .dropdown-toggle::after { + display: none +} + +.menu-colllection-wrapper .menu-colllection--detail { + width: 280px +} + +.menu-colllection-wrapper .menu-colllection--detail-title { + padding: 6px 16px 8px; + font-size: 13px; + color: rgba(0, 0, 0, .6) +} + +.menu-colllection-wrapper .menu-colllection--detail-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 11px 15px; + cursor: pointer +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img { + width: 28px; + height: 28px +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-img img { + display: block; + width: 28px; + height: 28px +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content { + flex: 1; + padding-left: 14px; + overflow: hidden +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-title { + margin-bottom: 3px; + line-height: 18px; + font-size: 13px; + color: rgba(0, 0, 0, .85); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.menu-colllection-wrapper .menu-colllection--detail-item .item-content-subtitle { + line-height: 16px; + font-size: 12px; + color: rgba(0, 0, 0, .3); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-single-app-wrapper { + position: relative; + width: 198px; + height: 116px; + padding: 12px 18px; + margin-right: 14px; + margin-bottom: 14px; + background: #FFF; + border: 1px solid #EBEEF2; + box-shadow: 2px 2px 16px 0 rgba(3, 27, 78, .06); + border-radius: 2px; + transition: all .2s +} + +.gw-single-app-wrapper:hover { + transform: translateY(-5px); + box-shadow: 2px 2px 10px 0 rgba(0, 28, 64, .06) +} + +.gw-single-app--title { + padding-right: 20px; + margin-bottom: 4px; + font-size: 14px; + color: rgba(0, 0, 0, .85); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-single-app--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, .45); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.gw-single-app--icon-container { + position: absolute; + right: 14px; + bottom: 12px +} + +.gw-single-app--icon-container img { + width: 36px; + height: 36px +} + +.gw-app-group--header { + display: flex; + flex-direction: row; + align-items: center; + padding-bottom: 14px; + margin-right: 10px +} + +.gw-app-group--header .header--icon-container { + width: 20px; + height: 20px; + margin: 0 10px 0 0; + line-height: 20px +} + +.gw-app-group--header .header--icon-container .header--icon { + font-size: 20px; + color: rgba(0, 0, 0, .45) +} + +.gw-app-group--header .header--title { + font-size: 14px; + color: rgba(0, 0, 0, .75); + margin-right: 6px +} + +.gw-app-group--header .header--subtitle { + font-size: 12px; + color: rgba(0, 0, 0, .3) +} + +.gw-app-group-wrapper { + padding: 10px 0 0 +} + +.gw-app-group--list { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-bottom: 0 +} + +.gw-apps-management { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + overflow: hidden; + display: flex; + flex-direction: column; + position: fixed; + top: 40px; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + background-color: rgba(0, 0, 0, .15) +} + +.gw-apps-management .gw-apps-management--close { + position: absolute; + right: 24px; + top: 17px; + width: 22px; + height: 22px; + cursor: pointer +} + +.gw-apps-management .gw-apps-management--close .f-icon { + font-size: 22px; + color: rgba(0, 0, 0, .06) +} + +.gw-apps-management .gw-apps-management--close:hover .f-icon { + color: rgba(0, 0, 0, .25) +} + +.gw-apps-management--header { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + padding: 10px 56px 10px 21px +} + +.gw-apps-management--header .header--caption { + display: flex; + flex-direction: row; + align-items: center +} + +.gw-apps-management--header .header--caption .header--caption-logo { + padding-right: 11px +} + +.gw-apps-management--header .header--caption .header--caption-logo img { + display: block; + width: 30px; + height: 30px +} + +.gw-apps-management--header .header--caption .header--caption-title { + font-size: 18px; + color: #000 +} + +.gw-apps-management--header .header--search { + position: relative; + max-width: 508px; + height: 36px; + padding: 0 14px 0 34px; + margin: 0 auto; + border-radius: 18px +} + +.gw-apps-management--header .header--search .search--input { + display: block; + height: 34px; + border: 0; + box-shadow: none; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.gw-apps-management--header .header--search .search--append { + position: absolute; + left: 14px; + top: 0 +} + +.gw-apps-management--header .header--search .search--append .f-icon { + display: block; + height: 34px; + line-height: 34px; + font-size: 18px +} + +.gw-apps-management--header .header--search .search--placeholder { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + position: absolute; + left: -1px; + top: -1px; + width: calc(100% + 2px); + height: 36px; + line-height: 36px; + border-radius: 18px +} + +.gw-apps-management--header .header--search .search--placeholder .f-icon { + display: block; + margin-right: 14px; + color: #979797 +} + +.gw-apps-management--header .header--search .search--placeholder .search--placeholder-text { + font-size: 14px; + color: rgba(0, 0, 0, .25) +} + +.gw-apps-management--header .header--search .search--result-panel { + position: absolute; + top: 40px; + left: 0; + right: 0; + padding: 10px 18px 0; + background: #FFF; + border: 1px solid rgba(56, 138, 255, .2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + z-index: 100; + max-height: 310px; + overflow-y: auto +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-title { + font-size: 13px; + color: rgba(0, 0, 0, .6) +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list { + margin: 8px -18px +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + list-style: none; + height: 30px; + line-height: 30px; + padding: 0 18px; + cursor: pointer +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-name { + display: flex; + flex-direction: row; + align-items: center; + font-size: 14px; + color: rgba(0, 0, 0, .85) +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item-path { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0; + padding-left: 16px; + font-size: 12px; + color: rgba(0, 0, 0, .45); + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-more { + height: 40px; + line-height: 40px; + text-align: center; + border-top: 1px solid #ECECEC; + font-size: 12px; + color: rgba(0, 0, 0, .75); + cursor: pointer; + margin: 0 -18px +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: wrap; + margin-top: 14px +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item { + height: 20px; + padding: 0 10px; + margin: 0 10px 14px 0; + background: rgba(219, 224, 230, .5); + border-radius: 13px; + font-size: 13px; + line-height: 20px; + color: #8A96A5; + list-style: none; + cursor: pointer +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + color: #fff; + box-shadow: 0 2px 4px 0 rgba(25, 76, 164, .09) +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover .match { + color: #fff +} + +.gw-apps-management--header .header--search .search--prompt-panel { + padding-bottom: 14px +} + +.gw-apps-management--header .header--view { + flex-shrink: 0; + display: flex; + flex-direction: row; + align-items: center +} + +.gw-apps-management--header .header--view .view--btn { + text-align: center; + white-space: nowrap; + vertical-align: middle; + padding: 0 10px; + line-height: 28px; + background: rgba(240, 240, 240, .6); + margin-left: -1px; + cursor: pointer +} + +.gw-apps-management--header .header--view .view--btn .view--btn-icon { + font-size: 13px; + color: rgba(0, 0, 0, .2) +} + +.gw-apps-management--header .header--view .view--btn.active { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, .06) +} + +.gw-apps-management--header .header--view .view--btn.active .view--btn-icon { + color: #fff +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) { + border-radius: 2px; + box-shadow: 0 0 4px 0 rgba(0, 0, 0, .06); + position: relative +} + +.gw-apps-management--header .header--view .view--btn:hover:not(.active) .view--btn-icon { + color: #fff +} + +.gw-apps-management--header .header--view .view--btn:first-child { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px +} + +.gw-apps-management--header .header--view .view--btn:last-child { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px +} + +.gw-apps-management--header .header--settings { + position: relative +} + +.gw-apps-management--header .header--settings .header--settings-icon { + display: inline-block; + height: 28px; + width: 48px; + text-align: center; + line-height: 28px; + color: #979797; + cursor: pointer +} + +.gw-apps-management--header .header--settings .header--settings-panel { + position: absolute; + background: #FFF; + border: 1px solid rgba(56, 138, 255, .2); + box-shadow: 0 2px 10px 0 rgba(0, 0, 0, .1); + border-radius: 2px; + padding: 16px 14px; + top: 34px; + width: 162px; + right: 0; + opacity: 0; + transition: opacity .1s linear +} + +.gw-apps-management--header .header--settings .header--settings-panel.f-state-show { + opacity: 1 +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow { + width: 16px; + height: 8px; + margin: 0 2px; + position: absolute; + top: -8px; + right: 13px +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::before { + content: ''; + position: absolute; + border-width: 0 .5rem .5rem; + border-color: transparent; + border-style: solid; + border-bottom-color: rgba(56, 138, 255, .2); + top: 0 +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--arrow::after { + content: ''; + position: absolute; + border-color: transparent transparent #fff; + border-style: solid; + border-width: 0 .5rem .5rem; + top: 1px +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--content { + font-size: 13px; + color: rgba(0, 0, 0, .8) +} + +.gw-apps-management--header .header--settings .header--settings-panel .settings-panel--item { + display: flex; + align-items: center; + justify-content: space-between +} + +.gw-apps-management--content { + overflow-y: auto; + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + padding: 20px 0 20px 24px +} + +.gw-apps-management--content::-webkit-scrollbar { + width: 7px; + height: 7px; + background-color: #8e8e8e +} + +.gw-apps-management--content::-webkit-scrollbar-track { + border-radius: 0; + background-color: #fff; + border: none; + background-clip: padding-box; + border-right: none +} + +.gw-apps-management--content::-webkit-scrollbar-thumb { + background-color: #dbdbdb; + border: none; + background-clip: content-box; + opacity: .6; + transform: rotate(90deg); + border-radius: 3px +} + +.search--result-item-keyboard--control { + display: flex; + flex-direction: row; + align-items: center; + flex-wrap: nowrap; + list-style: none; + height: 30px; + line-height: 30px; + padding: 0 18px; + cursor: pointer +} + +.launchpad-full-view { + margin-right: 16px +} + +.launchpad-full-icon { + transform: rotate(180deg) +} + +.launchpad-full { + margin-bottom: 2px; + cursor: pointer +} + +.gw-switch { + position: relative; + display: inline-block; + box-sizing: content-box; + padding: 0; + margin: 0; + cursor: pointer; + transition: .3s ease-out all; + -webkit-transition: .3s ease-out all; + white-space: nowrap; + min-width: 32px; + height: 18px; + border-radius: 20px; + background-color: #d9d9d9 +} + +.gw-switch.f-state-checked { + background: #49C265 +} + +.gw-switch.f-state-checked small { + right: 2px; + left: auto +} + +.gw-switch small { + left: 2px; + border-radius: 100%; + position: absolute; + top: 1px; + transition: .2s ease-out all; + -webkit-transition: .3s ease-out all; + background: #fff; + width: 16px; + height: 16px; + font-size: 80% +} + +.f-component-walk-page.active { + display: block +} + +.f-component-walk-page .f-page-walker-detail-wrapper { + position: absolute; + z-index: 333333 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-img { + background: 0 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content { + position: absolute +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-right { + left: calc(100% + 6px); + top: -13px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-left { + right: calc(100% + 6px); + top: -13px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-bottom, +.f-component-walk-page .f-page-walker-detail-wrapper-content-leftBottom { + top: calc(100% + 6px); + left: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-top { + bottom: calc(100% + 6px); + left: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow { + position: absolute; + display: block; + width: 12px; + height: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default { + box-shadow: 0 3px 10px 0 rgba(0, 0, 0, .15); + border-radius: 2px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top { + margin-bottom: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow { + bottom: -12px; + left: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-top .f-page-walker-detail-arrow::after { + border-width: 10px 8px 0; + bottom: 2px; + border-top-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right { + margin-left: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow { + left: -12px; + top: 28px; + width: 12px; + height: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-right .f-page-walker-detail-arrow::after { + border-width: 8px 10px 8px 0; + left: 2px; + border-right-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom { + margin-top: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow { + top: -12px; + left: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-bottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px; + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left { + margin-right: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow { + top: 28px; + right: -12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-left .f-page-walker-detail-arrow::after { + border-width: 8px 0 8px 10px; + right: 2px; + border-left-color: #fff +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom { + margin-top: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow { + top: -12px; + right: 12px; + width: 16px; + height: 12px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content-default.f-page-walker-detail-wrapper-content-leftBottom .f-page-walker-detail-arrow::after { + border-width: 0 8px 10px; + top: 2px; + border-bottom-color: #fff; + box-shadow: -2px -2px 5px rgba(0, 0, 0, .08) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-default { + box-shadow: 0 2px 10px 0 rgba(38, 40, 56, .23) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner { + position: relative; + display: flex; + flex-direction: column; + min-width: 419px; + min-height: 165px; + padding: 24px 12px; + background-color: #fff; + border-radius: 3px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content { + position: relative; + min-height: 60px; + padding-left: 74px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img { + position: absolute; + left: 0; + top: 0; + width: 60px; + height: 60px; + border-radius: 3px; + overflow: hidden +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-img img { + display: block; + width: 60px; + height: 60px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title { + display: flex; + flex-direction: row; + align-items: center +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number { + flex-shrink: 0; + padding-right: 6px; + font-size: 12px; + color: rgba(0, 0, 0, .85) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-number-current { + font-size: 16px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-title .f-page-walker-detail-title-text { + font-size: 16px; + color: rgba(0, 0, 0, .85); + font-weight: 600; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-content .f-page-walker-detail-text .f-page-walker-detail-subtitle { + flex-shrink: 1; + flex-grow: 1; + flex-basis: 0; + margin-top: 6px; + font-size: 13px; + min-height: 44px; + color: rgba(0, 0, 0, .65); + line-height: 22px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns { + display: flex; + flex-direction: row; + align-items: center; + padding-top: 17px; + padding-right: 10px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn { + flex-grow: 1; + flex-shrink: 0; + flex-basis: 0; + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn { + margin-right: 6px +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-inner-btns .f-page-walker-detail-inner-btn .btn:last-child { + margin-right: 0 +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close { + position: absolute; + right: 10px; + top: 10px; + width: 30px; + height: 30px; + line-height: 30px; + text-align: center; + cursor: pointer +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close .f-icon { + font-size: 18px; + color: rgba(0, 0, 0, .45) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-inner .f-page-walker-detail-close:hover .f-icon { + color: rgba(0, 0, 0, .85) +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip { + display: flex; + flex-direction: row; + align-items: center; + padding-left: 74px; + background-color: #fff +} + +.f-component-walk-page .f-page-walker-detail-wrapper-content .f-page-walker-detail-skip .btn { + color: rgba(0, 0, 0, .35) +} + +.user-setting { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0 +} + +.user-setting-list { + width: 286px; + min-width: 286px; + background-color: #fff; + overflow-y: auto; + overflow-x: hidden +} + +.user-setting-list .user-setting-message { + padding-bottom: 32px; + padding-top: 32px +} + +.user-setting-list .user-setting-message .user-avatar { + width: 86px; + height: 86px; + margin: 0 auto 18px; + position: relative +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-img { + display: block; + width: 86px; + height: 86px; + border-radius: 100% +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-icon { + position: absolute; + width: 86px; + height: 86px; + border-radius: 100%; + background: rgba(0, 0, 0, .3); + top: 0; + left: 0; + line-height: 86px; + text-align: center; + display: none +} + +.user-setting-list .user-setting-message .user-avatar:hover .user-avatar-icon { + display: block +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-icon .f-icon { + font-size: 24px; + color: #fff +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex { + position: absolute; + width: 22px; + height: 22px; + line-height: 22px; + border: 1px solid #fff; + right: 0; + bottom: 0; + border-radius: 100%; + color: #fff; + text-align: center +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex .f-icon { + font-size: 12px; + vertical-align: initial +} + +.user-setting-list .user-setting-message .user-title { + text-align: center +} + +.user-setting-list .user-setting-message .user-title .user-name { + font-size: 16px; + color: rgba(0, 0, 0, .75); + margin-bottom: 6px +} + +.user-setting-list .user-setting-message .user-title .user-post { + font-size: 12px; + color: rgba(0, 0, 0, .45) +} + +.user-setting-list .user-setting-menu { + padding: 24px 0; + border-top: 1px solid #f0f0f0 +} + +.user-setting-list .user-setting-menu .menu-item-inner { + width: 286px; + height: 48px; + line-height: 48px; + padding-left: 38px; + padding-right: 20px; + cursor: pointer +} + +.user-setting-list .user-setting-menu .menu-item-inner.active { + padding-left: 35px +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-title { + display: flex; + flex-direction: row; + align-items: center +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-icon { + margin-right: 18px +} + +.user-setting-list .user-setting-menu .menu-item-inner .menu-item-text { + font-size: 14px; + color: rgba(0, 0, 0, .75); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis +} + +.user-setting-content { + flex-grow: 1; + padding: 0 10px 10px; + overflow-x: auto; + overflow-y: hidden +} + +.user-setting-content-inner { + height: 100%; + background: #fff; + padding: 24px; + overflow-y: auto +} + +.user-setting-content-wrapper-title { + color: #000; + display: inline-flex; + align-items: center; + line-height: 1.375rem; + position: relative; + overflow: hidden; + padding: 0 0 0 1rem; + min-width: 760px +} + +.user-setting-content-wrapper-title::before { + content: ''; + width: .25rem; + height: 1.125rem; + border-radius: 1px; + position: absolute; + top: 50%; + left: 0; + margin-top: -.5625rem +} + +.user-setting-content-wrapper-title .title-text { + font-size: 1rem; + line-height: 1.375rem; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-bottom: 0; + margin-right: 10px +} + +.user-setting-content-wrapper-title .title-line { + flex-grow: 1; + border-bottom: 1px dashed rgba(0, 0, 0, .1) +} + +.user-setting-content-wrapper-title .title-edit-btn { + font-size: 14px; + padding-left: 10px; + cursor: pointer +} + +.user-setting-content-wrapper-title .title-edit-btn .f-icon { + font-size: 14px; + margin-right: 4px; + vertical-align: inherit +} + +.user-setting-content-wrapper-main { + padding: 27px 0 32px +} + +.user-setting-content-wrapper-main .user-setting-form { + padding-left: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap { + max-width: 25rem; + display: flex; + flex-grow: 0; + flex-shrink: 0; + flex-basis: auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: .875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-btns { + margin-bottom: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-label { + display: flex; + align-items: center; + width: 6rem; + flex-shrink: 0; + margin-right: .75rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + justify-content: flex-end; + flex-direction: row; + align-self: start; + height: 1.875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap { + flex-grow: 1; + flex-shrink: 1; + flex-basis: auto +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-input-wrap-tip { + font-size: 14px; + color: rgba(0, 0, 0, .45); + margin-top: 10px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-wrap .form-control { + height: 28px !important +} + +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .form-control, +.user-setting-content-wrapper-main .user-setting-form.user-setting-form-edit .form-wrap .form-input-wrap .input-group { + border: 1px solid transparent; + border-bottom-color: #ececec +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn { + margin-left: 10px; + padding-top: 4px; + padding-bottom: 4px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn:first-child { + margin-left: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-btns .btn-link { + color: rgba(0, 0, 0, .75) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size { + display: flex; + flex-direction: row +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list { + margin-right: 40px; + position: relative; + cursor: pointer +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list:last-child, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list:last-child { + margin-right: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { + width: 50px; + height: 50px; + border-radius: 100% +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-red .theme-color-list-img { + background-color: rgba(217, 38, 44, .9) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.theme-color-list-green .theme-color-list-img { + background-color: rgba(0, 192, 222, .9) +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-name, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-name { + font-size: 14px; + color: rgba(0, 0, 0, .65); + margin-top: 14px; + text-align: center +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + content: ''; + position: absolute; + width: 58px; + height: 58px; + background: 0 0; + left: -4px; + top: -4px; + border-radius: 100% +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { + position: absolute; + right: -1px; + top: 35px; + border-radius: 100%; + background-color: #fff; + display: none +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check .f-icon, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check .f-icon { + display: block; + width: 16px; + height: 16px; + vertical-align: inherit; + border-radius: 100%; + border: 1px solid #fff; + font-size: 14px; + overflow: hidden +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active .theme-size-list-check { + display: block +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-img { + width: 64px; + height: 52px; + overflow: hidden +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + width: 72px; + height: 60px; + border-radius: 0 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check { + right: -10px; + top: 45px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color { + margin-bottom: 44px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-color .form-label { + height: 50px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-size .form-label { + height: 60px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto { + min-width: 43.875rem +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap { + display: flex; + flex-direction: row +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list { + flex: 1; + padding-right: 10px +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap.form-wrap-auto .form-input-wrap farris-combo-list:last-child { + padding-right: 0 +} + +.dialog-user-avatar-tips { + padding: 0 24px 14px; + margin-top: 12px; + font-size: 12px; + color: rgba(0, 0, 0, .45) +} + +.dialog-user-avatar { + padding: 24px 32px 0 24px; + display: flex; + flex-direction: row +} + +.dialog-user-avatar-change { + padding-right: 36px; + border-right: 1px solid #EFEFEF +} + +.dialog-user-avatar-view { + padding-left: 36px +} + +.dialog-user-avatar-view .avatar-view-title { + font-size: 14px; + color: rgba(0, 0, 0, .75); + text-align: center; + margin-bottom: 15px +} + +.dialog-user-avatar-view .avatar-view-size { + margin-bottom: 32px +} + +.dialog-user-avatar-view .avatar-view-size:last-child { + margin-bottom: 0 +} + +.dialog-user-avatar-view .avatar-view-size .img { + display: block; + width: 100px; + height: 100px; + border-radius: 100%; + overflow: hidden; + margin: 0 auto; + border: 1px solid #EFEFEF +} + +.dialog-user-avatar-view .avatar-view-size .avatar-view-size-text { + font-size: 12px; + color: rgba(0, 0, 0, .45); + display: block; + text-align: center; + margin-top: 10px +} + +.mode-active, +.searce .select-show-mode .show-mode-active, +.subcount-info:hover { + color: #CF242A !important +} + +.dialog-user-avatar-view .avatar-view-size.avatar-view-size-small .img { + width: 50px; + height: 50px +} + +.isdisplay { + display: none +} + +.themesdefault { + background-color: #C81217 +} + +.themesdefault:hover { + background-color: #FF9191 +} + +.gw-header { + background: linear-gradient(207deg, #E53131 0, #CF242A 100%) +} + +.gw-header .gw-header--exitfullscreen-wrapper { + border-top: 1px solid #CF242A +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn { + background: url(../../../img/orishow-red.svg) no-repeat +} + +.gw-header .gw-header--exitfullscreen-wrapper .gw-header--exitfullscreen-btn:hover { + background-image: url(../../../img/passshow-red.svg) no-repeat +} + +.gw-header--application-icon-container.f-state-active, +.gw-header--application-icon-container:hover { + background: linear-gradient(269deg, #af0303 0, #BB0707 50%, #af0303 100%) +} + +.gw-header-toolbar--content:hover { + background-color: #D5161B +} + +.gw-apps-management--tabs-container .tabs-container--item.active { + background-image: linear-gradient(225deg, #F52828 0, #D2171E 100%) +} + +.tabs-container--vertical .list-group .list-group-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #B60808 26%, #D2171E 67%, rgba(9, 113, 255, .13) 95%) !important +} + +.tabs-container--vertical .list-group .list-group-item.active, +.tabs-container--vertical .list-group .list-group-item:hover { + background-image: linear-gradient(243deg, #F6EFEF 0, #F6EFEF 26%, #F6EFEF 67%, #F6EFEF 95%) !important +} + +.keyApplication .group .module--list .module--list-item::after { + background-image: linear-gradient(90deg, #ECECEC 0, #D0242A 50%, #FFD3D3 100%) +} + +.keyApplication .group .module--list .module--list-item:hover { + color: #C81217 +} + +.listview--nav-horizontal .active .keyApplicationName { + background-color: #C81217 +} + +.menu-submenu--title .menu-item--icon .gw-icon, +.tileview--menu-item .menu-item--icon img { + color: #DD1C21 +} + +.menu-submenu--title-selected { + color: #C81217 !important +} + +.menu-submenu--title:hover, +.menu-submenu--title:hover .menu-item--text, +.tileview--menu-item:hover, +.tileview--menu-item:hover .menu-item--text { + color: #C81217 +} + +.tileview--menu-item-selected { + color: #D5161B; + background: #FBEEEE +} + +.tileview--menu .menu-list-item--arrow, +.tileview--menu-item-selected .menu-item--text { + color: #D5161B +} + +.application-list--header-title--icon .header-title--icon-item { + background: rgba(208, 37, 42, .9) +} + +.application-list--header-title--icon .header-title--icon-item-right { + background: rgba(207, 36, 42, .5) +} + +.application-wrapper--list-item::after { + background-image: linear-gradient(90deg, #ECECEC 0, #D0242A 50%, #FFD3D3 100%) +} + +.application-wrapper--list-item:hover .application-wrapper--list-item-text { + color: #C81217 +} + +.tileview--menu-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #B60808 26%, #D2171E 67%, rgba(9, 113, 255, .13) 95%) +} + +.keyApplication-header-wrapper .module-head .module-header--icon { + color: #DD1C21 +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon { + background: rgba(208, 37, 42, .9) +} + +.keyApplication .group .group-title .group-title--icon-container .group-title--icon-right { + background: rgba(207, 36, 42, .5) +} + +.tileview--menu-image { + -webkit-filter: drop-shadow(#C81217 20px 0); + filter: drop-shadow(#C81217 20px 0) +} + +.notactive { + color: #596580 !important +} + +.down-arrow.active::after { + border-color: #C81217 +} + +.detail-content--item-content, +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content { + border-top: 1px solid #F9F5F5 +} + +.tabset--nav-container { + background: #EBEEF4 +} + +.tabset--nav-container .nav .nav-item--home.active .nav-item--home-icon { + background-image: url(../../../launcher/home-icon-selected-red.svg) +} + +.tabset--nav-container .nav .tabset--nav-link { + color: #596580; + font-size: 13px; + padding: 0 10px 0 16px; + height: 36px; + line-height: 36px +} + +.tabset--nav-container .nav .tabset--nav-link:hover { + background: #E1E5EE +} + +.tabset--nav-container .nav .tabset--nav-link:hover .nav-link-close { + color: #666 +} + +.tabset--nav-container .nav .tabset--nav-link.active { + color: #3E4A65; + background: #F8F9FB +} + +.tabset--nav-container .nav .tabset--nav-link.active .nav-link-close { + color: #666 +} + +.tabset--nav-container .tabset-container--vertical .list-group .list-group-item::after { + background-image: linear-gradient(243deg, rgba(4, 159, 255, .09) 0, #B60808 26%, #D2171E 67%, rgba(9, 113, 255, .13) 95%) +} + +.detail-content--item:hover { + background-color: #F9F5F5 +} + +.curtenant, +.setdefault:hover { + background: #D5161B +} + +.curtenant { + color: #fff +} + +.curtenant-font-color { + color: #C81217 !important +} + +.gw-navbar-user-dropdown.active, +.gw-navbar-user-dropdown:hover { + background-color: #D5161B +} + +.gw-navbar-user-info-content-list-item.item-setting-list:hover { + color: #C81217; + background-color: #F9F5F5 +} + +.gw-navbar-user-info-content-list-item.item-setting-list .item-setting-list-content .item-setting-list-content--tenant-change-background, +.gw-navbar-user-info-content-list-item.item-setting-list--tenant-change:hover .item-setting-list-content .item-setting-list-content--tenant-change-size { + background-image: url(../../../img/tenant_change-red.svg) +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all { + border: 1px solid #F9F5F5 +} + +.gw-single-app-wrapper:hover, +.gw-view-tiled--container .gw-view-tiled--content .gw-view-tiled--item:hover { + -o-border-image: linear-gradient(135deg, #FF9F9F, #FFD3D3) 30 30; + border-image: linear-gradient(135deg, #FF9F9F, #FFD3D3) 30 30 +} + +.gw-view-tiled--container .gw-view-tiled--nav .gw-view-tiled--nav-select .gw-view-tiled--nav-show-all .select-item:hover { + background-color: #F6EFEF +} + +.menu-search-wrapper .menu-search--search { + background: #D5161B +} + +.menu-colllection-wrapper .menu-colllection--detail-item:hover { + background: #F9F5F5 +} + +.menu-colllection-wrapper .menu-colllection--detail-item:hover .item-content .item-content-title { + color: #C81217 +} + +.menu-colllection-wrapper.show .menu-colllection--item { + background-color: #D5161B +} + +.gw-app-group.f-state-active .gw-app-group--header .header--icon { + color: #DD1C21 +} + +.gw-apps-management--header .header--search { + background: #F9F5F5; + border: 1px solid #F9F5F5 +} + +.gw-apps-management--header .header--search .search--input { + background: #F9F5F5 +} + +.gw-apps-management--header .header--search .search--append .f-icon { + color: #D0242A +} + +.gw-apps-management--header .header--search.f-state-focuse, +.gw-apps-management--header .header--search:hover { + border: 1px solid #FF9191 +} + +.gw-apps-management--header .header--search .search--placeholder { + background: #F9F5F5; + border: 1px solid #F9F5F5 +} + +.gw-apps-management--header .header--search .search--result-panel .match { + color: #D5161B +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-check, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list .theme-size-list-check, +.user-setting-content-wrapper-title .title-edit-btn, +.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-icon, +.user-setting-list .user-setting-menu .menu-item-inner.active .menu-item-text { + color: #D0242A +} + +.gw-apps-management--header .header--search .search--result-panel .search--result-list .search--result-item:hover { + background: #F9F5F5 +} + +.gw-apps-management--header .header--search .search--result-panel .search--prompt-list .search--prompt-item:hover { + background-image: linear-gradient(215deg, #1C7CEA 0, #C81217 100%) +} + +.gw-apps-management--header .header--view .view--btn.active, +.gw-apps-management--header .header--view .view--btn:hover:not(.active) { + background-image: linear-gradient(225deg, #F52828 0, #D2171E 100%) +} + +.search--result-item-keyboard--control { + background: #F9F5F5 +} + +.user-setting-list .user-setting-message .user-avatar .user-avatar-sex { + background-color: #FF9191 +} + +.user-setting-list .user-setting-menu .menu-item-inner.active { + border-left: 3px solid #D0242A +} + +.user-setting-content-wrapper-title::before { + background: #FF9191 +} + +.user-setting-content-wrapper-title.user-setting-content-wrapper-title-new::before { + background-color: #ED5858 +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list .theme-color-list-img { + background-color: #D0242A +} + +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-color .theme-color-list.active::before, +.user-setting-content-wrapper-main .user-setting-form .form-wrap .form-input-size .theme-size-list.active::before { + border: 1px solid rgba(207, 36, 42, .5) +} + +.user-setting-list .user-setting-menu .menu-item-inner.active, +.user-setting-list .user-setting-menu .menu-item-inner:hover { + background-color: #F9F5F5 +} + +.tabset--nav-container .nav { + height: 36px +} + +.tabset--nav-container .nav .nav-link-close { + margin: 0 0 0 14px +} diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/base/worker/workerMain.js b/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/base/worker/workerMain.js index edb921da8241a22594100cc021c1ea448762e165..72dc144caab7501568426f0883a7a511a0dcd56e 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/base/worker/workerMain.js +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/base/worker/workerMain.js @@ -4,150 +4,6903 @@ * Released under the MIT license * https://github.com/Microsoft/vscode/blob/master/LICENSE.txt *-----------------------------------------------------------*/ -(function(){ -var e=["require","exports","vs/editor/common/core/position","vs/base/common/platform","vs/base/common/errors","vs/editor/common/core/range","vs/editor/common/core/uint","vs/base/common/lifecycle","vs/base/common/winjs.base","vs/base/common/event","vs/base/common/cancellation","vs/base/common/uri","vs/base/common/iterator","vs/base/common/diff/diff","vs/base/common/async","vs/base/common/linkedList","vs/base/common/functional","vs/base/common/strings","vs/base/common/winjs.polyfill.promise","vs/editor/common/model/mirrorTextModel","vs/base/common/diff/diffChange","vs/base/common/keyCodes","vs/editor/common/core/selection","vs/editor/common/core/token","vs/base/common/arrays","vs/editor/common/core/characterClassifier","vs/editor/common/diff/diffComputer","vs/editor/common/model/wordHelper","vs/editor/common/modes/linkComputer","vs/editor/common/modes/supports/inplaceReplaceSupport","vs/editor/common/standalone/standaloneEnums","vs/editor/common/standalone/standaloneBase","vs/editor/common/viewModel/prefixSumComputer","vs/base/common/worker/simpleWorker","vs/editor/common/services/editorSimpleWorker"],t=function(t){ -for(var n=[],r=0,i=t.length;r=0)||"undefined"!=typeof process&&"win32"===process.platform},t}();e.Environment=t}(o||(o={}));!function(e){var t=function(){return function(e,t,n){this.type=e,this.detail=t,this.timestamp=n}}();e.LoaderEvent=t;var n=function(){function n(e){this._events=[new t(1,"",e)]}return n.prototype.record=function(n,r){this._events.push(new t(n,r,e.Utilities.getHighPerformanceTimestamp()))},n.prototype.getEvents=function(){return this._events},n}();e.LoaderEventRecorder=n;var r=function(){function e(){}return e.prototype.record=function(e,t){},e.prototype.getEvents=function(){return[]},e}();r.INSTANCE=new r,e.NullLoaderEventRecorder=r}(o||(o={}));!function(e){var t=function(){function t(){} -return t.fileUriToFilePath=function(e,t){if(t=decodeURI(t).replace(/%23/g,"#"),e){if(/^file:\/\/\//.test(t))return t.substr(8);if(/^file:\/\//.test(t))return t.substr(5)}else if(/^file:\/\//.test(t))return t.substr(7);return t},t.startsWith=function(e,t){return e.length>=t.length&&e.substr(0,t.length)===t},t.endsWith=function(e,t){return e.length>=t.length&&e.substr(e.length-t.length)===t},t.containsQueryString=function(e){return/^[^\#]*\?/gi.test(e)},t.isAbsolutePath=function(e){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e)},t.forEachProperty=function(e,t){if(e){var n=void 0;for(n in e)e.hasOwnProperty(n)&&t(n,e[n])}},t.isEmpty=function(e){var n=!0;return t.forEachProperty(e,function(){n=!1}),n},t.recursiveClone=function(e){if(!e||"object"!=typeof e)return e;var n=Array.isArray(e)?[]:{};return t.forEachProperty(e,function(e,r){n[e]=r&&"object"==typeof r?t.recursiveClone(r):r}),n},t.generateAnonymousModule=function(){return"===anonymous"+t.NEXT_ANONYMOUS_ID+++"==="}, -t.isAnonymousModule=function(e){return t.startsWith(e,"===anonymous")},t.getHighPerformanceTimestamp=function(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=e.global.performance&&"function"==typeof e.global.performance.now),this.HAS_PERFORMANCE_NOW?e.global.performance.now():Date.now()},t}();t.NEXT_ANONYMOUS_ID=1,t.PERFORMANCE_NOW_PROBED=!1,t.HAS_PERFORMANCE_NOW=!1,e.Utilities=t}(o||(o={}));!function(e){var t=function(){function t(){}return t.validateConfigurationOptions=function(t){function n(e){return"load"===e.errorCode?(console.error('Loading "'+e.moduleId+'" failed'),console.error("Detail: ",e.detail),e.detail&&e.detail.stack&&console.error(e.detail.stack),console.error("Here are the modules that depend on it:"),void console.error(e.neededBy)):"factory"===e.errorCode?(console.error('The factory method of "'+e.moduleId+'" has thrown an exception'),console.error(e.detail),void(e.detail&&e.detail.stack&&console.error(e.detail.stack))):void 0} -return"string"!=typeof(t=t||{}).baseUrl&&(t.baseUrl=""),"boolean"!=typeof t.isBuild&&(t.isBuild=!1),"object"!=typeof t.paths&&(t.paths={}),"object"!=typeof t.config&&(t.config={}),void 0===t.catchError&&(t.catchError=!1),"string"!=typeof t.urlArgs&&(t.urlArgs=""),"function"!=typeof t.onError&&(t.onError=n),"object"==typeof t.ignoreDuplicateModules&&Array.isArray(t.ignoreDuplicateModules)||(t.ignoreDuplicateModules=[]),t.baseUrl.length>0&&(e.Utilities.endsWith(t.baseUrl,"/")||(t.baseUrl+="/")),"string"!=typeof t.cspNonce&&(t.cspNonce=""),Array.isArray(t.nodeModules)||(t.nodeModules=[]),("number"!=typeof t.nodeCachedDataWriteDelay||t.nodeCachedDataWriteDelay<0)&&(t.nodeCachedDataWriteDelay=7e3),"function"!=typeof t.onNodeCachedData&&(t.onNodeCachedData=function(e,t){e&&("cachedDataRejected"===e.errorCode?console.warn("Rejected cached data from file: "+e.path):"unlink"===e.errorCode||"writeFile"===e.errorCode?(console.error("Problems writing cached data file: "+e.path),console.error(e.detail)):console.error(e)) -}),t},t.mergeConfigurationOptions=function(n,r){void 0===n&&(n=null),void 0===r&&(r=null);var i=e.Utilities.recursiveClone(r||{});return e.Utilities.forEachProperty(n,function(t,n){"ignoreDuplicateModules"===t&&void 0!==i.ignoreDuplicateModules?i.ignoreDuplicateModules=i.ignoreDuplicateModules.concat(n):"paths"===t&&void 0!==i.paths?e.Utilities.forEachProperty(n,function(e,t){return i.paths[e]=t}):"config"===t&&void 0!==i.config?e.Utilities.forEachProperty(n,function(e,t){return i.config[e]=t}):i[t]=e.Utilities.recursiveClone(n)}),t.validateConfigurationOptions(i)},t}();e.ConfigurationOptionsUtil=t;var n=function(){function n(e,n){if(this._env=e,this.options=t.mergeConfigurationOptions(n),this._createIgnoreDuplicateModulesMap(),this._createNodeModulesMap(),this._createSortedPathsRules(),""===this.options.baseUrl){if(this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){ -var r=this.options.nodeRequire.main.filename,i=Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"));this.options.baseUrl=r.substring(0,i+1)}if(this.options.nodeMain&&this._env.isNode){var r=this.options.nodeMain,i=Math.max(r.lastIndexOf("/"),r.lastIndexOf("\\"));this.options.baseUrl=r.substring(0,i+1)}}}return n.prototype._createIgnoreDuplicateModulesMap=function(){this.ignoreDuplicateModulesMap={};for(var e=0;e=0){var r=t.resolveModule(e.substr(0,n)),s=t.resolveModule(e.substr(n+1)),u=this._moduleIdProvider.getModuleId(r+"!"+s),a=this._moduleIdProvider.getModuleId(r);return new o(u,a,s)}return new i(this._moduleIdProvider.getModuleId(t.resolveModule(e)))},s.prototype._normalizeDependencies=function(e,t){for(var n=[],r=0,i=0,o=e.length;i0;){var a=u.shift(),l=this._modules2[a];l&&(s=l.onDependencyError(n)||s);var c=this._inverseDependencies2[a];if(c)for(var i=0,o=c.length;i0;){var u=s.shift().dependencies;if(u)for(var i=0,o=u.length;i=r.length)t._onLoadError(e,n);else{var s=r[i],u=t.getRecorder();if(t._config.isBuild()&&"empty:"===s)return t._buildInfoPath[e]=s,t.defineModule(t._moduleIdProvider.getStrModuleId(e),[],null,null,null),void t._onLoad(e);u.record(10,s), -t._scriptLoader.load(t,s,function(){t._config.isBuild()&&(t._buildInfoPath[e]=s),u.record(11,s),t._onLoad(e)},function(e){u.record(12,s),o(e)})}};o(null)}},s.prototype._loadPluginDependency=function(e,n){var r=this;if(!this._modules2[n.id]&&!this._knownModules2[n.id]){this._knownModules2[n.id]=!0;var i=function(e){r.defineModule(r._moduleIdProvider.getStrModuleId(n.id),[],e,null,null)};i.error=function(e){r._config.onError(r._createLoadError(n.id,e))},e.load(n.pluginParam,this._createRequire(t.ROOT),i,this._config.getOptionsLiteral())}},s.prototype._resolve=function(e){for(var t=this,n=e.dependencies,r=0,s=n.length;r \n")),e.unresolvedDependenciesCount--}else if(this._inverseDependencies2[u.id]=this._inverseDependencies2[u.id]||[],this._inverseDependencies2[u.id].push(e.id),u instanceof o){var c=this._modules2[u.pluginId];if(c&&c.isComplete()){this._loadPluginDependency(c.exports,u);continue}var f=this._inversePluginDependencies2.get(u.pluginId);f||(f=[],this._inversePluginDependencies2.set(u.pluginId,f)),f.push(u),this._loadModule(u.pluginId)}else this._loadModule(u.id)}else e.unresolvedDependenciesCount--;else e.unresolvedDependenciesCount--;else e.exportsPassedIn=!0,e.unresolvedDependenciesCount--}0===e.unresolvedDependenciesCount&&this._onModuleComplete(e)},s.prototype._onModuleComplete=function(e){var t=this,n=this.getRecorder();if(!e.isComplete()){for(var r=e.dependencies,o=[],s=0,u=r.length;sr?e[a]=o[u++]:u>i?e[a]=o[s++]:t(o[u],o[s])<0?e[a]=o[u++]:e[a]=o[s++]}(e,t,n,s,i,o)}}function i(e,t){for(var n=0;n0))return o;i=o-1}}return-(r+1)},t.findFirstInSorted=function(e,t){var n=0,r=e.length;if(0===r)return 0;for(;nt;i--)r.push(i);return r},t.arrayInsert=function(e,t,n){var r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}}),i(e[20],t([0,1]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t,n,r){this.originalStart=e,this.originalLength=t,this.modifiedStart=n,this.modifiedLength=r}return e.prototype.getOriginalEnd=function(){return this.originalStart+this.originalLength},e.prototype.getModifiedEnd=function(){return this.modifiedStart+this.modifiedLength},e}();t.DiffChange=n}),i(e[13],t([0,1,20]),function(e,t,n){"use strict";function r(e){return{ -getLength:function(){return e.length},getElementAtIndex:function(t){return e.charCodeAt(t)}}}Object.defineProperty(t,"__esModule",{value:!0}),t.stringDiff=function(e,t,n){return new u(r(e),r(t)).ComputeDiff(n)};var i=function(){function e(){}return e.Assert=function(e,t){if(!e)throw new Error(t)},e}();t.Debug=i;var o=function(){function e(){}return e.Copy=function(e,t,n,r,i){for(var o=0;o0||this.m_modifiedCount>0)&&this.m_changes.push(new n.DiffChange(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=Number.MAX_VALUE,this.m_modifiedStart=Number.MAX_VALUE},e.prototype.AddOriginalElement=function(e,t){ -this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_originalCount++},e.prototype.AddModifiedElement=function(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_modifiedCount++},e.prototype.getChanges=function(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes},e.prototype.getReverseChanges=function(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes},e}(),u=function(){function e(e,t,n){void 0===n&&(n=null),this.OriginalSequence=e,this.ModifiedSequence=t,this.ContinueProcessingPredicate=n,this.m_forwardHistory=[],this.m_reverseHistory=[]}return e.prototype.ElementsAreEqual=function(e,t){return this.OriginalSequence.getElementAtIndex(e)===this.ModifiedSequence.getElementAtIndex(t)},e.prototype.OriginalElementsAreEqual=function(e,t){ -return this.OriginalSequence.getElementAtIndex(e)===this.OriginalSequence.getElementAtIndex(t)},e.prototype.ModifiedElementsAreEqual=function(e,t){return this.ModifiedSequence.getElementAtIndex(e)===this.ModifiedSequence.getElementAtIndex(t)},e.prototype.ComputeDiff=function(e){return this._ComputeDiff(0,this.OriginalSequence.getLength()-1,0,this.ModifiedSequence.getLength()-1,e)},e.prototype._ComputeDiff=function(e,t,n,r,i){var o=this.ComputeDiffRecursive(e,t,n,r,[!1]);return i?this.PrettifyChanges(o):o},e.prototype.ComputeDiffRecursive=function(e,t,r,o,s){for(s[0]=!1;e<=t&&r<=o&&this.ElementsAreEqual(e,r);)e++,r++;for(;t>=e&&o>=r&&this.ElementsAreEqual(t,o);)t--,o--;if(e>t||r>o){var u=void 0;return r<=o?(i.Assert(e===t+1,"originalStart should only be one more than originalEnd"),u=[new n.DiffChange(e,0,r,o-r+1)]):e<=t?(i.Assert(r===o+1,"modifiedStart should only be one more than modifiedEnd"),u=[new n.DiffChange(e,t-e+1,r,0)]):(i.Assert(e===t+1,"originalStart should only be one more than originalEnd"), -i.Assert(r===o+1,"modifiedStart should only be one more than modifiedEnd"),u=[]),u}var a=[0],l=[0],c=this.ComputeRecursionPoint(e,t,r,o,a,l,s),f=a[0],d=l[0];if(null!==c)return c;if(!s[0]){var h=this.ComputeDiffRecursive(e,f,r,d,s),p=[];return p=s[0]?[new n.DiffChange(f+1,t-(f+1)+1,d+1,o-(d+1)+1)]:this.ComputeDiffRecursive(f+1,t,d+1,o,s),this.ConcatenateChanges(h,p)}return[new n.DiffChange(e,t-e+1,r,o-r+1)]},e.prototype.WALKTRACE=function(e,t,r,i,o,u,a,l,c,f,d,h,p,m,g,_,v,y){var b,C=null,E=null,S=new s,L=t,N=r,P=p[0]-_[0]-i,A=Number.MIN_VALUE,M=this.m_forwardHistory.length-1;do{(b=P+e)===L||b=0&&(e=(c=this.m_forwardHistory[M])[0],L=1,N=c.length-1)}while(--M>=-1);if(C=S.getReverseChanges(),y[0]){var I=p[0]+1,w=_[0]+1;if(null!==C&&C.length>0){var D=C[C.length-1];I=Math.max(I,D.getOriginalEnd()), -w=Math.max(w,D.getModifiedEnd())}E=[new n.DiffChange(I,h-I+1,w,g-w+1)]}else{S=new s,L=u,N=a,P=p[0]-_[0]-l,A=Number.MAX_VALUE,M=v?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{(b=P+o)===L||b=f[b+1]?(m=(d=f[b+1]-1)-P-l,d>A&&S.MarkNextChange(),A=d+1,S.AddOriginalElement(d+1,m+1),P=b+1-o):(m=(d=f[b-1])-P-l,d>A&&S.MarkNextChange(),A=d,S.AddModifiedElement(d+1,m+1),P=b-1-o),M>=0&&(o=(f=this.m_reverseHistory[M])[0],L=1,N=f.length-1)}while(--M>=-1);E=S.getChanges()}return this.ConcatenateChanges(C,E)},e.prototype.ComputeRecursionPoint=function(e,t,r,i,s,u,a){var l,c=0,f=0,d=0,h=0,p=0,m=0;e--,r--,s[0]=0,u[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];var g=t-e+(i-r),_=g+1,v=new Array(_),y=new Array(_),b=i-r,C=t-e,E=e-r,S=t-i,L=(C-b)%2==0;v[b]=e,y[C]=t,a[0]=!1;var N,P;for(l=1;l<=g/2+1;l++){var A=0,M=0;for(d=this.ClipDiagonalBound(b-l,l,b,_),h=this.ClipDiagonalBound(b+l,l,b,_),N=d;N<=h;N+=2){for(f=(c=N===d||NA+M&&(A=c,M=f),!L&&Math.abs(N-C)<=l-1&&c>=y[N])return s[0]=c,u[0]=f,P<=y[N]&&l<=1448?this.WALKTRACE(b,d,h,E,C,p,m,S,v,y,c,t,s,f,i,u,L,a):null}var I=(A-e+(M-r)-l)/2;if(null!==this.ContinueProcessingPredicate&&!this.ContinueProcessingPredicate(A,this.OriginalSequence,I))return a[0]=!0,s[0]=A,u[0]=M,I>0&&l<=1448?this.WALKTRACE(b,d,h,E,C,p,m,S,v,y,c,t,s,f,i,u,L,a):(e++,r++,[new n.DiffChange(e,t-e+1,r,i-r+1)]);for(p=this.ClipDiagonalBound(C-l,l,C,_),m=this.ClipDiagonalBound(C+l,l,C,_),N=p;N<=m;N+=2){for(f=(c=N===p||N=y[N+1]?y[N+1]-1:y[N-1])-(N-C)-S,P=c;c>e&&f>r&&this.ElementsAreEqual(c,f);)c--,f--;if(y[N]=c,L&&Math.abs(N-b)<=l&&c<=v[N])return s[0]=c,u[0]=f,P>=v[N]&&l<=1448?this.WALKTRACE(b,d,h,E,C,p,m,S,v,y,c,t,s,f,i,u,L,a):null}if(l<=1447){var w=new Array(h-d+2);w[0]=b-d+1,o.Copy(v,d,w,1,h-d+1),this.m_forwardHistory.push(w),(w=new Array(m-p+2))[0]=C-p+1,o.Copy(y,p,w,1,m-p+1),this.m_reverseHistory.push(w)}} -return this.WALKTRACE(b,d,h,E,C,p,m,S,v,y,c,t,s,f,i,u,L,a)},e.prototype.PrettifyChanges=function(e){for(u=0;u0,o=t.modifiedLength>0;t.originalStart+t.originalLength=0;u--){var t=e[u],n=0,r=0;if(u>0){var a=e[u-1];a.originalLength>0&&(n=a.originalStart+a.originalLength),a.modifiedLength>0&&(r=a.modifiedStart+a.modifiedLength)} -for(var i=t.originalLength>0,o=t.modifiedLength>0,l=0,c=this._boundaryScore(t.originalStart,t.originalLength,t.modifiedStart,t.modifiedLength),f=1;;f++){var d=t.originalStart-f,h=t.modifiedStart-f;if(dc&&(c=p,l=f)}t.originalStart-=l,t.modifiedStart-=l}return e},e.prototype._OriginalIsBoundary=function(e){if(e<=0||e>=this.OriginalSequence.getLength()-1)return!0;var t=this.OriginalSequence.getElementAtIndex(e);return"string"==typeof t&&/^\s*$/.test(t)},e.prototype._OriginalRegionIsBoundary=function(e,t){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(t>0){var n=e+t;if(this._OriginalIsBoundary(n-1)||this._OriginalIsBoundary(n))return!0}return!1},e.prototype._ModifiedIsBoundary=function(e){if(e<=0||e>=this.ModifiedSequence.getLength()-1)return!0 -;var t=this.ModifiedSequence.getElementAtIndex(e);return"string"==typeof t&&/^\s*$/.test(t)},e.prototype._ModifiedRegionIsBoundary=function(e,t){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(t>0){var n=e+t;if(this._ModifiedIsBoundary(n-1)||this._ModifiedIsBoundary(n))return!0}return!1},e.prototype._boundaryScore=function(e,t,n,r){return(this._OriginalRegionIsBoundary(e,t)?1:0)+(this._ModifiedRegionIsBoundary(n,r)?1:0)},e.prototype.ConcatenateChanges=function(e,t){var n=[];if(0===e.length||0===t.length)return t.length>0?t:e;if(this.ChangesOverlap(e[e.length-1],t[0],n)){r=new Array(e.length+t.length-1);return o.Copy(e,0,r,0,e.length-1),r[e.length-1]=n[0],o.Copy(t,1,r,e.length,t.length-1),r}var r=new Array(e.length+t.length);return o.Copy(e,0,r,0,e.length),o.Copy(t,0,r,e.length,t.length),r},e.prototype.ChangesOverlap=function(e,t,r){if(i.Assert(e.originalStart<=t.originalStart,"Left change is not less than or equal to right change"), -i.Assert(e.modifiedStart<=t.modifiedStart,"Left change is not less than or equal to right change"),e.originalStart+e.originalLength>=t.originalStart||e.modifiedStart+e.modifiedLength>=t.modifiedStart){var o=e.originalStart,s=e.originalLength,u=e.modifiedStart,a=e.modifiedLength;return e.originalStart+e.originalLength>=t.originalStart&&(s=t.originalStart+t.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=t.modifiedStart&&(a=t.modifiedStart+t.modifiedLength-e.modifiedStart),r[0]=new n.DiffChange(o,s,u,a),!0}return r[0]=null,!1},e.prototype.ClipDiagonalBound=function(e,t,n,r){if(e>=0&&e=r?t.FIN:{done:!1,value:e[n++]}}}},e.from=function(t){return t?Array.isArray(t)?e.fromArray(t):t:e.empty()},e.map=function(e,n){return{next:function(){var r=e.next();return r.done?t.FIN:{done:!1,value:n(r.value)}}}},e.filter=function(e,n){return{next:function(){for(;;){var r=e.next();if(r.done)return t.FIN;if(n(r.value))return{done:!1,value:r.value}}}}},e.forEach=n,e.collect=function(e){var t=[] -;return n(e,function(e){return t.push(e)}),t}}(t.Iterator||(t.Iterator={}));var n=function(){function e(e,t,n,r){void 0===t&&(t=0),void 0===n&&(n=e.length),void 0===r&&(r=t-1),this.items=e,this.start=t,this.end=n,this.index=r}return e.prototype.next=function(){return this.index=Math.min(this.index+1,this.end),this.current()},e.prototype.current=function(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]},e}();t.ArrayIterator=n;var r=function(e){function t(t,n,r,i){return void 0===n&&(n=0),void 0===r&&(r=t.length),void 0===i&&(i=n-1),e.call(this,t,n,r,i)||this}return s(t,e),t.prototype.current=function(){return e.prototype.current.call(this)},t.prototype.previous=function(){return this.index=Math.max(this.index-1,this.start-1),this.current()},t.prototype.first=function(){return this.index=this.start,this.current()},t.prototype.last=function(){return this.index=this.end-1,this.current()},t.prototype.parent=function(){return null},t}(n);t.ArrayNavigator=r;var i=function(){ -function e(e,t){this.iterator=e,this.fn=t}return e.prototype.next=function(){return this.fn(this.iterator.next())},e}();t.MappedIterator=i}),i(e[21],t([0,1]),function(e,t){"use strict";function n(e,t){var n=!!(2048&e),r=!!(256&e);return new u(2===t?r:n,!!(1024&e),!!(512&e),2===t?n:r,255&e)}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}return e.prototype.define=function(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e},e.prototype.keyCodeToStr=function(e){return this._keyCodeToStr[e]},e.prototype.strToKeyCode=function(e){return this._strToKeyCode[e.toLowerCase()]||0},e}(),i=new r,o=new r,s=new r;!function(){function e(e,t,n,r){void 0===n&&(n=t),void 0===r&&(r=n),i.define(e,t),o.define(e,n),s.define(e,r)}e(0,"unknown"),e(1,"Backspace"),e(2,"Tab"),e(3,"Enter"),e(4,"Shift"),e(5,"Ctrl"),e(6,"Alt"),e(7,"PauseBreak"),e(8,"CapsLock"),e(9,"Escape"),e(10,"Space"),e(11,"PageUp"),e(12,"PageDown"),e(13,"End"), -e(14,"Home"),e(15,"LeftArrow","Left"),e(16,"UpArrow","Up"),e(17,"RightArrow","Right"),e(18,"DownArrow","Down"),e(19,"Insert"),e(20,"Delete"),e(21,"0"),e(22,"1"),e(23,"2"),e(24,"3"),e(25,"4"),e(26,"5"),e(27,"6"),e(28,"7"),e(29,"8"),e(30,"9"),e(31,"A"),e(32,"B"),e(33,"C"),e(34,"D"),e(35,"E"),e(36,"F"),e(37,"G"),e(38,"H"),e(39,"I"),e(40,"J"),e(41,"K"),e(42,"L"),e(43,"M"),e(44,"N"),e(45,"O"),e(46,"P"),e(47,"Q"),e(48,"R"),e(49,"S"),e(50,"T"),e(51,"U"),e(52,"V"),e(53,"W"),e(54,"X"),e(55,"Y"),e(56,"Z"),e(57,"Meta"),e(58,"ContextMenu"),e(59,"F1"),e(60,"F2"),e(61,"F3"),e(62,"F4"),e(63,"F5"),e(64,"F6"),e(65,"F7"),e(66,"F8"),e(67,"F9"),e(68,"F10"),e(69,"F11"),e(70,"F12"),e(71,"F13"),e(72,"F14"),e(73,"F15"),e(74,"F16"),e(75,"F17"),e(76,"F18"),e(77,"F19"),e(78,"NumLock"),e(79,"ScrollLock"),e(80,";",";","OEM_1"),e(81,"=","=","OEM_PLUS"),e(82,",",",","OEM_COMMA"),e(83,"-","-","OEM_MINUS"),e(84,".",".","OEM_PERIOD"),e(85,"/","/","OEM_2"),e(86,"`","`","OEM_3"),e(110,"ABNT_C1"),e(111,"ABNT_C2"),e(87,"[","[","OEM_4"), -e(88,"\\","\\","OEM_5"),e(89,"]","]","OEM_6"),e(90,"'","'","OEM_7"),e(91,"OEM_8"),e(92,"OEM_102"),e(93,"NumPad0"),e(94,"NumPad1"),e(95,"NumPad2"),e(96,"NumPad3"),e(97,"NumPad4"),e(98,"NumPad5"),e(99,"NumPad6"),e(100,"NumPad7"),e(101,"NumPad8"),e(102,"NumPad9"),e(103,"NumPad_Multiply"),e(104,"NumPad_Add"),e(105,"NumPad_Separator"),e(106,"NumPad_Subtract"),e(107,"NumPad_Decimal"),e(108,"NumPad_Divide")}();!function(e){e.toString=function(e){return i.keyCodeToStr(e)},e.fromString=function(e){return i.strToKeyCode(e)},e.toUserSettingsUS=function(e){return o.keyCodeToStr(e)},e.toUserSettingsGeneral=function(e){return s.keyCodeToStr(e)},e.fromUserSettings=function(e){return o.strToKeyCode(e)||s.strToKeyCode(e)}}(t.KeyCodeUtils||(t.KeyCodeUtils={})),t.KeyChord=function(e,t){return(e|(65535&t)<<16>>>0)>>>0},t.createKeybinding=function(e,t){if(0===e)return null;var r=(65535&e)>>>0,i=(4294901760&e)>>>16;return 0!==i?new a(n(r,t),n(i,t)):n(r,t)},t.createSimpleKeybinding=n;var u=function(){function e(e,t,n,r,i){ -this.type=1,this.ctrlKey=e,this.shiftKey=t,this.altKey=n,this.metaKey=r,this.keyCode=i}return e.prototype.equals=function(e){return 1===e.type&&(this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode)},e.prototype.isModifierKey=function(){return 0===this.keyCode||5===this.keyCode||57===this.keyCode||6===this.keyCode||4===this.keyCode},e.prototype.isDuplicateModifierCase=function(){return this.ctrlKey&&5===this.keyCode||this.shiftKey&&4===this.keyCode||this.altKey&&6===this.keyCode||this.metaKey&&57===this.keyCode},e}();t.SimpleKeybinding=u;var a=function(){return function(e,t){this.type=2,this.firstPart=e,this.chordPart=t}}();t.ChordKeybinding=a;var l=function(){return function(e,t,n,r,i,o){this.ctrlKey=e,this.shiftKey=t,this.altKey=n,this.metaKey=r,this.keyLabel=i,this.keyAriaLabel=o}}();t.ResolvedKeybindingPart=l;var c=function(){return function(){}}();t.ResolvedKeybinding=c}),i(e[7],t([0,1]),function(e,t){"use strict";function n(e){ -for(var t=[],r=1;r=0,r=f.indexOf("Macintosh")>=0,i=f.indexOf("Linux")>=0,s=!0,navigator.language}t.isWindows=n,t.isMacintosh=r,t.isLinux=i,t.isNative=o,t.isWeb=s;var d="object"==typeof self?self:"object"==typeof global?global:{};t.globals=d;var h=null;t.setImmediate=function(e){return null===h&&(h=t.globals.setImmediate?t.globals.setImmediate.bind(t.globals):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):t.globals.setTimeout.bind(t.globals)),h(e)}, -t.OS=r?2:n?1:3}),i(e[17],t([0,1]),function(e,t){"use strict";function n(e){return e.replace(/[\-\\\{\}\*\+\?\|\^\$\.\[\]\(\)\#]/g,"\\$&")}function r(e,t){if(!e||!t)return e;var n=t.length;if(0===n||0===e.length)return e;for(var r=0;e.indexOf(t,r)===r;)r+=n;return e.substring(r)}function i(e,t){if(!e||!t)return e;var n=t.length,r=e.length;if(0===n||0===r)return e;for(var i=r,o=-1;;){if(-1===(o=e.lastIndexOf(t,i-1))||o+n!==i)break;if(0===o)return"";i=o}return e.substring(0,i)}function o(e){return e>=97&&e<=122}function s(e){return e>=65&&e<=90}function u(e){return o(e)||s(e)}function a(e,t,n){if(void 0===n&&(n=e.length),"string"!=typeof e||"string"!=typeof t)return!1;for(var r=0;r=11904&&e<=55215||e>=63744&&e<=64255||e>=65281&&e<=65374} -Object.defineProperty(t,"__esModule",{value:!0}),t.empty="",t.isFalsyOrWhitespace=function(e){return!e||"string"!=typeof e||0===e.trim().length},t.pad=function(e,t,n){void 0===n&&(n="0");for(var r=""+e,i=[r],o=r.length;o=t.length?e:t[r]})},t.escape=function(e){return e.replace(/[<|>|&]/g,function(e){switch(e){case"<":return"<";case">":return">";case"&":return"&";default:return e}})},t.escapeRegExpCharacters=n,t.trim=function(e,t){return void 0===t&&(t=" "),i(r(e,t),t)},t.ltrim=r,t.rtrim=i,t.convertSimple2RegExpPattern=function(e){return e.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g,"\\$&").replace(/[\*]/g,".*")},t.startsWith=function(e,t){if(e.length0?e.indexOf(t,n)===n:0===n&&e===t},t.createRegExp=function(e,t,r){if(void 0===r&&(r={}),!e)throw new Error("Cannot create regex from empty string");t||(e=n(e)),r.wholeWord&&(/\B/.test(e.charAt(0))||(e="\\b"+e),/\B/.test(e.charAt(e.length-1))||(e+="\\b"));var i="";return r.global&&(i+="g"),r.matchCase||(i+="i"),r.multiline&&(i+="m"),new RegExp(e,i)},t.regExpLeadsToEndlessLoop=function(e){return"^"!==e.source&&"^$"!==e.source&&"$"!==e.source&&"^\\s*$"!==e.source&&!(!e.exec("")||0!==e.lastIndex)},t.firstNonWhitespaceIndex=function(e){for(var t=0,n=e.length;t=0;n--){var r=e.charCodeAt(n);if(32!==r&&9!==r)return n}return-1}, -t.compare=function(e,t){return et?1:0},t.isLowerAsciiLetter=o,t.isUpperAsciiLetter=s,t.equalsIgnoreCase=function(e,t){return(e?e.length:0)===(t?t.length:0)&&a(e,t)},t.startsWithIgnoreCase=function(e,t){var n=t.length;return!(t.length>e.length)&&a(e,t,n)},t.commonPrefixLength=function(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n0&&65279===e.charCodeAt(0))},t.safeBtoa=function(e){return btoa(encodeURIComponent(e))},t.repeat=function(e,t){for(var n="",r=0;r=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57||45===o||46===o||95===o||126===o||t&&47===o)-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),void 0!==n&&(n+=e.charAt(i));else{void 0===n&&(n=e.substr(0,i));var s=_[o];void 0!==s?(-1!==r&&(n+=encodeURIComponent(e.substring(r,i)),r=-1),n+=s):-1===r&&(r=i)}}return-1!==r&&(n+=encodeURIComponent(e.substring(r))),void 0!==n?n:e}function i(e){var t;return t=e.authority&&e.path.length>1&&"file"===e.scheme?"//"+e.authority+e.path:47===e.path.charCodeAt(0)&&(e.path.charCodeAt(1)>=65&&e.path.charCodeAt(1)<=90||e.path.charCodeAt(1)>=97&&e.path.charCodeAt(1)<=122)&&58===e.path.charCodeAt(2)?e.path[1].toLowerCase()+e.path.substr(2):e.path, -n.isWindows&&(t=t.replace(/\//g,"\\")),t}function o(e,t){var n=t?function(e){for(var t=void 0,n=0;n=3&&47===u.charCodeAt(0)&&58===u.charCodeAt(2)){(d=u.charCodeAt(1))>=65&&d<=90&&(u="/"+String.fromCharCode(d+32)+":"+u.substr(3))}else if(u.length>=2&&58===u.charCodeAt(1)){var d=u.charCodeAt(0);d>=65&&d<=90&&(u=String.fromCharCode(d+32)+":"+u.substr(2))}i+=n(u,!0)}return a&&(i+="?",i+=n(a,!1)),l&&(i+="#",i+=t?l:r(l,!1)),i}Object.defineProperty(t,"__esModule",{value:!0}) -;var u,a=/^\w[\w\d+.-]*$/,l=/^\//,c=/^\/\//,f=!0,d="",h="/",p=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,m=function(){function e(e,t,n,r,i){"object"==typeof e?(this.scheme=e.scheme||d,this.authority=e.authority||d,this.path=e.path||d,this.query=e.query||d,this.fragment=e.fragment||d):(this.scheme=e||d,this.authority=t||d,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==h&&(t=h+t):t=h}return t}(this.scheme,n||d),this.query=r||d,this.fragment=i||d,function(e){if(!e.scheme){if(f)throw new Error('[UriError]: Scheme is missing: {scheme: "", authority: "'+e.authority+'", path: "'+e.path+'", query: "'+e.query+'", fragment: "'+e.fragment+'"}');console.warn('[UriError]: Scheme is missing: {scheme: "", authority: "'+e.authority+'", path: "'+e.path+'", query: "'+e.query+'", fragment: "'+e.fragment+'"}')}if(e.scheme&&!a.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){ -if(!l.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(c.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}(this))}return e.isUri=function(t){return t instanceof e||!!t&&("string"==typeof t.authority&&"string"==typeof t.fragment&&"string"==typeof t.path&&"string"==typeof t.query&&"string"==typeof t.scheme)},Object.defineProperty(e.prototype,"fsPath",{get:function(){return i(this)},enumerable:!0,configurable:!0}),e.prototype.with=function(e){if(!e)return this;var t=e.scheme,n=e.authority,r=e.path,i=e.query,o=e.fragment;return void 0===t?t=this.scheme:null===t&&(t=d),void 0===n?n=this.authority:null===n&&(n=d),void 0===r?r=this.path:null===r&&(r=d),void 0===i?i=this.query:null===i&&(i=d),void 0===o?o=this.fragment:null===o&&(o=d), -t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&o===this.fragment?this:new g(t,n,r,i,o)},e.parse=function(e){var t=p.exec(e);return t?new g(t[2]||d,decodeURIComponent(t[4]||d),decodeURIComponent(t[5]||d),decodeURIComponent(t[7]||d),decodeURIComponent(t[9]||d)):new g(d,d,d,d,d)},e.file=function(e){var t=d;if(n.isWindows&&(e=e.replace(/\\/g,h)),e[0]===h&&e[1]===h){var r=e.indexOf(h,2);-1===r?(t=e.substring(2),e=h):(t=e.substring(2,r),e=e.substring(r)||h)}return new g("file",t,e,d,d)},e.from=function(e){return new g(e.scheme,e.authority,e.path,e.query,e.fragment)},e.prototype.toString=function(e){return void 0===e&&(e=!1),o(this,e)},e.prototype.toJSON=function(){return this},e.revive=function(t){if(t){if(t instanceof e)return t;var n=new g(t);return n._fsPath=t.fsPath,n._formatted=t.external,n}return t},e}();t.URI=m;var g=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._formatted=null,t._fsPath=null,t}return s(t,e),Object.defineProperty(t.prototype,"fsPath",{ -get:function(){return this._fsPath||(this._fsPath=i(this)),this._fsPath},enumerable:!0,configurable:!0}),t.prototype.toString=function(e){return void 0===e&&(e=!1),e?o(this,!0):(this._formatted||(this._formatted=o(this,!1)),this._formatted)},t.prototype.toJSON=function(){var e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e},t}(m),_=(u={},u[58]="%3A",u[47]="%2F",u[63]="%3F",u[35]="%23",u[91]="%5B",u[93]="%5D",u[64]="%40",u[33]="%21",u[36]="%24",u[38]="%26",u[39]="%27",u[40]="%28",u[41]="%29",u[42]="%2A",u[43]="%2B",u[44]="%2C",u[59]="%3B",u[61]="%3D",u[32]="%20",u)});var u;!function(){var e=Object.create(null);e["WinJS/Core/_WinJS"]={};var t=function(t,n,r){var i={},o=!1,s=n.map(function(t){return"exports"===t?(o=!0,i):e[t]}),u=r.apply({},s);e[t]=o?i:u} -;t("WinJS/Core/_Global",[],function(){"use strict";return"undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{}}),t("WinJS/Core/_BaseCoreUtils",["WinJS/Core/_Global"],function(e){"use strict";var t=null;return{hasWinRT:!!e.Windows,markSupportedForProcessing:function(e){return e.supportedForProcessing=!0,e},_setImmediate:function(n){null===t&&(t=e.setImmediate?e.setImmediate.bind(e):"undefined"!=typeof process&&"function"==typeof process.nextTick?process.nextTick.bind(process):e.setTimeout.bind(e)),t(n)}}}),t("WinJS/Core/_WriteProfilerMark",["WinJS/Core/_Global"],function(e){"use strict";return e.msWriteProfilerMark||function(){}}),t("WinJS/Core/_Base",["WinJS/Core/_WinJS","WinJS/Core/_Global","WinJS/Core/_BaseCoreUtils","WinJS/Core/_WriteProfilerMark"],function(e,t,n,r){"use strict";function i(e,t,n){var r,i,o,s=Object.keys(t),u=Array.isArray(e);for(i=0,o=s.length;i"),o}var s=e;s.Namespace||(s.Namespace=Object.create(Object.prototype));var u={uninitialized:1,working:2,initialized:3};Object.defineProperties(s.Namespace,{defineWithParent:{value:o,writable:!0,enumerable:!0,configurable:!0},define:{value:function(e,n){return o(t,e,n)},writable:!0, -enumerable:!0,configurable:!0},_lazy:{value:function(e){var t,n,i=u.uninitialized;return{setName:function(e){t=e},get:function(){switch(i){case u.initialized:return n;case u.uninitialized:i=u.working;try{r("WinJS.Namespace._lazy:"+t+",StartTM"),n=e()}finally{r("WinJS.Namespace._lazy:"+t+",StopTM"),i=u.uninitialized}return e=null,i=u.initialized,n;case u.working:throw"Illegal: reentrancy on initialization";default:throw"Illegal"}},set:function(e){switch(i){case u.working:throw"Illegal: reentrancy on initialization";default:i=u.initialized,n=e}},enumerable:!0,configurable:!0}},writable:!0,enumerable:!0,configurable:!0},_moduleDefine:{value:function(e,r,o){var s=[e],u=null;return r&&(u=n(t,r),s.push(u)),i(s,o,r||""),u},writable:!0,enumerable:!0,configurable:!0}})}(),function(){function t(e,t,r){return e=e||function(){},n.markSupportedForProcessing(e),t&&i(e.prototype,t),r&&i(e,r),e}e.Namespace.define("WinJS.Class",{define:t,derive:function(e,r,o,s){if(e){r=r||function(){};var u=e.prototype -;return r.prototype=Object.create(u),n.markSupportedForProcessing(r),Object.defineProperty(r.prototype,"constructor",{value:r,writable:!0,configurable:!0,enumerable:!0}),o&&i(r.prototype,o),s&&i(r,s),r}return t(r,o,s)},mix:function(e){e=e||function(){};var t,n;for(t=1,n=arguments.length;t0;){var i=this._deliveryQueue.shift(),o=i[0],s=i[1];try{"function"==typeof o?o.call(void 0,s):o[0].call(o[1],s)}catch(r){n.onUnexpectedError(r)}}}},e.prototype.dispose=function(){this._listeners&&(this._listeners=null),this._deliveryQueue&&(this._deliveryQueue.length=0),this._disposed=!0},e._noop=function(){},e}();t.Emitter=l;var c=function(){ -function e(){var e=this;this.hasListeners=!1,this.events=[],this.emitter=new l({onFirstListenerAdd:function(){return e.onFirstListenerAdd()},onLastListenerRemove:function(){return e.onLastListenerRemove()}})}return Object.defineProperty(e.prototype,"event",{get:function(){return this.emitter.event},enumerable:!0,configurable:!0}),e.prototype.add=function(e){var t=this,n={event:e,listener:null};this.events.push(n),this.hasListeners&&this.hook(n);return i.toDisposable(r.once(function(){t.hasListeners&&t.unhook(n);var e=t.events.indexOf(n);t.events.splice(e,1)}))},e.prototype.onFirstListenerAdd=function(){var e=this;this.hasListeners=!0,this.events.forEach(function(t){return e.hook(t)})},e.prototype.onLastListenerRemove=function(){var e=this;this.hasListeners=!1,this.events.forEach(function(t){return e.unhook(t)})},e.prototype.hook=function(e){var t=this;e.listener=e.event(function(e){return t.emitter.fire(e)})},e.prototype.unhook=function(e){e.listener&&e.listener.dispose(),e.listener=null}, -e.prototype.dispose=function(){this.emitter.dispose()},e}();t.EventMultiplexer=c,t.once=function(e){return function(t,n,r){void 0===n&&(n=null);var i=!1,o=e(function(e){if(!i)return o?o.dispose():i=!0,t.call(n,e)},null,r);return i&&o.dispose(),o}},t.anyEvent=function(){for(var e=[],t=0;t1)&&a.fire(e),u=0},n)})},onLastListenerRemove:function(){i.dispose()}});return a.event};var f=function(){function e(){this.buffers=[]}return e.prototype.wrapEvent=function(e){var t=this;return function(n,r,i){return e(function(e){var i=t.buffers[t.buffers.length-1];i?i.push(function(){ -return n.call(r,e)}):n.call(r,e)},void 0,i)}},e.prototype.bufferEvents=function(e){var t=[];this.buffers.push(t);var n=e();return this.buffers.pop(),t.forEach(function(e){return e()}),n},e}();t.EventBufferer=f,t.mapEvent=s,t.filterEvent=u;var d=function(){function e(e){this._event=e}return Object.defineProperty(e.prototype,"event",{get:function(){return this._event},enumerable:!0,configurable:!0}),e.prototype.map=function(t){return new e(s(this._event,t))},e.prototype.filter=function(t){return new e(u(this._event,t))},e.prototype.on=function(e,t,n){return this._event(e,t,n)},e}();t.chain=function(e){return new d(e)};var h=function(){function e(){var e=this;this.listening=!1,this.inputEvent=a.None,this.inputEventListener=i.Disposable.None,this.emitter=new l({onFirstListenerDidAdd:function(){e.listening=!0,e.inputEventListener=e.inputEvent(e.emitter.fire,e.emitter)},onLastListenerRemove:function(){e.listening=!1,e.inputEventListener.dispose()}}),this.event=this.emitter.event} -return Object.defineProperty(e.prototype,"input",{set:function(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this.inputEventListener.dispose(),this.emitter.dispose()},e}();t.Relay=h}),i(e[10],t([0,1,9]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,i=Object.freeze(function(e,t){var n=setTimeout(e.bind(t),0);return{dispose:function(){clearTimeout(n)}}});!function(e){e.isCancellationToken=function(t){return t===e.None||t===e.Cancelled||t instanceof o||!(!t||"object"!=typeof t)&&"boolean"==typeof t.isCancellationRequested&&"function"==typeof t.onCancellationRequested},e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:n.Event.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:i})}(r=t.CancellationToken||(t.CancellationToken={}));var o=function(){function e(){ -this._isCancelled=!1,this._emitter=null}return e.prototype.cancel=function(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))},Object.defineProperty(e.prototype,"isCancellationRequested",{get:function(){return this._isCancelled},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"onCancellationRequested",{get:function(){return this._isCancelled?i:(this._emitter||(this._emitter=new n.Emitter),this._emitter.event)},enumerable:!0,configurable:!0}),e.prototype.dispose=function(){this._emitter&&(this._emitter.dispose(),this._emitter=null)},e}(),s=function(){function e(){}return Object.defineProperty(e.prototype,"token",{get:function(){return this._token||(this._token=new o),this._token},enumerable:!0,configurable:!0}),e.prototype.cancel=function(){this._token?this._token instanceof o&&this._token.cancel():this._token=r.Cancelled},e.prototype.dispose=function(){this._token?this._token instanceof o&&this._token.dispose():this._token=r.None},e}() -;t.CancellationTokenSource=s}),i(e[14],t([0,1,10,4,7,8]),function(e,t,n,r,i,o){"use strict";function u(e){var t=new n.CancellationTokenSource,i=e(t.token),o=new Promise(function(e,n){t.token.onCancellationRequested(function(){n(r.canceled())}),Promise.resolve(i).then(function(n){t.dispose(),e(n)},function(e){t.dispose(),n(e)})});return new(function(){function e(){}return e.prototype.cancel=function(){t.cancel()},e.prototype.then=function(e,t){return o.then(e,t)},e.prototype.catch=function(e){return this.then(void 0,e)},e}())}function a(e,t){return t?new Promise(function(n,i){var o=setTimeout(n,e);t.onCancellationRequested(function(){clearTimeout(o),i(r.canceled())})}):u(function(t){return a(e,t)})}Object.defineProperty(t,"__esModule",{value:!0}),t.isThenable=function(e){return e&&"function"==typeof e.then},t.createCancelablePromise=u;var l=function(){function e(e){this.defaultDelay=e,this.timeout=null,this.completionPromise=null,this.doResolve=null,this.task=null}return e.prototype.trigger=function(e,t){ -var n=this;return void 0===t&&(t=this.defaultDelay),this.task=e,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new o.TPromise(function(e,t){n.doResolve=e,n.doReject=t}).then(function(){n.completionPromise=null,n.doResolve=null;var e=n.task;return n.task=null,e()})),this.timeout=setTimeout(function(){n.timeout=null,n.doResolve(null)},t),this.completionPromise},e.prototype.cancel=function(){this.cancelTimeout(),this.completionPromise&&(this.doReject(r.canceled()),this.completionPromise=null)},e.prototype.cancelTimeout=function(){null!==this.timeout&&(clearTimeout(this.timeout),this.timeout=null)},e.prototype.dispose=function(){this.cancelTimeout()},e}();t.Delayer=l,t.timeout=a,t.always=function(e,t){function n(){try{t()}catch(e){r.onUnexpectedError(e)}}return e.then(function(e){return n()},function(e){return n()}),Promise.resolve(e)},t.first=function(e,t,n){void 0===t&&(t=function(e){return!!e}),void 0===n&&(n=null);var r=0,i=e.length,o=function(){if(r>=i)return Promise.resolve(n) -;var s=e[r++];return Promise.resolve(s()).then(function(e){return t(e)?Promise.resolve(e):o()})};return o()};var c=function(e){function t(t,n){var r=e.call(this)||this;return r._token=-1,"function"==typeof t&&"number"==typeof n&&r.setIfNotSet(t,n),r}return s(t,e),t.prototype.dispose=function(){this.cancel(),e.prototype.dispose.call(this)},t.prototype.cancel=function(){-1!==this._token&&(clearTimeout(this._token),this._token=-1)},t.prototype.cancelAndSet=function(e,t){var n=this;this.cancel(),this._token=setTimeout(function(){n._token=-1,e()},t)},t.prototype.setIfNotSet=function(e,t){var n=this;-1===this._token&&(this._token=setTimeout(function(){n._token=-1,e()},t))},t}(i.Disposable);t.TimeoutTimer=c;var f=function(e){function t(){var t=e.call(this)||this;return t._token=-1,t}return s(t,e),t.prototype.dispose=function(){this.cancel(),e.prototype.dispose.call(this)},t.prototype.cancel=function(){-1!==this._token&&(clearInterval(this._token),this._token=-1)},t.prototype.cancelAndSet=function(e,t){this.cancel(), -this._token=setInterval(function(){e()},t)},t}(i.Disposable);t.IntervalTimer=f;var d=function(){function e(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}return e.prototype.dispose=function(){this.cancel(),this.runner=null},e.prototype.cancel=function(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)},e.prototype.schedule=function(e){void 0===e&&(e=this.timeout),this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)},e.prototype.isScheduled=function(){return-1!==this.timeoutToken},e.prototype.onTimeout=function(){this.timeoutToken=-1,this.runner&&this.doRun()},e.prototype.doRun=function(){this.runner&&this.runner()},e}();t.RunOnceScheduler=d,function(){if("function"!=typeof requestIdleCallback||"function"!=typeof cancelIdleCallback){var e=Object.freeze({didTimeout:!0,timeRemaining:function(){return 15}});t.runWhenIdle=function(t,n){void 0===n&&(n=0);var r=setTimeout(function(){return t(e)},n),i=!1;return{ -dispose:function(){i||(i=!0,clearTimeout(r))}}}}else t.runWhenIdle=function(e,t){var n=requestIdleCallback(e,"number"==typeof t?{timeout:t}:void 0),r=!1;return{dispose:function(){r||(r=!0,cancelIdleCallback(n))}}}}();var h=function(){function e(e){var n=this;this._executor=function(){try{n._value=e()}catch(e){n._error=e}finally{n._didRun=!0}},this._handle=t.runWhenIdle(function(){return n._executor()})}return e.prototype.dispose=function(){this._handle.dispose()},e.prototype.getValue=function(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value},e}();t.IdleValue=h}),i(e[18],t([0,1,8,3,14]),function(e,t,n,r,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e){!function(e){return i.isThenable(e)&&"function"==typeof e.done}(e)?this._winjsPromise=new n.Promise(function(t,n){var i=!0;e(function(e){i?r.setImmediate(function(){return t(e)}):t(e)},function(e){i?r.setImmediate(function(){return n(e)}):n(e)}),i=!1 -}):this._winjsPromise=e}return e.all=function(t){return new e(n.Promise.join(t).then(null,function(e){for(var t in e)if(e.hasOwnProperty(t))return e[t]}))},e.race=function(t){return new e(n.Promise.any(t).then(function(e){return e.value},function(e){return e.value}))},e.resolve=function(t){return new e(n.Promise.wrap(t))},e.reject=function(t){return new e(n.Promise.wrapError(t))},e.prototype.then=function(t,i){var o=!0,s=new e(this._winjsPromise.then(t&&function(e){return o?new n.Promise(function(n,i){r.setImmediate(function(){var r;try{r=t(e)}catch(e){return void i(e)}n(r)})}):t(e)},i&&function(e){return o?new n.Promise(function(t,n){r.setImmediate(function(){var r;try{r=i(e)}catch(e){return void n(e)}t(r)})}):i(e)}));return o=!1,s},e.prototype.catch=function(e){return this.then(null,e)},e}();t.PolyfillPromise=o}),i(e[33],t([0,1,4,7,3,18]),function(e,t,n,r,i,o){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var u=self;void 0===u.Promise&&(u.Promise=o.PolyfillPromise);var a="$initialize",l=!1 -;t.logOnceWebWorkerWarning=function(e){i.isWeb&&(l||(l=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/Microsoft/monaco-editor#faq")),console.warn(e.message))};var c=function(){function e(e){this._workerId=-1,this._handler=e,this._lastSentReq=0,this._pendingReplies=Object.create(null)}return e.prototype.setWorkerId=function(e){this._workerId=e},e.prototype.sendMessage=function(e,t){var n=this,r=String(++this._lastSentReq);return new Promise(function(i,o){n._pendingReplies[r]={resolve:i,reject:o},n._send({vsWorker:n._workerId,req:r,method:e,args:t})})},e.prototype.handleMessage=function(e){var t;try{t=JSON.parse(e)}catch(e){return}t&&t.vsWorker&&(-1!==this._workerId&&t.vsWorker!==this._workerId||this._handleMessage(t))},e.prototype._handleMessage=function(e){var t=this;if(e.seq){var r=e;if(!this._pendingReplies[r.seq])return void console.warn("Got reply to unknown seq") -;var i=this._pendingReplies[r.seq];if(delete this._pendingReplies[r.seq],r.err){var o=r.err;return r.err.$isError&&((o=new Error).name=r.err.name,o.message=r.err.message,o.stack=r.err.stack),void i.reject(o)}i.resolve(r.res)}else{var s=e,u=s.req;this._handler.handleMessage(s.method,s.args).then(function(e){t._send({vsWorker:t._workerId,seq:u,res:e,err:void 0})},function(e){e.detail instanceof Error&&(e.detail=n.transformErrorForSerialization(e.detail)),t._send({vsWorker:t._workerId,seq:u,res:void 0,err:n.transformErrorForSerialization(e)})})}},e.prototype._send=function(e){var t=JSON.stringify(e);this._handler.sendMessage(t)},e}(),f=function(e){function t(t,n){var r=e.call(this)||this,i=null;r._worker=r._register(t.create("vs/base/common/worker/simpleWorker",function(e){r._protocol.handleMessage(e)},function(e){i&&i(e)})),r._protocol=new c({sendMessage:function(e){r._worker.postMessage(e)},handleMessage:function(e,t){return Promise.resolve(null)}}),r._protocol.setWorkerId(r._worker.getId());var o=null -;void 0!==self.require&&"function"==typeof self.require.getConfig?o=self.require.getConfig():void 0!==self.requirejs&&(o=self.requirejs.s.contexts._.config),r._onModuleLoaded=r._protocol.sendMessage(a,[r._worker.getId(),n,o]),r._lazyProxy=new Promise(function(e,t){i=t,r._onModuleLoaded.then(function(t){for(var n={},r=0;rn||e===n&&t>r?(this.startLineNumber=n,this.startColumn=r,this.endLineNumber=e,this.endColumn=t):(this.startLineNumber=e,this.startColumn=t,this.endLineNumber=n,this.endColumn=r)}return e.prototype.isEmpty=function(){return e.isEmpty(this)},e.isEmpty=function(e){ -return e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn},e.prototype.containsPosition=function(t){return e.containsPosition(this,t)},e.containsPosition=function(e,t){return!(t.lineNumbere.endLineNumber)&&(!(t.lineNumber===e.startLineNumber&&t.columne.endColumn))},e.prototype.containsRange=function(t){return e.containsRange(this,t)},e.containsRange=function(e,t){return!(t.startLineNumbere.endLineNumber||t.endLineNumber>e.endLineNumber)&&(!(t.startLineNumber===e.startLineNumber&&t.startColumne.endColumn)))},e.prototype.plusRange=function(t){return e.plusRange(this,t)},e.plusRange=function(t,n){var r,i,o,s;return n.startLineNumbert.endLineNumber?(o=n.endLineNumber,s=n.endColumn):n.endLineNumber===t.endLineNumber?(o=n.endLineNumber,s=Math.max(n.endColumn,t.endColumn)):(o=t.endLineNumber,s=t.endColumn),new e(r,i,o,s)},e.prototype.intersectRanges=function(t){return e.intersectRanges(this,t)},e.intersectRanges=function(t,n){var r=t.startLineNumber,i=t.startColumn,o=t.endLineNumber,s=t.endColumn,u=n.startLineNumber,a=n.startColumn,l=n.endLineNumber,c=n.endColumn;return rl?(o=l,s=c):o===l&&(s=Math.min(s,c)),r>o?null:r===o&&i>s?null:new e(r,i,o,s)},e.prototype.equalsRange=function(t){return e.equalsRange(this,t)},e.equalsRange=function(e,t){return!!e&&!!t&&e.startLineNumber===t.startLineNumber&&e.startColumn===t.startColumn&&e.endLineNumber===t.endLineNumber&&e.endColumn===t.endColumn},e.prototype.getEndPosition=function(){return new n.Position(this.endLineNumber,this.endColumn)}, -e.prototype.getStartPosition=function(){return new n.Position(this.startLineNumber,this.startColumn)},e.prototype.toString=function(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"},e.prototype.setEndPosition=function(t,n){return new e(this.startLineNumber,this.startColumn,t,n)},e.prototype.setStartPosition=function(t,n){return new e(t,n,this.endLineNumber,this.endColumn)},e.prototype.collapseToStart=function(){return e.collapseToStart(this)},e.collapseToStart=function(t){return new e(t.startLineNumber,t.startColumn,t.startLineNumber,t.startColumn)},e.fromPositions=function(t,n){return void 0===n&&(n=t),new e(t.lineNumber,t.column,n.lineNumber,n.column)},e.lift=function(t){return t?new e(t.startLineNumber,t.startColumn,t.endLineNumber,t.endColumn):null},e.isIRange=function(e){return e&&"number"==typeof e.startLineNumber&&"number"==typeof e.startColumn&&"number"==typeof e.endLineNumber&&"number"==typeof e.endColumn}, -e.areIntersectingOrTouching=function(e,t){return!(e.endLineNumbere.startLineNumber},e}();t.Range=r}),i(e[22],t([0,1,2,5]),function(e,t,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(e){function t(t,n,r,i){var o=e.call(this,t,n,r,i)||this;return o.selectionStartLineNumber=t,o.selectionStartColumn=n,o.positionLineNumber=r,o.positionColumn=i,o}return s(t,e),t.prototype.clone=function(){return new t(this.selectionStartLineNumber,this.selectionStartColumn,this.positionLineNumber,this.positionColumn)},t.prototype.toString=function(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"},t.prototype.equalsSelection=function(e){return t.selectionsEqual(this,e)},t.selectionsEqual=function(e,t){ -return e.selectionStartLineNumber===t.selectionStartLineNumber&&e.selectionStartColumn===t.selectionStartColumn&&e.positionLineNumber===t.positionLineNumber&&e.positionColumn===t.positionColumn},t.prototype.getDirection=function(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1},t.prototype.setEndPosition=function(e,n){return 0===this.getDirection()?new t(this.startLineNumber,this.startColumn,e,n):new t(e,n,this.startLineNumber,this.startColumn)},t.prototype.getPosition=function(){return new n.Position(this.positionLineNumber,this.positionColumn)},t.prototype.setStartPosition=function(e,n){return 0===this.getDirection()?new t(e,n,this.endLineNumber,this.endColumn):new t(this.endLineNumber,this.endColumn,e,n)},t.fromPositions=function(e,n){return void 0===n&&(n=e),new t(e.lineNumber,e.column,n.lineNumber,n.column)},t.liftSelection=function(e){return new t(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn)}, -t.selectionsArrEqual=function(e,t){if(e&&!t||!e&&t)return!1;if(!e&&!t)return!0;if(e.length!==t.length)return!1;for(var n=0,r=e.length;n4294967295?4294967295:0|e}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t,n){for(var r=new Uint8Array(e*t),i=0,o=e*t;i255?255:0|e},t.toUint32=n,t.toUint32Array=function(e){for(var t=e.length,r=new Uint32Array(t),i=0;i=0&&e<256?this._asciiMap[e]=r:this._map.set(e,r)},e.prototype.get=function(e){ -return e>=0&&e<256?this._asciiMap[e]:this._map.get(e)||this._defaultValue},e}();t.CharacterClassifier=r;var i=function(){function e(){this._actual=new r(0)}return e.prototype.add=function(e){this._actual.set(e,1)},e.prototype.has=function(e){return 1===this._actual.get(e)},e}();t.CharacterSet=i}),i(e[26],t([0,1,13,17]),function(e,t,n,r){"use strict";function i(e,t,r,i){return new n.LcsDiff(e,t,r).ComputeDiff(i)}Object.defineProperty(t,"__esModule",{value:!0});var o=5e3,s=3,u=function(){function e(t){for(var n=[],r=[],i=0,o=t.length;i1&&_>1;){ -if((E=p.charCodeAt(g-2))!==(S=m.charCodeAt(_-2)))break;g--,_--}(g>1||_>1)&&this._pushTrimWhitespaceCharChange(o,s+1,1,g,a+1,1,_);for(var v=u._getLastNonBlankColumn(p,1),y=u._getLastNonBlankColumn(m,1),b=p.length+1,C=m.length+1;v/?",t.DEFAULT_WORD_REGEXP=function(e){void 0===e&&(e="");for(var n="(-?\\d*\\.\\d\\w*)|([^",r=0;r=0||(n+="\\"+t.USUAL_WORD_SEPARATORS[r]);return n+="\\s]+)",new RegExp(n,"g")}(),t.ensureValidWordDefinition=function(e){var n=t.DEFAULT_WORD_REGEXP;if(e&&e instanceof RegExp)if(e.global)n=e;else{var r="g";e.ignoreCase&&(r+="i"),e.multiline&&(r+="m"), -n=new RegExp(e.source,r)}return n.lastIndex=0,n},t.getWordAtText=function(e,t,n,r){t.lastIndex=0;var i=t.exec(n);if(!i)return null;var o=i[0].indexOf(" ")>=0?function(e,t,n,r){var i=e-1-r;t.lastIndex=0;for(var o;o=t.exec(n);){var s=o.index||0;if(s>i)return null;if(t.lastIndex>=i)return{word:o[0],startColumn:r+1+s,endColumn:r+1+t.lastIndex}}return null}(e,t,n,r):function(e,t,n,r){var i=e-1-r,o=n.lastIndexOf(" ",i-1)+1,s=n.indexOf(" ",i);-1===s&&(s=n.length),t.lastIndex=o;for(var u;u=t.exec(n);){var a=u.index||0;if(a<=i&&t.lastIndex>=i)return{word:u[0],startColumn:r+1+a,endColumn:r+1+t.lastIndex}}return null}(e,t,n,r);return t.lastIndex=0,o}}),i(e[28],t([0,1,25,6]),function(e,t,n,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e){for(var t=0,n=0,i=0,o=e.length;it&&(t=a),u>n&&(n=u),l>n&&(n=l)}t++,n++;for(var c=new r.Uint8Matrix(n,t,0),i=0,o=e.length;i=this._maxCharCode?0:this._states.get(e,t)},e}(),o=null,s=null,u=function(){function e(){}return e._createLink=function(e,t,n,r,i){var o=i-1;do{var s=t.charCodeAt(o);if(2!==e.get(s))break;o--}while(o>r);if(r>0){var u=t.charCodeAt(r-1),a=t.charCodeAt(o);(40===u&&41===a||91===u&&93===a||123===u&&125===a)&&o--}return{range:{startLineNumber:n,startColumn:r+1,endLineNumber:n,endColumn:o+2},url:t.substring(r,o+1)}},e.computeLinks=function(t){for(var r=(null===o&&(o=new i([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),o),u=function(){if(null===s){for(s=new n.CharacterClassifier(0),e=0;e<" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".length;e++)s.set(" \t<>'\"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…".charCodeAt(e),1) -;for(var e=0;e<".,;".length;e++)s.set(".,;".charCodeAt(e),2)}return s}(),a=[],l=1,c=t.getLineCount();l<=c;l++){for(var f=t.getLineContent(l),d=f.length,h=0,p=0,m=0,g=1,_=!1,v=!1,y=!1;h=0?((r+=n?1:-1)<0?r=e.length-1:r%=e.length,e[r]):null},e.INSTANCE=new e,e}();t.BasicInplaceReplace=n}),i(e[30],t([0,1]),function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});!function(e){e[e.Unnecessary=1]="Unnecessary"}(t.MarkerTag||(t.MarkerTag={}));!function(e){e[e.Hint=1]="Hint",e[e.Info=2]="Info",e[e.Warning=4]="Warning",e[e.Error=8]="Error"}(t.MarkerSeverity||(t.MarkerSeverity={}));!function(e){e[e.Unknown=0]="Unknown",e[e.Backspace=1]="Backspace",e[e.Tab=2]="Tab",e[e.Enter=3]="Enter",e[e.Shift=4]="Shift",e[e.Ctrl=5]="Ctrl",e[e.Alt=6]="Alt",e[e.PauseBreak=7]="PauseBreak",e[e.CapsLock=8]="CapsLock",e[e.Escape=9]="Escape",e[e.Space=10]="Space",e[e.PageUp=11]="PageUp",e[e.PageDown=12]="PageDown",e[e.End=13]="End",e[e.Home=14]="Home",e[e.LeftArrow=15]="LeftArrow",e[e.UpArrow=16]="UpArrow",e[e.RightArrow=17]="RightArrow",e[e.DownArrow=18]="DownArrow",e[e.Insert=19]="Insert",e[e.Delete=20]="Delete",e[e.KEY_0=21]="KEY_0",e[e.KEY_1=22]="KEY_1",e[e.KEY_2=23]="KEY_2", -e[e.KEY_3=24]="KEY_3",e[e.KEY_4=25]="KEY_4",e[e.KEY_5=26]="KEY_5",e[e.KEY_6=27]="KEY_6",e[e.KEY_7=28]="KEY_7",e[e.KEY_8=29]="KEY_8",e[e.KEY_9=30]="KEY_9",e[e.KEY_A=31]="KEY_A",e[e.KEY_B=32]="KEY_B",e[e.KEY_C=33]="KEY_C",e[e.KEY_D=34]="KEY_D",e[e.KEY_E=35]="KEY_E",e[e.KEY_F=36]="KEY_F",e[e.KEY_G=37]="KEY_G",e[e.KEY_H=38]="KEY_H",e[e.KEY_I=39]="KEY_I",e[e.KEY_J=40]="KEY_J",e[e.KEY_K=41]="KEY_K",e[e.KEY_L=42]="KEY_L",e[e.KEY_M=43]="KEY_M",e[e.KEY_N=44]="KEY_N",e[e.KEY_O=45]="KEY_O",e[e.KEY_P=46]="KEY_P",e[e.KEY_Q=47]="KEY_Q",e[e.KEY_R=48]="KEY_R",e[e.KEY_S=49]="KEY_S",e[e.KEY_T=50]="KEY_T",e[e.KEY_U=51]="KEY_U",e[e.KEY_V=52]="KEY_V",e[e.KEY_W=53]="KEY_W",e[e.KEY_X=54]="KEY_X",e[e.KEY_Y=55]="KEY_Y",e[e.KEY_Z=56]="KEY_Z",e[e.Meta=57]="Meta",e[e.ContextMenu=58]="ContextMenu",e[e.F1=59]="F1",e[e.F2=60]="F2",e[e.F3=61]="F3",e[e.F4=62]="F4",e[e.F5=63]="F5",e[e.F6=64]="F6",e[e.F7=65]="F7",e[e.F8=66]="F8",e[e.F9=67]="F9",e[e.F10=68]="F10",e[e.F11=69]="F11",e[e.F12=70]="F12",e[e.F13=71]="F13",e[e.F14=72]="F14", -e[e.F15=73]="F15",e[e.F16=74]="F16",e[e.F17=75]="F17",e[e.F18=76]="F18",e[e.F19=77]="F19",e[e.NumLock=78]="NumLock",e[e.ScrollLock=79]="ScrollLock",e[e.US_SEMICOLON=80]="US_SEMICOLON",e[e.US_EQUAL=81]="US_EQUAL",e[e.US_COMMA=82]="US_COMMA",e[e.US_MINUS=83]="US_MINUS",e[e.US_DOT=84]="US_DOT",e[e.US_SLASH=85]="US_SLASH",e[e.US_BACKTICK=86]="US_BACKTICK",e[e.US_OPEN_SQUARE_BRACKET=87]="US_OPEN_SQUARE_BRACKET",e[e.US_BACKSLASH=88]="US_BACKSLASH",e[e.US_CLOSE_SQUARE_BRACKET=89]="US_CLOSE_SQUARE_BRACKET",e[e.US_QUOTE=90]="US_QUOTE",e[e.OEM_8=91]="OEM_8",e[e.OEM_102=92]="OEM_102",e[e.NUMPAD_0=93]="NUMPAD_0",e[e.NUMPAD_1=94]="NUMPAD_1",e[e.NUMPAD_2=95]="NUMPAD_2",e[e.NUMPAD_3=96]="NUMPAD_3",e[e.NUMPAD_4=97]="NUMPAD_4",e[e.NUMPAD_5=98]="NUMPAD_5",e[e.NUMPAD_6=99]="NUMPAD_6",e[e.NUMPAD_7=100]="NUMPAD_7",e[e.NUMPAD_8=101]="NUMPAD_8",e[e.NUMPAD_9=102]="NUMPAD_9",e[e.NUMPAD_MULTIPLY=103]="NUMPAD_MULTIPLY",e[e.NUMPAD_ADD=104]="NUMPAD_ADD",e[e.NUMPAD_SEPARATOR=105]="NUMPAD_SEPARATOR", -e[e.NUMPAD_SUBTRACT=106]="NUMPAD_SUBTRACT",e[e.NUMPAD_DECIMAL=107]="NUMPAD_DECIMAL",e[e.NUMPAD_DIVIDE=108]="NUMPAD_DIVIDE",e[e.KEY_IN_COMPOSITION=109]="KEY_IN_COMPOSITION",e[e.ABNT_C1=110]="ABNT_C1",e[e.ABNT_C2=111]="ABNT_C2",e[e.MAX_VALUE=112]="MAX_VALUE"}(t.KeyCode||(t.KeyCode={}));!function(e){e[e.LTR=0]="LTR",e[e.RTL=1]="RTL"}(t.SelectionDirection||(t.SelectionDirection={}));!function(e){e[e.Auto=1]="Auto",e[e.Hidden=2]="Hidden",e[e.Visible=3]="Visible"}(t.ScrollbarVisibility||(t.ScrollbarVisibility={}));!function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=4]="Right",e[e.Full=7]="Full"}(t.OverviewRulerLane||(t.OverviewRulerLane={}));!function(e){e[e.TextDefined=0]="TextDefined",e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"}(t.EndOfLinePreference||(t.EndOfLinePreference={}));!function(e){e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"}(t.DefaultEndOfLine||(t.DefaultEndOfLine={}));!function(e){e[e.LF=0]="LF",e[e.CRLF=1]="CRLF"}(t.EndOfLineSequence||(t.EndOfLineSequence={}));!function(e){ -e[e.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",e[e.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",e[e.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",e[e.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"}(t.TrackedRangeStickiness||(t.TrackedRangeStickiness={}));!function(e){e[e.Smooth=0]="Smooth",e[e.Immediate=1]="Immediate"}(t.ScrollType||(t.ScrollType={}));!function(e){e[e.NotSet=0]="NotSet",e[e.ContentFlush=1]="ContentFlush",e[e.RecoverFromMarkers=2]="RecoverFromMarkers",e[e.Explicit=3]="Explicit",e[e.Paste=4]="Paste",e[e.Undo=5]="Undo",e[e.Redo=6]="Redo"}(t.CursorChangeReason||(t.CursorChangeReason={}));!function(e){e[e.None=0]="None",e[e.Small=1]="Small",e[e.Large=2]="Large",e[e.SmallBlocks=3]="SmallBlocks",e[e.LargeBlocks=4]="LargeBlocks"}(t.RenderMinimap||(t.RenderMinimap={}));!function(e){e[e.None=0]="None",e[e.Same=1]="Same",e[e.Indent=2]="Indent",e[e.DeepIndent=3]="DeepIndent"}(t.WrappingIndent||(t.WrappingIndent={}));!function(e){ -e[e.Hidden=0]="Hidden",e[e.Blink=1]="Blink",e[e.Smooth=2]="Smooth",e[e.Phase=3]="Phase",e[e.Expand=4]="Expand",e[e.Solid=5]="Solid"}(t.TextEditorCursorBlinkingStyle||(t.TextEditorCursorBlinkingStyle={}));!function(e){e[e.Line=1]="Line",e[e.Block=2]="Block",e[e.Underline=3]="Underline",e[e.LineThin=4]="LineThin",e[e.BlockOutline=5]="BlockOutline",e[e.UnderlineThin=6]="UnderlineThin"}(t.TextEditorCursorStyle||(t.TextEditorCursorStyle={}));!function(e){e[e.Off=0]="Off",e[e.On=1]="On",e[e.Relative=2]="Relative",e[e.Interval=3]="Interval",e[e.Custom=4]="Custom"}(t.RenderLineNumbersType||(t.RenderLineNumbersType={}));!function(e){e[e.EXACT=0]="EXACT",e[e.ABOVE=1]="ABOVE",e[e.BELOW=2]="BELOW"}(t.ContentWidgetPositionPreference||(t.ContentWidgetPositionPreference={}));!function(e){e[e.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",e[e.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",e[e.TOP_CENTER=2]="TOP_CENTER"}(t.OverlayWidgetPositionPreference||(t.OverlayWidgetPositionPreference={}));!function(e){e[e.UNKNOWN=0]="UNKNOWN", -e[e.TEXTAREA=1]="TEXTAREA",e[e.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",e[e.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",e[e.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",e[e.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",e[e.CONTENT_TEXT=6]="CONTENT_TEXT",e[e.CONTENT_EMPTY=7]="CONTENT_EMPTY",e[e.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",e[e.CONTENT_WIDGET=9]="CONTENT_WIDGET",e[e.OVERVIEW_RULER=10]="OVERVIEW_RULER",e[e.SCROLLBAR=11]="SCROLLBAR",e[e.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",e[e.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"}(t.MouseTargetType||(t.MouseTargetType={}));!function(e){e[e.None=0]="None",e[e.Indent=1]="Indent",e[e.IndentOutdent=2]="IndentOutdent",e[e.Outdent=3]="Outdent"}(t.IndentAction||(t.IndentAction={}));!function(e){e[e.Method=0]="Method",e[e.Function=1]="Function",e[e.Constructor=2]="Constructor",e[e.Field=3]="Field",e[e.Variable=4]="Variable",e[e.Class=5]="Class",e[e.Struct=6]="Struct",e[e.Interface=7]="Interface",e[e.Module=8]="Module",e[e.Property=9]="Property",e[e.Event=10]="Event", -e[e.Operator=11]="Operator",e[e.Unit=12]="Unit",e[e.Value=13]="Value",e[e.Constant=14]="Constant",e[e.Enum=15]="Enum",e[e.EnumMember=16]="EnumMember",e[e.Keyword=17]="Keyword",e[e.Text=18]="Text",e[e.Color=19]="Color",e[e.File=20]="File",e[e.Reference=21]="Reference",e[e.Customcolor=22]="Customcolor",e[e.Folder=23]="Folder",e[e.TypeParameter=24]="TypeParameter",e[e.Snippet=25]="Snippet"}(t.CompletionItemKind||(t.CompletionItemKind={}));!function(e){e[e.KeepWhitespace=1]="KeepWhitespace",e[e.InsertAsSnippet=4]="InsertAsSnippet"}(t.CompletionItemInsertTextRule||(t.CompletionItemInsertTextRule={}));!function(e){e[e.Invoke=0]="Invoke",e[e.TriggerCharacter=1]="TriggerCharacter",e[e.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"}(t.CompletionTriggerKind||(t.CompletionTriggerKind={}));!function(e){e[e.Invoke=1]="Invoke",e[e.TriggerCharacter=2]="TriggerCharacter",e[e.ContentChange=3]="ContentChange"}(t.SignatureHelpTriggerReason||(t.SignatureHelpTriggerReason={}));!function(e){ -e[e.Text=0]="Text",e[e.Read=1]="Read",e[e.Write=2]="Write"}(t.DocumentHighlightKind||(t.DocumentHighlightKind={}));!function(e){e[e.File=0]="File",e[e.Module=1]="Module",e[e.Namespace=2]="Namespace",e[e.Package=3]="Package",e[e.Class=4]="Class",e[e.Method=5]="Method",e[e.Property=6]="Property",e[e.Field=7]="Field",e[e.Constructor=8]="Constructor",e[e.Enum=9]="Enum",e[e.Interface=10]="Interface",e[e.Function=11]="Function",e[e.Variable=12]="Variable",e[e.Constant=13]="Constant",e[e.String=14]="String",e[e.Number=15]="Number",e[e.Boolean=16]="Boolean",e[e.Array=17]="Array",e[e.Object=18]="Object",e[e.Key=19]="Key",e[e.Null=20]="Null",e[e.EnumMember=21]="EnumMember",e[e.Struct=22]="Struct",e[e.Event=23]="Event",e[e.Operator=24]="Operator",e[e.TypeParameter=25]="TypeParameter"}(t.SymbolKind||(t.SymbolKind={}))}),i(e[31],t([0,1,10,9,21,11,8,2,5,22,23,30]),function(e,t,n,r,i,o,s,u,a,l,c,f){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var d=function(){function e(){}return e.chord=function(e,t){ -return i.KeyChord(e,t)},e.CtrlCmd=2048,e.Shift=1024,e.Alt=512,e.WinCtrl=256,e}();t.KeyMod=d,t.createMonacoBaseAPI=function(){return{editor:void 0,languages:void 0,CancellationTokenSource:n.CancellationTokenSource,Emitter:r.Emitter,KeyCode:f.KeyCode,KeyMod:d,Position:u.Position,Range:a.Range,Selection:l.Selection,SelectionDirection:f.SelectionDirection,MarkerSeverity:f.MarkerSeverity,MarkerTag:f.MarkerTag,Promise:s.TPromise,Uri:o.URI,Token:c.Token}}}),i(e[32],t([0,1,6]),function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){this.index=e,this.remainder=t}}();t.PrefixSumIndexOfResult=r;var i=function(){function e(e){this.values=e,this.prefixSum=new Uint32Array(e.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}return e.prototype.getCount=function(){return this.values.length},e.prototype.insertValues=function(e,t){e=n.toUint32(e);var r=this.values,i=this.prefixSum,o=t.length -;return 0!==o&&(this.values=new Uint32Array(r.length+o),this.values.set(r.subarray(0,e),0),this.values.set(r.subarray(e),e+o),this.values.set(t,e),e-1=0&&this.prefixSum.set(i.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.changeValue=function(e,t){return e=n.toUint32(e),t=n.toUint32(t),this.values[e]!==t&&(this.values[e]=t,e-1=r.length)return!1;var o=r.length-e;return t>=o&&(t=o),0!==t&&(this.values=new Uint32Array(r.length-t),this.values.set(r.subarray(0,e),0),this.values.set(r.subarray(e+t),e),this.prefixSum=new Uint32Array(this.values.length),e-1=0&&this.prefixSum.set(i.subarray(0,this.prefixSumValidIndex[0]+1)),!0)},e.prototype.getTotalValue=function(){return 0===this.values.length?0:this._getAccumulatedValue(this.values.length-1)},e.prototype.getAccumulatedValue=function(e){return e<0?0:(e=n.toUint32(e),this._getAccumulatedValue(e))},e.prototype._getAccumulatedValue=function(e){if(e<=this.prefixSumValidIndex[0])return this.prefixSum[e];var t=this.prefixSumValidIndex[0]+1;0===t&&(this.prefixSum[0]=this.values[0],t++),e>=this.values.length&&(e=this.values.length-1);for(var n=t;n<=e;n++)this.prefixSum[n]=this.prefixSum[n-1]+this.values[n];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],e),this.prefixSum[e]},e.prototype.getIndexOf=function(e){e=Math.floor(e),this.getTotalValue();for(var t=0,n=this.values.length-1,i=0,o=0,s=0;t<=n;)if(i=t+(n-t)/2|0,o=this.prefixSum[i],s=o-this.values[i],e=o))break;t=i+1}return new r(i,e-s)},e}();t.PrefixSumComputer=i;var o=function(){function e(e){ -this._cacheAccumulatedValueStart=0,this._cache=null,this._actual=new i(e),this._bustCache()}return e.prototype._bustCache=function(){this._cacheAccumulatedValueStart=0,this._cache=null},e.prototype.insertValues=function(e,t){this._actual.insertValues(e,t)&&this._bustCache()},e.prototype.changeValue=function(e,t){this._actual.changeValue(e,t)&&this._bustCache()},e.prototype.removeValues=function(e,t){this._actual.removeValues(e,t)&&this._bustCache()},e.prototype.getTotalValue=function(){return this._actual.getTotalValue()},e.prototype.getAccumulatedValue=function(e){return this._actual.getAccumulatedValue(e)},e.prototype.getIndexOf=function(e){if(e=Math.floor(e),null!==this._cache){var t=e-this._cacheAccumulatedValueStart;if(t>=0&&t=r._lines.length?i.FIN:(n=r._lines[o],u=r._wordenize(n,e),s=0,o+=1,a())};return{next:a}},t.prototype.getLineWords=function(e,t){for(var n=this._lines[e-1],r=[],i=0,o=this._wordenize(n,t);ithis._lines.length)t=this._lines.length,n=this._lines[t-1].length+1,r=!0;else{var i=this._lines[t-1].length+1;n<1?(n=1,r=!0):n>i&&(n=i,r=!0)}return r?{lineNumber:t,column:n}:e},t}(f.MirrorTextModel),_=function(){function t(e){this._foreignModuleFactory=e,this._foreignModule=null}return t.prototype.computeDiff=function(e,t,n){var r=this._getModel(e),i=this._getModel(t);if(!r||!i)return Promise.resolve(null) -;var o=r.getLinesContent(),s=i.getLinesContent(),u=new c.DiffComputer(o,s,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:n,shouldMakePrettyDiff:!0}).computeDiff(),a=!(u.length>0)&&this._modelsAreIdentical(r,i);return Promise.resolve({identical:a,changes:u})},t.prototype._modelsAreIdentical=function(e,t){var n=e.getLineCount();if(n!==t.getLineCount())return!1;for(var r=1;r<=n;r++){if(e.getLineContent(r)!==t.getLineContent(r))return!1}return!0},t.prototype.computeMoreMinimalEdits=function(e,i){var o=this._getModel(e);if(!o)return Promise.resolve(i);for(var s=[],u=void 0,a=0,c=i=n.mergeSort(i,function(e,t){if(e.range&&t.range)return l.Range.compareRangesUsingStarts(e.range,t.range);return(e.range?0:1)-(t.range?0:1)});at._diffLimit)s.push({range:d,text:h -});else for(var g=r.stringDiff(m,h,!1),_=o.offsetAt(l.Range.lift(d).getStartPosition()),v=0,y=g;v0;)self.onmessage(r.shift())},0)})}(e.data)):r.push(e)}}()}).call(this); -//# sourceMappingURL=../../../../min-maps/vs/base/worker/workerMain.js.map \ No newline at end of file +(function () { + var e = [ + 'require', + 'exports', + 'vs/editor/common/core/position', + 'vs/base/common/platform', + 'vs/base/common/errors', + 'vs/editor/common/core/range', + 'vs/editor/common/core/uint', + 'vs/base/common/lifecycle', + 'vs/base/common/winjs.base', + 'vs/base/common/event', + 'vs/base/common/cancellation', + 'vs/base/common/uri', + 'vs/base/common/iterator', + 'vs/base/common/diff/diff', + 'vs/base/common/async', + 'vs/base/common/linkedList', + 'vs/base/common/functional', + 'vs/base/common/strings', + 'vs/base/common/winjs.polyfill.promise', + 'vs/editor/common/model/mirrorTextModel', + 'vs/base/common/diff/diffChange', + 'vs/base/common/keyCodes', + 'vs/editor/common/core/selection', + 'vs/editor/common/core/token', + 'vs/base/common/arrays', + 'vs/editor/common/core/characterClassifier', + 'vs/editor/common/diff/diffComputer', + 'vs/editor/common/model/wordHelper', + 'vs/editor/common/modes/linkComputer', + 'vs/editor/common/modes/supports/inplaceReplaceSupport', + 'vs/editor/common/standalone/standaloneEnums', + 'vs/editor/common/standalone/standaloneBase', + 'vs/editor/common/viewModel/prefixSumComputer', + 'vs/base/common/worker/simpleWorker', + 'vs/editor/common/services/editorSimpleWorker' + ], + t = function (t) { + for (var n = [], r = 0, i = t.length; r < i; r++) n[r] = e[t[r]]; + return n; + }, + n = this, + r = 'object' == typeof global ? global : {}; + !(function (e) { + e.global = n; + var t = (function () { + function t() { + (this._detected = !1), + (this._isWindows = !1), + (this._isNode = !1), + (this._isElectronRenderer = !1), + (this._isWebWorker = !1); + } + return ( + Object.defineProperty(t.prototype, 'isWindows', { + get: function () { + return this._detect(), this._isWindows; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(t.prototype, 'isNode', { + get: function () { + return this._detect(), this._isNode; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(t.prototype, 'isElectronRenderer', { + get: function () { + return this._detect(), this._isElectronRenderer; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(t.prototype, 'isWebWorker', { + get: function () { + return this._detect(), this._isWebWorker; + }, + enumerable: !0, + configurable: !0 + }), + (t.prototype._detect = function () { + this._detected || + ((this._detected = !0), + (this._isWindows = t._isWindows()), + (this._isNode = 'undefined' != typeof module && !!module.exports), + (this._isElectronRenderer = + 'undefined' != typeof process && + void 0 !== process.versions && + void 0 !== process.versions.electron && + 'renderer' === process.type), + (this._isWebWorker = 'function' == typeof e.global.importScripts)); + }), + (t._isWindows = function () { + return ( + !!('undefined' != typeof navigator && navigator.userAgent && navigator.userAgent.indexOf('Windows') >= 0) || + ('undefined' != typeof process && 'win32' === process.platform) + ); + }), + t + ); + })(); + e.Environment = t; + })(o || (o = {})); + !(function (e) { + var t = (function () { + return function (e, t, n) { + (this.type = e), (this.detail = t), (this.timestamp = n); + }; + })(); + e.LoaderEvent = t; + var n = (function () { + function n(e) { + this._events = [new t(1, '', e)]; + } + return ( + (n.prototype.record = function (n, r) { + this._events.push(new t(n, r, e.Utilities.getHighPerformanceTimestamp())); + }), + (n.prototype.getEvents = function () { + return this._events; + }), + n + ); + })(); + e.LoaderEventRecorder = n; + var r = (function () { + function e() {} + return ( + (e.prototype.record = function (e, t) {}), + (e.prototype.getEvents = function () { + return []; + }), + e + ); + })(); + (r.INSTANCE = new r()), (e.NullLoaderEventRecorder = r); + })(o || (o = {})); + !(function (e) { + var t = (function () { + function t() {} + return ( + (t.fileUriToFilePath = function (e, t) { + if (((t = decodeURI(t).replace(/%23/g, '#')), e)) { + if (/^file:\/\/\//.test(t)) return t.substr(8); + if (/^file:\/\//.test(t)) return t.substr(5); + } else if (/^file:\/\//.test(t)) return t.substr(7); + return t; + }), + (t.startsWith = function (e, t) { + return e.length >= t.length && e.substr(0, t.length) === t; + }), + (t.endsWith = function (e, t) { + return e.length >= t.length && e.substr(e.length - t.length) === t; + }), + (t.containsQueryString = function (e) { + return /^[^\#]*\?/gi.test(e); + }), + (t.isAbsolutePath = function (e) { + return /^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(e); + }), + (t.forEachProperty = function (e, t) { + if (e) { + var n = void 0; + for (n in e) e.hasOwnProperty(n) && t(n, e[n]); + } + }), + (t.isEmpty = function (e) { + var n = !0; + return ( + t.forEachProperty(e, function () { + n = !1; + }), + n + ); + }), + (t.recursiveClone = function (e) { + if (!e || 'object' != typeof e) return e; + var n = Array.isArray(e) ? [] : {}; + return ( + t.forEachProperty(e, function (e, r) { + n[e] = r && 'object' == typeof r ? t.recursiveClone(r) : r; + }), + n + ); + }), + (t.generateAnonymousModule = function () { + return '===anonymous' + t.NEXT_ANONYMOUS_ID++ + '==='; + }), + (t.isAnonymousModule = function (e) { + return t.startsWith(e, '===anonymous'); + }), + (t.getHighPerformanceTimestamp = function () { + return ( + this.PERFORMANCE_NOW_PROBED || + ((this.PERFORMANCE_NOW_PROBED = !0), + (this.HAS_PERFORMANCE_NOW = e.global.performance && 'function' == typeof e.global.performance.now)), + this.HAS_PERFORMANCE_NOW ? e.global.performance.now() : Date.now() + ); + }), + t + ); + })(); + (t.NEXT_ANONYMOUS_ID = 1), (t.PERFORMANCE_NOW_PROBED = !1), (t.HAS_PERFORMANCE_NOW = !1), (e.Utilities = t); + })(o || (o = {})); + !(function (e) { + var t = (function () { + function t() {} + return ( + (t.validateConfigurationOptions = function (t) { + function n(e) { + return 'load' === e.errorCode + ? (console.error('Loading "' + e.moduleId + '" failed'), + console.error('Detail: ', e.detail), + e.detail && e.detail.stack && console.error(e.detail.stack), + console.error('Here are the modules that depend on it:'), + void console.error(e.neededBy)) + : 'factory' === e.errorCode + ? (console.error('The factory method of "' + e.moduleId + '" has thrown an exception'), + console.error(e.detail), + void (e.detail && e.detail.stack && console.error(e.detail.stack))) + : void 0; + } + return ( + 'string' != typeof (t = t || {}).baseUrl && (t.baseUrl = ''), + 'boolean' != typeof t.isBuild && (t.isBuild = !1), + 'object' != typeof t.paths && (t.paths = {}), + 'object' != typeof t.config && (t.config = {}), + void 0 === t.catchError && (t.catchError = !1), + 'string' != typeof t.urlArgs && (t.urlArgs = ''), + 'function' != typeof t.onError && (t.onError = n), + ('object' == typeof t.ignoreDuplicateModules && Array.isArray(t.ignoreDuplicateModules)) || + (t.ignoreDuplicateModules = []), + t.baseUrl.length > 0 && (e.Utilities.endsWith(t.baseUrl, '/') || (t.baseUrl += '/')), + 'string' != typeof t.cspNonce && (t.cspNonce = ''), + Array.isArray(t.nodeModules) || (t.nodeModules = []), + ('number' != typeof t.nodeCachedDataWriteDelay || t.nodeCachedDataWriteDelay < 0) && + (t.nodeCachedDataWriteDelay = 7e3), + 'function' != typeof t.onNodeCachedData && + (t.onNodeCachedData = function (e, t) { + e && + ('cachedDataRejected' === e.errorCode + ? console.warn('Rejected cached data from file: ' + e.path) + : 'unlink' === e.errorCode || 'writeFile' === e.errorCode + ? (console.error('Problems writing cached data file: ' + e.path), console.error(e.detail)) + : console.error(e)); + }), + t + ); + }), + (t.mergeConfigurationOptions = function (n, r) { + void 0 === n && (n = null), void 0 === r && (r = null); + var i = e.Utilities.recursiveClone(r || {}); + return ( + e.Utilities.forEachProperty(n, function (t, n) { + 'ignoreDuplicateModules' === t && void 0 !== i.ignoreDuplicateModules + ? (i.ignoreDuplicateModules = i.ignoreDuplicateModules.concat(n)) + : 'paths' === t && void 0 !== i.paths + ? e.Utilities.forEachProperty(n, function (e, t) { + return (i.paths[e] = t); + }) + : 'config' === t && void 0 !== i.config + ? e.Utilities.forEachProperty(n, function (e, t) { + return (i.config[e] = t); + }) + : (i[t] = e.Utilities.recursiveClone(n)); + }), + t.validateConfigurationOptions(i) + ); + }), + t + ); + })(); + e.ConfigurationOptionsUtil = t; + var n = (function () { + function n(e, n) { + if ( + ((this._env = e), + (this.options = t.mergeConfigurationOptions(n)), + this._createIgnoreDuplicateModulesMap(), + this._createNodeModulesMap(), + this._createSortedPathsRules(), + '' === this.options.baseUrl) + ) { + if ( + this.options.nodeRequire && + this.options.nodeRequire.main && + this.options.nodeRequire.main.filename && + this._env.isNode + ) { + var r = this.options.nodeRequire.main.filename, + i = Math.max(r.lastIndexOf('/'), r.lastIndexOf('\\')); + this.options.baseUrl = r.substring(0, i + 1); + } + if (this.options.nodeMain && this._env.isNode) { + var r = this.options.nodeMain, + i = Math.max(r.lastIndexOf('/'), r.lastIndexOf('\\')); + this.options.baseUrl = r.substring(0, i + 1); + } + } + } + return ( + (n.prototype._createIgnoreDuplicateModulesMap = function () { + this.ignoreDuplicateModulesMap = {}; + for (var e = 0; e < this.options.ignoreDuplicateModules.length; e++) + this.ignoreDuplicateModulesMap[this.options.ignoreDuplicateModules[e]] = !0; + }), + (n.prototype._createNodeModulesMap = function () { + this.nodeModulesMap = Object.create(null); + for (var e = 0, t = this.options.nodeModules; e < t.length; e++) { + var n = t[e]; + this.nodeModulesMap[n] = !0; + } + }), + (n.prototype._createSortedPathsRules = function () { + var t = this; + (this.sortedPathsRules = []), + e.Utilities.forEachProperty(this.options.paths, function (e, n) { + Array.isArray(n) ? t.sortedPathsRules.push({ from: e, to: n }) : t.sortedPathsRules.push({ from: e, to: [n] }); + }), + this.sortedPathsRules.sort(function (e, t) { + return t.from.length - e.from.length; + }); + }), + (n.prototype.cloneAndMerge = function (e) { + return new n(this._env, t.mergeConfigurationOptions(e, this.options)); + }), + (n.prototype.getOptionsLiteral = function () { + return this.options; + }), + (n.prototype._applyPaths = function (t) { + for (var n, r = 0, i = this.sortedPathsRules.length; r < i; r++) + if (((n = this.sortedPathsRules[r]), e.Utilities.startsWith(t, n.from))) { + for (var o = [], s = 0, u = n.to.length; s < u; s++) o.push(n.to[s] + t.substr(n.from.length)); + return o; + } + return [t]; + }), + (n.prototype._addUrlArgsToUrl = function (t) { + return e.Utilities.containsQueryString(t) ? t + '&' + this.options.urlArgs : t + '?' + this.options.urlArgs; + }), + (n.prototype._addUrlArgsIfNecessaryToUrl = function (e) { + return this.options.urlArgs ? this._addUrlArgsToUrl(e) : e; + }), + (n.prototype._addUrlArgsIfNecessaryToUrls = function (e) { + if (this.options.urlArgs) for (var t = 0, n = e.length; t < n; t++) e[t] = this._addUrlArgsToUrl(e[t]); + return e; + }), + (n.prototype.moduleIdToPaths = function (t) { + if (!0 === this.nodeModulesMap[t]) return this.isBuild() ? ['empty:'] : ['node|' + t]; + var n, + r = t; + if (e.Utilities.endsWith(r, '.js') || e.Utilities.isAbsolutePath(r)) + e.Utilities.endsWith(r, '.js') || e.Utilities.containsQueryString(r) || (r += '.js'), (n = [r]); + else + for (var i = 0, o = (n = this._applyPaths(r)).length; i < o; i++) + (this.isBuild() && 'empty:' === n[i]) || + (e.Utilities.isAbsolutePath(n[i]) || (n[i] = this.options.baseUrl + n[i]), + e.Utilities.endsWith(n[i], '.js') || e.Utilities.containsQueryString(n[i]) || (n[i] = n[i] + '.js')); + return this._addUrlArgsIfNecessaryToUrls(n); + }), + (n.prototype.requireToUrl = function (t) { + var n = t; + return ( + e.Utilities.isAbsolutePath(n) || + ((n = this._applyPaths(n)[0]), e.Utilities.isAbsolutePath(n) || (n = this.options.baseUrl + n)), + this._addUrlArgsIfNecessaryToUrl(n) + ); + }), + (n.prototype.isBuild = function () { + return this.options.isBuild; + }), + (n.prototype.isDuplicateMessageIgnoredFor = function (e) { + return this.ignoreDuplicateModulesMap.hasOwnProperty(e); + }), + (n.prototype.getConfigForModule = function (e) { + if (this.options.config) return this.options.config[e]; + }), + (n.prototype.shouldCatchError = function () { + return this.options.catchError; + }), + (n.prototype.shouldRecordStats = function () { + return this.options.recordStats; + }), + (n.prototype.onError = function (e) { + this.options.onError(e); + }), + n + ); + })(); + e.Configuration = n; + })(o || (o = {})); + !(function (e) { + var t = (function () { + function e(e) { + (this._env = e), (this._scriptLoader = null), (this._callbackMap = {}); + } + return ( + (e.prototype.load = function (e, t, r, s) { + var u = this; + this._scriptLoader || + (this._scriptLoader = this._env.isWebWorker ? new i() : this._env.isNode ? new o(this._env) : new n()); + var a = { callback: r, errorback: s }; + this._callbackMap.hasOwnProperty(t) + ? this._callbackMap[t].push(a) + : ((this._callbackMap[t] = [a]), + this._scriptLoader.load( + e, + t, + function () { + return u.triggerCallback(t); + }, + function (e) { + return u.triggerErrorback(t, e); + } + )); + }), + (e.prototype.triggerCallback = function (e) { + var t = this._callbackMap[e]; + delete this._callbackMap[e]; + for (var n = 0; n < t.length; n++) t[n].callback(); + }), + (e.prototype.triggerErrorback = function (e, t) { + var n = this._callbackMap[e]; + delete this._callbackMap[e]; + for (var r = 0; r < n.length; r++) n[r].errorback(t); + }), + e + ); + })(), + n = (function () { + function e() {} + return ( + (e.prototype.attachListeners = function (e, t, n) { + var r = function () { + e.removeEventListener('load', i), e.removeEventListener('error', o); + }, + i = function (e) { + r(), t(); + }, + o = function (e) { + r(), n(e); + }; + e.addEventListener('load', i), e.addEventListener('error', o); + }), + (e.prototype.load = function (e, t, n, r) { + var i = document.createElement('script'); + i.setAttribute('async', 'async'), + i.setAttribute('type', 'text/javascript'), + this.attachListeners(i, n, r), + i.setAttribute('src', t); + var o = e.getConfig().getOptionsLiteral().cspNonce; + o && i.setAttribute('nonce', o), document.getElementsByTagName('head')[0].appendChild(i); + }), + e + ); + })(), + i = (function () { + function e() {} + return ( + (e.prototype.load = function (e, t, n, r) { + try { + importScripts(t), n(); + } catch (e) { + r(e); + } + }), + e + ); + })(), + o = (function () { + function t(e) { + (this._env = e), (this._didInitialize = !1), (this._didPatchNodeRequire = !1); + } + return ( + (t.prototype._init = function (e) { + if (!this._didInitialize) { + (this._didInitialize = !0), + (this._fs = e('fs')), + (this._vm = e('vm')), + (this._path = e('path')), + (this._crypto = e('crypto')), + (this._jsflags = ''); + for (var t = 0, n = process.argv; t < n.length; t++) { + var r = n[t]; + if (0 === r.indexOf('--js-flags=')) { + this._jsflags = r; + break; + } + } + } + }), + (t.prototype._initNodeRequire = function (e, t) { + var n = t.getConfig().getOptionsLiteral().nodeCachedDataDir; + if (n && !this._didPatchNodeRequire) { + this._didPatchNodeRequire = !0; + var i = this, + o = e('module'); + o.prototype._compile = function (e, s) { + e = e.replace(/^#!.*/, ''); + var u = o.wrap(e), + a = i._getCachedDataPath(n, s), + l = { filename: s }; + try { + l.cachedData = i._fs.readFileSync(a); + } catch (e) { + l.produceCachedData = !0; + } + var c = new i._vm.Script(u, l), + f = c.runInThisContext(l), + d = i._path.dirname(s), + h = (function (e) { + var t = e.constructor, + n = function (t) { + try { + return e.require(t); + } finally { + } + }; + return ( + (n.resolve = function (n) { + return t._resolveFilename(n, e); + }), + (n.main = process.mainModule), + (n.extensions = t._extensions), + (n.cache = t._cache), + n + ); + })(this), + p = [this.exports, h, this, s, d, process, r, Buffer], + m = f.apply(this.exports, p); + return i._processCachedData(t, c, a), m; + }; + } + }), + (t.prototype.load = function (n, r, i, o) { + var s = this, + u = n.getConfig().getOptionsLiteral(), + a = u.nodeRequire || e.global.nodeRequire, + l = + u.nodeInstrumenter || + function (e) { + return e; + }; + this._init(a), this._initNodeRequire(a, n); + var c = n.getRecorder(); + if (/^node\|/.test(r)) { + var f = r.split('|'), + d = null; + try { + d = a(f[1]); + } catch (e) { + return void o(e); + } + n.enqueueDefineAnonymousModule([], function () { + return d; + }), + i(); + } else + (r = e.Utilities.fileUriToFilePath(this._env.isWindows, r)), + this._fs.readFile(r, { encoding: 'utf8' }, function (e, a) { + if (e) o(e); + else { + var f = s._path.normalize(r), + d = f; + if (s._env.isElectronRenderer) { + var h = d.match(/^([a-z])\:(.*)/i); + d = h ? 'file:///' + (h[1].toUpperCase() + ':' + h[2]).replace(/\\/g, '/') : 'file://' + d; + } + var p, + m = '(function (require, define, __filename, __dirname) { '; + if ( + ((p = a.charCodeAt(0) === t._BOM ? m + a.substring(1) + '\n});' : m + a + '\n});'), + (p = l(p, f)), + u.nodeCachedDataDir) + ) { + var g = s._getCachedDataPath(u.nodeCachedDataDir, r); + s._fs.readFile(g, function (e, t) { + var u = { filename: d, produceCachedData: void 0 === t, cachedData: t }, + a = s._loadAndEvalScript(n, r, d, p, u, c, i, o); + s._processCachedData(n, a, g); + }); + } else s._loadAndEvalScript(n, r, d, p, { filename: d }, c, i, o); + } + }); + }), + (t.prototype._loadAndEvalScript = function (t, n, r, i, o, s, u, a) { + s.record(31, n); + var l = new this._vm.Script(i, o), + c = l.runInThisContext(o), + f = t.getGlobalAMDDefineFunc(), + d = !1, + h = function () { + return (d = !0), f.apply(null, arguments); + }; + return ( + (h.amd = f.amd), + c.call(e.global, t.getGlobalAMDRequireFunc(), h, r, this._path.dirname(n)), + s.record(32, n), + d ? u() : a(new Error("Didn't receive define call in " + n + '!')), + l + ); + }), + (t.prototype._getCachedDataPath = function (e, t) { + var n = this._crypto.createHash('md5').update(t, 'utf8').update(this._jsflags, 'utf8').digest('hex'), + r = this._path.basename(t).replace(/\.js$/, ''); + return this._path.join(e, r + '-' + n + '.code'); + }), + (t.prototype._processCachedData = function (e, n, r) { + var i = this; + n.cachedDataRejected + ? (e.getConfig().getOptionsLiteral().onNodeCachedData({ errorCode: 'cachedDataRejected', path: r }), + t._runSoon(function () { + return i._fs.unlink(r, function (t) { + t && e.getConfig().getOptionsLiteral().onNodeCachedData({ errorCode: 'unlink', path: r, detail: t }); + }); + }, e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay)) + : n.cachedDataProduced && + (e + .getConfig() + .getOptionsLiteral() + .onNodeCachedData(void 0, { path: r, length: n.cachedData.length }), + t._runSoon(function () { + return i._fs.writeFile(r, n.cachedData, function (t) { + t && + e + .getConfig() + .getOptionsLiteral() + .onNodeCachedData({ errorCode: 'writeFile', path: r, detail: t }); + }); + }, e.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay)); + }), + (t._runSoon = function (e, t) { + var n = t + Math.ceil(Math.random() * t); + setTimeout(e, n); + }), + t + ); + })(); + (o._BOM = 65279), + (e.createScriptLoader = function (e) { + return new t(e); + }); + })(o || (o = {})); + !(function (e) { + var t = (function () { + function t(e) { + var t = e.lastIndexOf('/'); + this.fromModulePath = -1 !== t ? e.substr(0, t + 1) : ''; + } + return ( + (t._normalizeModuleId = function (e) { + var t, + n = e; + for (t = /\/\.\//; t.test(n); ) n = n.replace(t, '/'); + for ( + n = n.replace(/^\.\//g, ''), t = /\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//; + t.test(n); + + ) + n = n.replace(t, '/'); + return (n = n.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//, '')); + }), + (t.prototype.resolveModule = function (n) { + var r = n; + return ( + e.Utilities.isAbsolutePath(r) || + ((e.Utilities.startsWith(r, './') || e.Utilities.startsWith(r, '../')) && + (r = t._normalizeModuleId(this.fromModulePath + r))), + r + ); + }), + t + ); + })(); + (t.ROOT = new t('')), (e.ModuleIdResolver = t); + var n = (function () { + function t(e, t, n, r, i, o) { + (this.id = e), + (this.strId = t), + (this.dependencies = n), + (this._callback = r), + (this._errorback = i), + (this.moduleIdResolver = o), + (this.exports = {}), + (this.exportsPassedIn = !1), + (this.unresolvedDependenciesCount = this.dependencies.length), + (this._isComplete = !1); + } + return ( + (t._safeInvokeFunction = function (t, n) { + try { + return { returnedValue: t.apply(e.global, n), producedError: null }; + } catch (e) { + return { returnedValue: null, producedError: e }; + } + }), + (t._invokeFactory = function (t, n, r, i) { + return t.isBuild() && !e.Utilities.isAnonymousModule(n) + ? { returnedValue: null, producedError: null } + : t.shouldCatchError() + ? this._safeInvokeFunction(r, i) + : { returnedValue: r.apply(e.global, i), producedError: null }; + }), + (t.prototype.complete = function (n, r, i) { + this._isComplete = !0; + var o = null; + if (this._callback) + if ('function' == typeof this._callback) { + n.record(21, this.strId); + var s = t._invokeFactory(r, this.strId, this._callback, i); + (o = s.producedError), + n.record(22, this.strId), + o || + void 0 === s.returnedValue || + (this.exportsPassedIn && !e.Utilities.isEmpty(this.exports)) || + (this.exports = s.returnedValue); + } else this.exports = this._callback; + o && r.onError({ errorCode: 'factory', moduleId: this.strId, detail: o }), + (this.dependencies = null), + (this._callback = null), + (this._errorback = null), + (this.moduleIdResolver = null); + }), + (t.prototype.onDependencyError = function (e) { + return !!this._errorback && (this._errorback(e), !0); + }), + (t.prototype.isComplete = function () { + return this._isComplete; + }), + t + ); + })(); + e.Module = n; + var r = (function () { + function e() { + (this._nextId = 0), + (this._strModuleIdToIntModuleId = new Map()), + (this._intModuleIdToStrModuleId = []), + this.getModuleId('exports'), + this.getModuleId('module'), + this.getModuleId('require'); + } + return ( + (e.prototype.getMaxModuleId = function () { + return this._nextId; + }), + (e.prototype.getModuleId = function (e) { + var t = this._strModuleIdToIntModuleId.get(e); + return ( + void 0 === t && + ((t = this._nextId++), this._strModuleIdToIntModuleId.set(e, t), (this._intModuleIdToStrModuleId[t] = e)), + t + ); + }), + (e.prototype.getStrModuleId = function (e) { + return this._intModuleIdToStrModuleId[e]; + }), + e + ); + })(), + i = (function () { + return function (e) { + this.id = e; + }; + })(); + (i.EXPORTS = new i(0)), (i.MODULE = new i(1)), (i.REQUIRE = new i(2)), (e.RegularDependency = i); + var o = (function () { + return function (e, t, n) { + (this.id = e), (this.pluginId = t), (this.pluginParam = n); + }; + })(); + e.PluginDependency = o; + var s = (function () { + function s(t, n, i, o, s) { + void 0 === s && (s = 0), + (this._env = t), + (this._scriptLoader = n), + (this._loaderAvailableTimestamp = s), + (this._defineFunc = i), + (this._requireFunc = o), + (this._moduleIdProvider = new r()), + (this._config = new e.Configuration(this._env)), + (this._modules2 = []), + (this._knownModules2 = []), + (this._inverseDependencies2 = []), + (this._inversePluginDependencies2 = new Map()), + (this._currentAnnonymousDefineCall = null), + (this._recorder = null), + (this._buildInfoPath = []), + (this._buildInfoDefineStack = []), + (this._buildInfoDependencies = []); + } + return ( + (s.prototype.reset = function () { + return new s(this._env, this._scriptLoader, this._defineFunc, this._requireFunc, this._loaderAvailableTimestamp); + }), + (s.prototype.getGlobalAMDDefineFunc = function () { + return this._defineFunc; + }), + (s.prototype.getGlobalAMDRequireFunc = function () { + return this._requireFunc; + }), + (s._findRelevantLocationInStack = function (e, t) { + for ( + var n = function (e) { + return e.replace(/\\/g, '/'); + }, + r = n(e), + i = t.split(/\n/), + o = 0; + o < i.length; + o++ + ) { + var s = i[o].match(/(.*):(\d+):(\d+)\)?$/); + if (s) { + var u = s[1], + a = s[2], + l = s[3], + c = Math.max(u.lastIndexOf(' ') + 1, u.lastIndexOf('(') + 1); + if (((u = u.substr(c)), (u = n(u)) === r)) { + var f = { line: parseInt(a, 10), col: parseInt(l, 10) }; + return 1 === f.line && (f.col -= '(function (require, define, __filename, __dirname) { '.length), f; + } + } + } + throw new Error('Could not correlate define call site for needle ' + e); + }), + (s.prototype.getBuildInfo = function () { + if (!this._config.isBuild()) return null; + for (var e = [], t = 0, n = 0, r = this._modules2.length; n < r; n++) { + var i = this._modules2[n]; + if (i) { + var o = this._buildInfoPath[i.id] || null, + u = this._buildInfoDefineStack[i.id] || null, + a = this._buildInfoDependencies[i.id]; + e[t++] = { + id: i.strId, + path: o, + defineLocation: o && u ? s._findRelevantLocationInStack(o, u) : null, + dependencies: a, + shim: null, + exports: i.exports + }; + } + } + return e; + }), + (s.prototype.getRecorder = function () { + return ( + this._recorder || + (this._config.shouldRecordStats() + ? (this._recorder = new e.LoaderEventRecorder(this._loaderAvailableTimestamp)) + : (this._recorder = e.NullLoaderEventRecorder.INSTANCE)), + this._recorder + ); + }), + (s.prototype.getLoaderEvents = function () { + return this.getRecorder().getEvents(); + }), + (s.prototype.enqueueDefineAnonymousModule = function (e, t) { + if (null !== this._currentAnnonymousDefineCall) + throw new Error('Can only have one anonymous define call per script file'); + var n = null; + this._config.isBuild() && (n = new Error('StackLocation').stack), + (this._currentAnnonymousDefineCall = { stack: n, dependencies: e, callback: t }); + }), + (s.prototype.defineModule = function (e, r, i, o, s, u) { + var a = this; + void 0 === u && (u = new t(e)); + var l = this._moduleIdProvider.getModuleId(e); + if (this._modules2[l]) + this._config.isDuplicateMessageIgnoredFor(e) || console.warn("Duplicate definition of module '" + e + "'"); + else { + var c = new n(l, e, this._normalizeDependencies(r, u), i, o, u); + (this._modules2[l] = c), + this._config.isBuild() && + ((this._buildInfoDefineStack[l] = s), + (this._buildInfoDependencies[l] = c.dependencies.map(function (e) { + return a._moduleIdProvider.getStrModuleId(e.id); + }))), + this._resolve(c); + } + }), + (s.prototype._normalizeDependency = function (e, t) { + if ('exports' === e) return i.EXPORTS; + if ('module' === e) return i.MODULE; + if ('require' === e) return i.REQUIRE; + var n = e.indexOf('!'); + if (n >= 0) { + var r = t.resolveModule(e.substr(0, n)), + s = t.resolveModule(e.substr(n + 1)), + u = this._moduleIdProvider.getModuleId(r + '!' + s), + a = this._moduleIdProvider.getModuleId(r); + return new o(u, a, s); + } + return new i(this._moduleIdProvider.getModuleId(t.resolveModule(e))); + }), + (s.prototype._normalizeDependencies = function (e, t) { + for (var n = [], r = 0, i = 0, o = e.length; i < o; i++) n[r++] = this._normalizeDependency(e[i], t); + return n; + }), + (s.prototype._relativeRequire = function (t, n, r, i) { + if ('string' == typeof n) return this.synchronousRequire(n, t); + this.defineModule(e.Utilities.generateAnonymousModule(), n, r, i, null, t); + }), + (s.prototype.synchronousRequire = function (e, n) { + void 0 === n && (n = new t(e)); + var r = this._normalizeDependency(e, n), + i = this._modules2[r.id]; + if (!i) + throw new Error( + "Check dependency list! Synchronous require cannot resolve module '" + + e + + "'. This is the first mention of this module!" + ); + if (!i.isComplete()) + throw new Error( + "Check dependency list! Synchronous require cannot resolve module '" + + e + + "'. This module has not been resolved completely yet." + ); + return i.exports; + }), + (s.prototype.configure = function (t, n) { + var r = this._config.shouldRecordStats(); + (this._config = n ? new e.Configuration(this._env, t) : this._config.cloneAndMerge(t)), + this._config.shouldRecordStats() && !r && (this._recorder = null); + }), + (s.prototype.getConfig = function () { + return this._config; + }), + (s.prototype._onLoad = function (e) { + if (null !== this._currentAnnonymousDefineCall) { + var t = this._currentAnnonymousDefineCall; + (this._currentAnnonymousDefineCall = null), + this.defineModule(this._moduleIdProvider.getStrModuleId(e), t.dependencies, t.callback, null, t.stack); + } + }), + (s.prototype._createLoadError = function (e, t) { + var n = this; + return { + errorCode: 'load', + moduleId: this._moduleIdProvider.getStrModuleId(e), + neededBy: (this._inverseDependencies2[e] || []).map(function (e) { + return n._moduleIdProvider.getStrModuleId(e); + }), + detail: t + }; + }), + (s.prototype._onLoadError = function (e, t) { + for (var n = this._createLoadError(e, t), r = [], i = 0, o = this._moduleIdProvider.getMaxModuleId(); i < o; i++) + r[i] = !1; + var s = !1, + u = []; + for (u.push(e), r[e] = !0; u.length > 0; ) { + var a = u.shift(), + l = this._modules2[a]; + l && (s = l.onDependencyError(n) || s); + var c = this._inverseDependencies2[a]; + if (c) + for (var i = 0, o = c.length; i < o; i++) { + var f = c[i]; + r[f] || (u.push(f), (r[f] = !0)); + } + } + s || this._config.onError(n); + }), + (s.prototype._hasDependencyPath = function (e, t) { + var n = this._modules2[e]; + if (!n) return !1; + for (var r = [], i = 0, o = this._moduleIdProvider.getMaxModuleId(); i < o; i++) r[i] = !1; + var s = []; + for (s.push(n), r[e] = !0; s.length > 0; ) { + var u = s.shift().dependencies; + if (u) + for (var i = 0, o = u.length; i < o; i++) { + var a = u[i]; + if (a.id === t) return !0; + var l = this._modules2[a.id]; + l && !r[a.id] && ((r[a.id] = !0), s.push(l)); + } + } + return !1; + }), + (s.prototype._findCyclePath = function (e, t, n) { + if (e === t || 50 === n) return [e]; + var r = this._modules2[e]; + if (!r) return null; + for (var i = r.dependencies, o = 0, s = i.length; o < s; o++) { + var u = this._findCyclePath(i[o].id, t, n + 1); + if (null !== u) return u.push(e), u; + } + return null; + }), + (s.prototype._createRequire = function (t) { + var n = this, + r = function (e, r, i) { + return n._relativeRequire(t, e, r, i); + }; + return ( + (r.toUrl = function (e) { + return n._config.requireToUrl(t.resolveModule(e)); + }), + (r.getStats = function () { + return n.getLoaderEvents(); + }), + (r.__$__nodeRequire = e.global.nodeRequire), + r + ); + }), + (s.prototype._loadModule = function (e) { + var t = this; + if (!this._modules2[e] && !this._knownModules2[e]) { + this._knownModules2[e] = !0; + var n = this._moduleIdProvider.getStrModuleId(e), + r = this._config.moduleIdToPaths(n); + this._env.isNode && (-1 === n.indexOf('/') || /^@[^\/]+\/[^\/]+$/.test(n)) && r.push('node|' + n); + var i = -1, + o = function (n) { + if (++i >= r.length) t._onLoadError(e, n); + else { + var s = r[i], + u = t.getRecorder(); + if (t._config.isBuild() && 'empty:' === s) + return ( + (t._buildInfoPath[e] = s), + t.defineModule(t._moduleIdProvider.getStrModuleId(e), [], null, null, null), + void t._onLoad(e) + ); + u.record(10, s), + t._scriptLoader.load( + t, + s, + function () { + t._config.isBuild() && (t._buildInfoPath[e] = s), u.record(11, s), t._onLoad(e); + }, + function (e) { + u.record(12, s), o(e); + } + ); + } + }; + o(null); + } + }), + (s.prototype._loadPluginDependency = function (e, n) { + var r = this; + if (!this._modules2[n.id] && !this._knownModules2[n.id]) { + this._knownModules2[n.id] = !0; + var i = function (e) { + r.defineModule(r._moduleIdProvider.getStrModuleId(n.id), [], e, null, null); + }; + (i.error = function (e) { + r._config.onError(r._createLoadError(n.id, e)); + }), + e.load(n.pluginParam, this._createRequire(t.ROOT), i, this._config.getOptionsLiteral()); + } + }), + (s.prototype._resolve = function (e) { + for (var t = this, n = e.dependencies, r = 0, s = n.length; r < s; r++) { + var u = n[r]; + if (u !== i.EXPORTS) + if (u !== i.MODULE) + if (u !== i.REQUIRE) { + var a = this._modules2[u.id]; + if (a && a.isComplete()) e.unresolvedDependenciesCount--; + else if (this._hasDependencyPath(u.id, e.id)) { + console.warn( + "There is a dependency cycle between '" + + this._moduleIdProvider.getStrModuleId(u.id) + + "' and '" + + this._moduleIdProvider.getStrModuleId(e.id) + + "'. The cyclic path follows:" + ); + var l = this._findCyclePath(u.id, e.id, 0); + l.reverse(), + l.push(u.id), + console.warn( + l + .map(function (e) { + return t._moduleIdProvider.getStrModuleId(e); + }) + .join(' => \n') + ), + e.unresolvedDependenciesCount--; + } else if ( + ((this._inverseDependencies2[u.id] = this._inverseDependencies2[u.id] || []), + this._inverseDependencies2[u.id].push(e.id), + u instanceof o) + ) { + var c = this._modules2[u.pluginId]; + if (c && c.isComplete()) { + this._loadPluginDependency(c.exports, u); + continue; + } + var f = this._inversePluginDependencies2.get(u.pluginId); + f || ((f = []), this._inversePluginDependencies2.set(u.pluginId, f)), + f.push(u), + this._loadModule(u.pluginId); + } else this._loadModule(u.id); + } else e.unresolvedDependenciesCount--; + else e.unresolvedDependenciesCount--; + else (e.exportsPassedIn = !0), e.unresolvedDependenciesCount--; + } + 0 === e.unresolvedDependenciesCount && this._onModuleComplete(e); + }), + (s.prototype._onModuleComplete = function (e) { + var t = this, + n = this.getRecorder(); + if (!e.isComplete()) { + for (var r = e.dependencies, o = [], s = 0, u = r.length; s < u; s++) { + var a = r[s]; + if (a !== i.EXPORTS) + if (a !== i.MODULE) + if (a !== i.REQUIRE) { + var l = this._modules2[a.id]; + o[s] = l ? l.exports : null; + } else o[s] = this._createRequire(e.moduleIdResolver); + else + o[s] = { + id: e.strId, + config: function () { + return t._config.getConfigForModule(e.strId); + } + }; + else o[s] = e.exports; + } + e.complete(n, this._config, o); + var c = this._inverseDependencies2[e.id]; + if (((this._inverseDependencies2[e.id] = null), c)) + for (var s = 0, u = c.length; s < u; s++) { + var f = c[s], + d = this._modules2[f]; + d.unresolvedDependenciesCount--, 0 === d.unresolvedDependenciesCount && this._onModuleComplete(d); + } + var h = this._inversePluginDependencies2.get(e.id); + if (h) { + this._inversePluginDependencies2.delete(e.id); + for (var s = 0, u = h.length; s < u; s++) this._loadPluginDependency(e.exports, h[s]); + } + } + }), + s + ); + })(); + e.ModuleManager = s; + })(o || (o = {})); + var i, o; + !(function (e) { + function t() { + if (void 0 !== e.global.require || 'undefined' != typeof require) { + var t = e.global.require || require; + if ('function' == typeof t && 'function' == typeof t.resolve) { + var i = function (e) { + r.getRecorder().record(33, e); + try { + return t(e); + } finally { + r.getRecorder().record(34, e); + } + }; + (e.global.nodeRequire = i), (u.nodeRequire = i), (u.__$__nodeRequire = i); + } + } + n.isNode && !n.isElectronRenderer + ? ((module.exports = u), (require = u)) + : (n.isElectronRenderer || (e.global.define = o), (e.global.require = u)); + } + var n = new e.Environment(), + r = null, + o = function (e, t, n) { + 'string' != typeof e && ((n = t), (t = e), (e = null)), + ('object' == typeof t && Array.isArray(t)) || ((n = t), (t = null)), + t || (t = ['require', 'exports', 'module']), + e ? r.defineModule(e, t, n, null, null) : r.enqueueDefineAnonymousModule(t, n); + }; + o.amd = { jQuery: !0 }; + var s = function (e, t) { + void 0 === t && (t = !1), r.configure(e, t); + }, + u = function () { + if (1 === arguments.length) { + if (arguments[0] instanceof Object && !Array.isArray(arguments[0])) return void s(arguments[0]); + if ('string' == typeof arguments[0]) return r.synchronousRequire(arguments[0]); + } + if ((2 !== arguments.length && 3 !== arguments.length) || !Array.isArray(arguments[0])) + throw new Error('Unrecognized require call'); + r.defineModule(e.Utilities.generateAnonymousModule(), arguments[0], arguments[1], arguments[2], null); + }; + (u.config = s), + (u.getConfig = function () { + return r.getConfig().getOptionsLiteral(); + }), + (u.reset = function () { + r = r.reset(); + }), + (u.getBuildInfo = function () { + return r.getBuildInfo(); + }), + (u.getStats = function () { + return r.getLoaderEvents(); + }), + (u.define = function () { + return o.apply(null, arguments); + }), + (e.init = t), + ('function' == typeof e.global.define && e.global.define.amd) || + ((r = new e.ModuleManager(n, e.createScriptLoader(n), o, u, e.Utilities.getHighPerformanceTimestamp())), + void 0 !== e.global.require && 'function' != typeof e.global.require && u.config(e.global.require), + ((i = function () { + return o.apply(null, arguments); + }).amd = o.amd), + 'undefined' == typeof doNotInitLoader && t()); + })(o || (o = {})), + i(e[24], t([0, 1]), function (e, t) { + 'use strict'; + function n(e, t) { + return r(e, t, 0, e.length - 1, []), e; + } + function r(e, t, n, i, o) { + if (!(i <= n)) { + var s = (n + (i - n) / 2) | 0; + r(e, t, n, s, o), + r(e, t, s + 1, i, o), + t(e[s], e[s + 1]) <= 0 || + (function (e, t, n, r, i, o) { + for (var s = n, u = r + 1, a = n; a <= i; a++) o[a] = e[a]; + for (a = n; a <= i; a++) + s > r + ? (e[a] = o[u++]) + : u > i + ? (e[a] = o[s++]) + : t(o[u], o[s]) < 0 + ? (e[a] = o[u++]) + : (e[a] = o[s++]); + })(e, t, n, s, i, o); + } + } + function i(e, t) { + for (var n = 0; n < e.length; n++) { + if (t(e[n])) return n; + } + return -1; + } + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.tail = function (e, t) { + return void 0 === t && (t = 0), e[e.length - (1 + t)]; + }), + (t.tail2 = function (e) { + if (0 === e.length) throw new Error('Invalid tail call'); + return [e.slice(0, e.length - 1), e[e.length - 1]]; + }), + (t.equals = function (e, t, n) { + if ( + (void 0 === n && + (n = function (e, t) { + return e === t; + }), + e === t) + ) + return !0; + if (!e || !t) return !1; + if (e.length !== t.length) return !1; + for (var r = 0, i = e.length; r < i; r++) if (!n(e[r], t[r])) return !1; + return !0; + }), + (t.binarySearch = function (e, t, n) { + for (var r = 0, i = e.length - 1; r <= i; ) { + var o = ((r + i) / 2) | 0, + s = n(e[o], t); + if (s < 0) r = o + 1; + else { + if (!(s > 0)) return o; + i = o - 1; + } + } + return -(r + 1); + }), + (t.findFirstInSorted = function (e, t) { + var n = 0, + r = e.length; + if (0 === r) return 0; + for (; n < r; ) { + var i = Math.floor((n + r) / 2); + t(e[i]) ? (r = i) : (n = i + 1); + } + return n; + }), + (t.mergeSort = n), + (t.groupBy = function (e, t) { + for (var r = [], i = void 0, o = 0, s = n(e.slice(0), t); o < s.length; o++) { + var u = s[o]; + i && 0 === t(i[0], u) ? i.push(u) : ((i = [u]), r.push(i)); + } + return r; + }), + (t.coalesce = function (e) { + return e + ? e.filter(function (e) { + return !!e; + }) + : e; + }), + (t.isFalsyOrEmpty = function (e) { + return !Array.isArray(e) || 0 === e.length; + }), + (t.distinct = function (e, t) { + if (!t) + return e.filter(function (t, n) { + return e.indexOf(t) === n; + }); + var n = Object.create(null); + return e.filter(function (e) { + var r = t(e); + return !n[r] && ((n[r] = !0), !0); + }); + }), + (t.firstIndex = i), + (t.first = function (e, t, n) { + void 0 === n && (n = null); + var r = i(e, t); + return r < 0 ? n : e[r]; + }), + (t.flatten = function (e) { + var t; + return (t = []).concat.apply(t, e); + }), + (t.range = function (e, t) { + var n = 'number' == typeof t ? e : 0; + 'number' == typeof t ? (n = e) : ((n = 0), (t = e)); + var r = []; + if (n <= t) for (i = n; i < t; i++) r.push(i); + else for (var i = n; i > t; i--) r.push(i); + return r; + }), + (t.arrayInsert = function (e, t, n) { + var r = e.slice(0, t), + i = e.slice(t); + return r.concat(n, i); + }); + }), + i(e[20], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var n = (function () { + function e(e, t, n, r) { + (this.originalStart = e), (this.originalLength = t), (this.modifiedStart = n), (this.modifiedLength = r); + } + return ( + (e.prototype.getOriginalEnd = function () { + return this.originalStart + this.originalLength; + }), + (e.prototype.getModifiedEnd = function () { + return this.modifiedStart + this.modifiedLength; + }), + e + ); + })(); + t.DiffChange = n; + }), + i(e[13], t([0, 1, 20]), function (e, t, n) { + 'use strict'; + function r(e) { + return { + getLength: function () { + return e.length; + }, + getElementAtIndex: function (t) { + return e.charCodeAt(t); + } + }; + } + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.stringDiff = function (e, t, n) { + return new u(r(e), r(t)).ComputeDiff(n); + }); + var i = (function () { + function e() {} + return ( + (e.Assert = function (e, t) { + if (!e) throw new Error(t); + }), + e + ); + })(); + t.Debug = i; + var o = (function () { + function e() {} + return ( + (e.Copy = function (e, t, n, r, i) { + for (var o = 0; o < i; o++) n[r + o] = e[t + o]; + }), + e + ); + })(); + t.MyArray = o; + var s = (function () { + function e() { + (this.m_changes = []), + (this.m_originalStart = Number.MAX_VALUE), + (this.m_modifiedStart = Number.MAX_VALUE), + (this.m_originalCount = 0), + (this.m_modifiedCount = 0); + } + return ( + (e.prototype.MarkNextChange = function () { + (this.m_originalCount > 0 || this.m_modifiedCount > 0) && + this.m_changes.push( + new n.DiffChange(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount) + ), + (this.m_originalCount = 0), + (this.m_modifiedCount = 0), + (this.m_originalStart = Number.MAX_VALUE), + (this.m_modifiedStart = Number.MAX_VALUE); + }), + (e.prototype.AddOriginalElement = function (e, t) { + (this.m_originalStart = Math.min(this.m_originalStart, e)), + (this.m_modifiedStart = Math.min(this.m_modifiedStart, t)), + this.m_originalCount++; + }), + (e.prototype.AddModifiedElement = function (e, t) { + (this.m_originalStart = Math.min(this.m_originalStart, e)), + (this.m_modifiedStart = Math.min(this.m_modifiedStart, t)), + this.m_modifiedCount++; + }), + (e.prototype.getChanges = function () { + return (this.m_originalCount > 0 || this.m_modifiedCount > 0) && this.MarkNextChange(), this.m_changes; + }), + (e.prototype.getReverseChanges = function () { + return ( + (this.m_originalCount > 0 || this.m_modifiedCount > 0) && this.MarkNextChange(), + this.m_changes.reverse(), + this.m_changes + ); + }), + e + ); + })(), + u = (function () { + function e(e, t, n) { + void 0 === n && (n = null), + (this.OriginalSequence = e), + (this.ModifiedSequence = t), + (this.ContinueProcessingPredicate = n), + (this.m_forwardHistory = []), + (this.m_reverseHistory = []); + } + return ( + (e.prototype.ElementsAreEqual = function (e, t) { + return this.OriginalSequence.getElementAtIndex(e) === this.ModifiedSequence.getElementAtIndex(t); + }), + (e.prototype.OriginalElementsAreEqual = function (e, t) { + return this.OriginalSequence.getElementAtIndex(e) === this.OriginalSequence.getElementAtIndex(t); + }), + (e.prototype.ModifiedElementsAreEqual = function (e, t) { + return this.ModifiedSequence.getElementAtIndex(e) === this.ModifiedSequence.getElementAtIndex(t); + }), + (e.prototype.ComputeDiff = function (e) { + return this._ComputeDiff(0, this.OriginalSequence.getLength() - 1, 0, this.ModifiedSequence.getLength() - 1, e); + }), + (e.prototype._ComputeDiff = function (e, t, n, r, i) { + var o = this.ComputeDiffRecursive(e, t, n, r, [!1]); + return i ? this.PrettifyChanges(o) : o; + }), + (e.prototype.ComputeDiffRecursive = function (e, t, r, o, s) { + for (s[0] = !1; e <= t && r <= o && this.ElementsAreEqual(e, r); ) e++, r++; + for (; t >= e && o >= r && this.ElementsAreEqual(t, o); ) t--, o--; + if (e > t || r > o) { + var u = void 0; + return ( + r <= o + ? (i.Assert(e === t + 1, 'originalStart should only be one more than originalEnd'), + (u = [new n.DiffChange(e, 0, r, o - r + 1)])) + : e <= t + ? (i.Assert(r === o + 1, 'modifiedStart should only be one more than modifiedEnd'), + (u = [new n.DiffChange(e, t - e + 1, r, 0)])) + : (i.Assert(e === t + 1, 'originalStart should only be one more than originalEnd'), + i.Assert(r === o + 1, 'modifiedStart should only be one more than modifiedEnd'), + (u = [])), + u + ); + } + var a = [0], + l = [0], + c = this.ComputeRecursionPoint(e, t, r, o, a, l, s), + f = a[0], + d = l[0]; + if (null !== c) return c; + if (!s[0]) { + var h = this.ComputeDiffRecursive(e, f, r, d, s), + p = []; + return ( + (p = s[0] + ? [new n.DiffChange(f + 1, t - (f + 1) + 1, d + 1, o - (d + 1) + 1)] + : this.ComputeDiffRecursive(f + 1, t, d + 1, o, s)), + this.ConcatenateChanges(h, p) + ); + } + return [new n.DiffChange(e, t - e + 1, r, o - r + 1)]; + }), + (e.prototype.WALKTRACE = function (e, t, r, i, o, u, a, l, c, f, d, h, p, m, g, _, v, y) { + var b, + C = null, + E = null, + S = new s(), + L = t, + N = r, + P = p[0] - _[0] - i, + A = Number.MIN_VALUE, + M = this.m_forwardHistory.length - 1; + do { + (b = P + e) === L || (b < N && c[b - 1] < c[b + 1]) + ? ((m = (d = c[b + 1]) - P - i), + d < A && S.MarkNextChange(), + (A = d), + S.AddModifiedElement(d + 1, m), + (P = b + 1 - e)) + : ((m = (d = c[b - 1] + 1) - P - i), + d < A && S.MarkNextChange(), + (A = d - 1), + S.AddOriginalElement(d, m + 1), + (P = b - 1 - e)), + M >= 0 && ((e = (c = this.m_forwardHistory[M])[0]), (L = 1), (N = c.length - 1)); + } while (--M >= -1); + if (((C = S.getReverseChanges()), y[0])) { + var I = p[0] + 1, + w = _[0] + 1; + if (null !== C && C.length > 0) { + var D = C[C.length - 1]; + (I = Math.max(I, D.getOriginalEnd())), (w = Math.max(w, D.getModifiedEnd())); + } + E = [new n.DiffChange(I, h - I + 1, w, g - w + 1)]; + } else { + (S = new s()), + (L = u), + (N = a), + (P = p[0] - _[0] - l), + (A = Number.MAX_VALUE), + (M = v ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2); + do { + (b = P + o) === L || (b < N && f[b - 1] >= f[b + 1]) + ? ((m = (d = f[b + 1] - 1) - P - l), + d > A && S.MarkNextChange(), + (A = d + 1), + S.AddOriginalElement(d + 1, m + 1), + (P = b + 1 - o)) + : ((m = (d = f[b - 1]) - P - l), + d > A && S.MarkNextChange(), + (A = d), + S.AddModifiedElement(d + 1, m + 1), + (P = b - 1 - o)), + M >= 0 && ((o = (f = this.m_reverseHistory[M])[0]), (L = 1), (N = f.length - 1)); + } while (--M >= -1); + E = S.getChanges(); + } + return this.ConcatenateChanges(C, E); + }), + (e.prototype.ComputeRecursionPoint = function (e, t, r, i, s, u, a) { + var l, + c = 0, + f = 0, + d = 0, + h = 0, + p = 0, + m = 0; + e--, r--, (s[0] = 0), (u[0] = 0), (this.m_forwardHistory = []), (this.m_reverseHistory = []); + var g = t - e + (i - r), + _ = g + 1, + v = new Array(_), + y = new Array(_), + b = i - r, + C = t - e, + E = e - r, + S = t - i, + L = (C - b) % 2 == 0; + (v[b] = e), (y[C] = t), (a[0] = !1); + var N, P; + for (l = 1; l <= g / 2 + 1; l++) { + var A = 0, + M = 0; + for ( + d = this.ClipDiagonalBound(b - l, l, b, _), h = this.ClipDiagonalBound(b + l, l, b, _), N = d; + N <= h; + N += 2 + ) { + for ( + f = (c = N === d || (N < h && v[N - 1] < v[N + 1]) ? v[N + 1] : v[N - 1] + 1) - (N - b) - E, P = c; + c < t && f < i && this.ElementsAreEqual(c + 1, f + 1); + + ) + c++, f++; + if (((v[N] = c), c + f > A + M && ((A = c), (M = f)), !L && Math.abs(N - C) <= l - 1 && c >= y[N])) + return ( + (s[0] = c), + (u[0] = f), + P <= y[N] && l <= 1448 + ? this.WALKTRACE(b, d, h, E, C, p, m, S, v, y, c, t, s, f, i, u, L, a) + : null + ); + } + var I = (A - e + (M - r) - l) / 2; + if ( + null !== this.ContinueProcessingPredicate && + !this.ContinueProcessingPredicate(A, this.OriginalSequence, I) + ) + return ( + (a[0] = !0), + (s[0] = A), + (u[0] = M), + I > 0 && l <= 1448 + ? this.WALKTRACE(b, d, h, E, C, p, m, S, v, y, c, t, s, f, i, u, L, a) + : (e++, r++, [new n.DiffChange(e, t - e + 1, r, i - r + 1)]) + ); + for ( + p = this.ClipDiagonalBound(C - l, l, C, _), m = this.ClipDiagonalBound(C + l, l, C, _), N = p; + N <= m; + N += 2 + ) { + for ( + f = (c = N === p || (N < m && y[N - 1] >= y[N + 1]) ? y[N + 1] - 1 : y[N - 1]) - (N - C) - S, P = c; + c > e && f > r && this.ElementsAreEqual(c, f); + + ) + c--, f--; + if (((y[N] = c), L && Math.abs(N - b) <= l && c <= v[N])) + return ( + (s[0] = c), + (u[0] = f), + P >= v[N] && l <= 1448 + ? this.WALKTRACE(b, d, h, E, C, p, m, S, v, y, c, t, s, f, i, u, L, a) + : null + ); + } + if (l <= 1447) { + var w = new Array(h - d + 2); + (w[0] = b - d + 1), + o.Copy(v, d, w, 1, h - d + 1), + this.m_forwardHistory.push(w), + ((w = new Array(m - p + 2))[0] = C - p + 1), + o.Copy(y, p, w, 1, m - p + 1), + this.m_reverseHistory.push(w); + } + } + return this.WALKTRACE(b, d, h, E, C, p, m, S, v, y, c, t, s, f, i, u, L, a); + }), + (e.prototype.PrettifyChanges = function (e) { + for (u = 0; u < e.length; u++) { + for ( + var t = e[u], + n = u < e.length - 1 ? e[u + 1].originalStart : this.OriginalSequence.getLength(), + r = u < e.length - 1 ? e[u + 1].modifiedStart : this.ModifiedSequence.getLength(), + i = t.originalLength > 0, + o = t.modifiedLength > 0; + t.originalStart + t.originalLength < n && + t.modifiedStart + t.modifiedLength < r && + (!i || this.OriginalElementsAreEqual(t.originalStart, t.originalStart + t.originalLength)) && + (!o || this.ModifiedElementsAreEqual(t.modifiedStart, t.modifiedStart + t.modifiedLength)); + + ) + t.originalStart++, t.modifiedStart++; + var s = [null]; + u < e.length - 1 && this.ChangesOverlap(e[u], e[u + 1], s) && ((e[u] = s[0]), e.splice(u + 1, 1), u--); + } + for (var u = e.length - 1; u >= 0; u--) { + var t = e[u], + n = 0, + r = 0; + if (u > 0) { + var a = e[u - 1]; + a.originalLength > 0 && (n = a.originalStart + a.originalLength), + a.modifiedLength > 0 && (r = a.modifiedStart + a.modifiedLength); + } + for ( + var i = t.originalLength > 0, + o = t.modifiedLength > 0, + l = 0, + c = this._boundaryScore(t.originalStart, t.originalLength, t.modifiedStart, t.modifiedLength), + f = 1; + ; + f++ + ) { + var d = t.originalStart - f, + h = t.modifiedStart - f; + if (d < n || h < r) break; + if (i && !this.OriginalElementsAreEqual(d, d + t.originalLength)) break; + if (o && !this.ModifiedElementsAreEqual(h, h + t.modifiedLength)) break; + var p = this._boundaryScore(d, t.originalLength, h, t.modifiedLength); + p > c && ((c = p), (l = f)); + } + (t.originalStart -= l), (t.modifiedStart -= l); + } + return e; + }), + (e.prototype._OriginalIsBoundary = function (e) { + if (e <= 0 || e >= this.OriginalSequence.getLength() - 1) return !0; + var t = this.OriginalSequence.getElementAtIndex(e); + return 'string' == typeof t && /^\s*$/.test(t); + }), + (e.prototype._OriginalRegionIsBoundary = function (e, t) { + if (this._OriginalIsBoundary(e) || this._OriginalIsBoundary(e - 1)) return !0; + if (t > 0) { + var n = e + t; + if (this._OriginalIsBoundary(n - 1) || this._OriginalIsBoundary(n)) return !0; + } + return !1; + }), + (e.prototype._ModifiedIsBoundary = function (e) { + if (e <= 0 || e >= this.ModifiedSequence.getLength() - 1) return !0; + var t = this.ModifiedSequence.getElementAtIndex(e); + return 'string' == typeof t && /^\s*$/.test(t); + }), + (e.prototype._ModifiedRegionIsBoundary = function (e, t) { + if (this._ModifiedIsBoundary(e) || this._ModifiedIsBoundary(e - 1)) return !0; + if (t > 0) { + var n = e + t; + if (this._ModifiedIsBoundary(n - 1) || this._ModifiedIsBoundary(n)) return !0; + } + return !1; + }), + (e.prototype._boundaryScore = function (e, t, n, r) { + return (this._OriginalRegionIsBoundary(e, t) ? 1 : 0) + (this._ModifiedRegionIsBoundary(n, r) ? 1 : 0); + }), + (e.prototype.ConcatenateChanges = function (e, t) { + var n = []; + if (0 === e.length || 0 === t.length) return t.length > 0 ? t : e; + if (this.ChangesOverlap(e[e.length - 1], t[0], n)) { + r = new Array(e.length + t.length - 1); + return ( + o.Copy(e, 0, r, 0, e.length - 1), (r[e.length - 1] = n[0]), o.Copy(t, 1, r, e.length, t.length - 1), r + ); + } + var r = new Array(e.length + t.length); + return o.Copy(e, 0, r, 0, e.length), o.Copy(t, 0, r, e.length, t.length), r; + }), + (e.prototype.ChangesOverlap = function (e, t, r) { + if ( + (i.Assert(e.originalStart <= t.originalStart, 'Left change is not less than or equal to right change'), + i.Assert(e.modifiedStart <= t.modifiedStart, 'Left change is not less than or equal to right change'), + e.originalStart + e.originalLength >= t.originalStart || + e.modifiedStart + e.modifiedLength >= t.modifiedStart) + ) { + var o = e.originalStart, + s = e.originalLength, + u = e.modifiedStart, + a = e.modifiedLength; + return ( + e.originalStart + e.originalLength >= t.originalStart && + (s = t.originalStart + t.originalLength - e.originalStart), + e.modifiedStart + e.modifiedLength >= t.modifiedStart && + (a = t.modifiedStart + t.modifiedLength - e.modifiedStart), + (r[0] = new n.DiffChange(o, s, u, a)), + !0 + ); + } + return (r[0] = null), !1; + }), + (e.prototype.ClipDiagonalBound = function (e, t, n, r) { + if (e >= 0 && e < r) return e; + var i = r - n - 1, + o = t % 2 == 0; + if (e < 0) { + return o === (n % 2 == 0) ? 0 : 1; + } + return o === (i % 2 == 0) ? r - 1 : r - 2; + }), + e + ); + })(); + t.LcsDiff = u; + }), + i(e[16], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.once = function (e) { + var t, + n = this, + r = !1; + return function () { + return r ? t : ((r = !0), (t = e.apply(n, arguments))); + }; + }); + }); + var s = + (this && this.__extends) || + (function () { + var e = function (t, n) { + return (e = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (e, t) { + e.__proto__ = t; + }) || + function (e, t) { + for (var n in t) t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), (t.prototype = null === n ? Object.create(n) : ((r.prototype = n.prototype), new r())); + }; + })(); + i(e[12], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), (t.FIN = { done: !0, value: void 0 }); + !(function (e) { + function n(e, t) { + for (var n = e.next(); !n.done; n = e.next()) t(n.value); + } + var r = { + next: function () { + return t.FIN; + } + }; + (e.empty = function () { + return r; + }), + (e.fromArray = function (e, n, r) { + return ( + void 0 === n && (n = 0), + void 0 === r && (r = e.length), + { + next: function () { + return n >= r ? t.FIN : { done: !1, value: e[n++] }; + } + } + ); + }), + (e.from = function (t) { + return t ? (Array.isArray(t) ? e.fromArray(t) : t) : e.empty(); + }), + (e.map = function (e, n) { + return { + next: function () { + var r = e.next(); + return r.done ? t.FIN : { done: !1, value: n(r.value) }; + } + }; + }), + (e.filter = function (e, n) { + return { + next: function () { + for (;;) { + var r = e.next(); + if (r.done) return t.FIN; + if (n(r.value)) return { done: !1, value: r.value }; + } + } + }; + }), + (e.forEach = n), + (e.collect = function (e) { + var t = []; + return ( + n(e, function (e) { + return t.push(e); + }), + t + ); + }); + })(t.Iterator || (t.Iterator = {})); + var n = (function () { + function e(e, t, n, r) { + void 0 === t && (t = 0), + void 0 === n && (n = e.length), + void 0 === r && (r = t - 1), + (this.items = e), + (this.start = t), + (this.end = n), + (this.index = r); + } + return ( + (e.prototype.next = function () { + return (this.index = Math.min(this.index + 1, this.end)), this.current(); + }), + (e.prototype.current = function () { + return this.index === this.start - 1 || this.index === this.end ? null : this.items[this.index]; + }), + e + ); + })(); + t.ArrayIterator = n; + var r = (function (e) { + function t(t, n, r, i) { + return ( + void 0 === n && (n = 0), void 0 === r && (r = t.length), void 0 === i && (i = n - 1), e.call(this, t, n, r, i) || this + ); + } + return ( + s(t, e), + (t.prototype.current = function () { + return e.prototype.current.call(this); + }), + (t.prototype.previous = function () { + return (this.index = Math.max(this.index - 1, this.start - 1)), this.current(); + }), + (t.prototype.first = function () { + return (this.index = this.start), this.current(); + }), + (t.prototype.last = function () { + return (this.index = this.end - 1), this.current(); + }), + (t.prototype.parent = function () { + return null; + }), + t + ); + })(n); + t.ArrayNavigator = r; + var i = (function () { + function e(e, t) { + (this.iterator = e), (this.fn = t); + } + return ( + (e.prototype.next = function () { + return this.fn(this.iterator.next()); + }), + e + ); + })(); + t.MappedIterator = i; + }), + i(e[21], t([0, 1]), function (e, t) { + 'use strict'; + function n(e, t) { + var n = !!(2048 & e), + r = !!(256 & e); + return new u(2 === t ? r : n, !!(1024 & e), !!(512 & e), 2 === t ? n : r, 255 & e); + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + function e() { + (this._keyCodeToStr = []), (this._strToKeyCode = Object.create(null)); + } + return ( + (e.prototype.define = function (e, t) { + (this._keyCodeToStr[e] = t), (this._strToKeyCode[t.toLowerCase()] = e); + }), + (e.prototype.keyCodeToStr = function (e) { + return this._keyCodeToStr[e]; + }), + (e.prototype.strToKeyCode = function (e) { + return this._strToKeyCode[e.toLowerCase()] || 0; + }), + e + ); + })(), + i = new r(), + o = new r(), + s = new r(); + !(function () { + function e(e, t, n, r) { + void 0 === n && (n = t), void 0 === r && (r = n), i.define(e, t), o.define(e, n), s.define(e, r); + } + e(0, 'unknown'), + e(1, 'Backspace'), + e(2, 'Tab'), + e(3, 'Enter'), + e(4, 'Shift'), + e(5, 'Ctrl'), + e(6, 'Alt'), + e(7, 'PauseBreak'), + e(8, 'CapsLock'), + e(9, 'Escape'), + e(10, 'Space'), + e(11, 'PageUp'), + e(12, 'PageDown'), + e(13, 'End'), + e(14, 'Home'), + e(15, 'LeftArrow', 'Left'), + e(16, 'UpArrow', 'Up'), + e(17, 'RightArrow', 'Right'), + e(18, 'DownArrow', 'Down'), + e(19, 'Insert'), + e(20, 'Delete'), + e(21, '0'), + e(22, '1'), + e(23, '2'), + e(24, '3'), + e(25, '4'), + e(26, '5'), + e(27, '6'), + e(28, '7'), + e(29, '8'), + e(30, '9'), + e(31, 'A'), + e(32, 'B'), + e(33, 'C'), + e(34, 'D'), + e(35, 'E'), + e(36, 'F'), + e(37, 'G'), + e(38, 'H'), + e(39, 'I'), + e(40, 'J'), + e(41, 'K'), + e(42, 'L'), + e(43, 'M'), + e(44, 'N'), + e(45, 'O'), + e(46, 'P'), + e(47, 'Q'), + e(48, 'R'), + e(49, 'S'), + e(50, 'T'), + e(51, 'U'), + e(52, 'V'), + e(53, 'W'), + e(54, 'X'), + e(55, 'Y'), + e(56, 'Z'), + e(57, 'Meta'), + e(58, 'ContextMenu'), + e(59, 'F1'), + e(60, 'F2'), + e(61, 'F3'), + e(62, 'F4'), + e(63, 'F5'), + e(64, 'F6'), + e(65, 'F7'), + e(66, 'F8'), + e(67, 'F9'), + e(68, 'F10'), + e(69, 'F11'), + e(70, 'F12'), + e(71, 'F13'), + e(72, 'F14'), + e(73, 'F15'), + e(74, 'F16'), + e(75, 'F17'), + e(76, 'F18'), + e(77, 'F19'), + e(78, 'NumLock'), + e(79, 'ScrollLock'), + e(80, ';', ';', 'OEM_1'), + e(81, '=', '=', 'OEM_PLUS'), + e(82, ',', ',', 'OEM_COMMA'), + e(83, '-', '-', 'OEM_MINUS'), + e(84, '.', '.', 'OEM_PERIOD'), + e(85, '/', '/', 'OEM_2'), + e(86, '`', '`', 'OEM_3'), + e(110, 'ABNT_C1'), + e(111, 'ABNT_C2'), + e(87, '[', '[', 'OEM_4'), + e(88, '\\', '\\', 'OEM_5'), + e(89, ']', ']', 'OEM_6'), + e(90, "'", "'", 'OEM_7'), + e(91, 'OEM_8'), + e(92, 'OEM_102'), + e(93, 'NumPad0'), + e(94, 'NumPad1'), + e(95, 'NumPad2'), + e(96, 'NumPad3'), + e(97, 'NumPad4'), + e(98, 'NumPad5'), + e(99, 'NumPad6'), + e(100, 'NumPad7'), + e(101, 'NumPad8'), + e(102, 'NumPad9'), + e(103, 'NumPad_Multiply'), + e(104, 'NumPad_Add'), + e(105, 'NumPad_Separator'), + e(106, 'NumPad_Subtract'), + e(107, 'NumPad_Decimal'), + e(108, 'NumPad_Divide'); + })(); + !(function (e) { + (e.toString = function (e) { + return i.keyCodeToStr(e); + }), + (e.fromString = function (e) { + return i.strToKeyCode(e); + }), + (e.toUserSettingsUS = function (e) { + return o.keyCodeToStr(e); + }), + (e.toUserSettingsGeneral = function (e) { + return s.keyCodeToStr(e); + }), + (e.fromUserSettings = function (e) { + return o.strToKeyCode(e) || s.strToKeyCode(e); + }); + })(t.KeyCodeUtils || (t.KeyCodeUtils = {})), + (t.KeyChord = function (e, t) { + return (e | (((65535 & t) << 16) >>> 0)) >>> 0; + }), + (t.createKeybinding = function (e, t) { + if (0 === e) return null; + var r = (65535 & e) >>> 0, + i = (4294901760 & e) >>> 16; + return 0 !== i ? new a(n(r, t), n(i, t)) : n(r, t); + }), + (t.createSimpleKeybinding = n); + var u = (function () { + function e(e, t, n, r, i) { + (this.type = 1), (this.ctrlKey = e), (this.shiftKey = t), (this.altKey = n), (this.metaKey = r), (this.keyCode = i); + } + return ( + (e.prototype.equals = function (e) { + return ( + 1 === e.type && + this.ctrlKey === e.ctrlKey && + this.shiftKey === e.shiftKey && + this.altKey === e.altKey && + this.metaKey === e.metaKey && + this.keyCode === e.keyCode + ); + }), + (e.prototype.isModifierKey = function () { + return 0 === this.keyCode || 5 === this.keyCode || 57 === this.keyCode || 6 === this.keyCode || 4 === this.keyCode; + }), + (e.prototype.isDuplicateModifierCase = function () { + return ( + (this.ctrlKey && 5 === this.keyCode) || + (this.shiftKey && 4 === this.keyCode) || + (this.altKey && 6 === this.keyCode) || + (this.metaKey && 57 === this.keyCode) + ); + }), + e + ); + })(); + t.SimpleKeybinding = u; + var a = (function () { + return function (e, t) { + (this.type = 2), (this.firstPart = e), (this.chordPart = t); + }; + })(); + t.ChordKeybinding = a; + var l = (function () { + return function (e, t, n, r, i, o) { + (this.ctrlKey = e), + (this.shiftKey = t), + (this.altKey = n), + (this.metaKey = r), + (this.keyLabel = i), + (this.keyAriaLabel = o); + }; + })(); + t.ResolvedKeybindingPart = l; + var c = (function () { + return function () {}; + })(); + t.ResolvedKeybinding = c; + }), + i(e[7], t([0, 1]), function (e, t) { + 'use strict'; + function n(e) { + for (var t = [], r = 1; r < arguments.length; r++) t[r - 1] = arguments[r]; + return Array.isArray(e) + ? (e.forEach(function (e) { + return e && e.dispose(); + }), + []) + : 0 !== t.length + ? (n(e), n(t), []) + : e + ? (e.dispose(), e) + : void 0; + } + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.isDisposable = function (e) { + return 'function' == typeof e.dispose && 0 === e.dispose.length; + }), + (t.dispose = n), + (t.combinedDisposable = function (e) { + return { + dispose: function () { + return n(e); + } + }; + }), + (t.toDisposable = function (e) { + return { + dispose: function () { + e(); + } + }; + }); + var r = (function () { + function e() { + this._toDispose = []; + } + return ( + (e.prototype.dispose = function () { + this._toDispose = n(this._toDispose); + }), + (e.prototype._register = function (e) { + return this._toDispose.push(e), e; + }), + (e.None = Object.freeze({ dispose: function () {} })), + e + ); + })(); + t.Disposable = r; + var i = (function () { + function e(e) { + this.object = e; + } + return (e.prototype.dispose = function () {}), e; + })(); + t.ImmortalReference = i; + }), + i(e[15], t([0, 1, 12]), function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + return function (e) { + this.element = e; + }; + })(), + i = (function () { + function e() {} + return ( + (e.prototype.isEmpty = function () { + return !this._first; + }), + (e.prototype.unshift = function (e) { + return this.insert(e, !1); + }), + (e.prototype.push = function (e) { + return this.insert(e, !0); + }), + (e.prototype.insert = function (e, t) { + var n = this, + i = new r(e); + if (this._first) + if (t) { + var o = this._last; + (this._last = i), (i.prev = o), (o.next = i); + } else { + var s = this._first; + (this._first = i), (i.next = s), (s.prev = i); + } + else (this._first = i), (this._last = i); + return function () { + for (var e = n._first; e instanceof r; ) { + if (e === i) { + if (e.prev && e.next) { + var t = e.prev; + (t.next = e.next), (e.next.prev = t); + } else + e.prev || e.next + ? e.next + ? e.prev || ((n._first = n._first.next), (n._first.prev = void 0)) + : ((n._last = n._last.prev), (n._last.next = void 0)) + : ((n._first = void 0), (n._last = void 0)); + break; + } + e = e.next; + } + }; + }), + (e.prototype.iterator = function () { + var e, + t = this._first; + return { + next: function () { + return t ? (e ? (e.value = t.element) : (e = { done: !1, value: t.element }), (t = t.next), e) : n.FIN; + } + }; + }), + e + ); + })(); + t.LinkedList = i; + }), + i(e[3], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var n = !1, + r = !1, + i = !1, + o = !1, + s = !1; + t.LANGUAGE_DEFAULT = 'en'; + var u = + 'undefined' != typeof process && + void 0 !== process.versions && + void 0 !== process.versions.electron && + 'renderer' === process.type; + if ('object' != typeof navigator || u) { + if ('object' == typeof process) { + (n = 'win32' === process.platform), + (r = 'darwin' === process.platform), + (i = 'linux' === process.platform), + t.LANGUAGE_DEFAULT, + t.LANGUAGE_DEFAULT; + var a = process.env.VSCODE_NLS_CONFIG; + if (a) + try { + var l = JSON.parse(a), + c = l.availableLanguages['*']; + l.locale, c || t.LANGUAGE_DEFAULT, l._translationsConfigFile; + } catch (e) {} + o = !0; + } + } else { + var f = navigator.userAgent; + (n = f.indexOf('Windows') >= 0), + (r = f.indexOf('Macintosh') >= 0), + (i = f.indexOf('Linux') >= 0), + (s = !0), + navigator.language; + } + (t.isWindows = n), (t.isMacintosh = r), (t.isLinux = i), (t.isNative = o), (t.isWeb = s); + var d = 'object' == typeof self ? self : 'object' == typeof global ? global : {}; + t.globals = d; + var h = null; + (t.setImmediate = function (e) { + return ( + null === h && + (h = t.globals.setImmediate + ? t.globals.setImmediate.bind(t.globals) + : 'undefined' != typeof process && 'function' == typeof process.nextTick + ? process.nextTick.bind(process) + : t.globals.setTimeout.bind(t.globals)), + h(e) + ); + }), + (t.OS = r ? 2 : n ? 1 : 3); + }), + i(e[17], t([0, 1]), function (e, t) { + 'use strict'; + function n(e) { + return e.replace(/[\-\\\{\}\*\+\?\|\^\$\.\[\]\(\)\#]/g, '\\$&'); + } + function r(e, t) { + if (!e || !t) return e; + var n = t.length; + if (0 === n || 0 === e.length) return e; + for (var r = 0; e.indexOf(t, r) === r; ) r += n; + return e.substring(r); + } + function i(e, t) { + if (!e || !t) return e; + var n = t.length, + r = e.length; + if (0 === n || 0 === r) return e; + for (var i = r, o = -1; ; ) { + if (-1 === (o = e.lastIndexOf(t, i - 1)) || o + n !== i) break; + if (0 === o) return ''; + i = o; + } + return e.substring(0, i); + } + function o(e) { + return e >= 97 && e <= 122; + } + function s(e) { + return e >= 65 && e <= 90; + } + function u(e) { + return o(e) || s(e); + } + function a(e, t, n) { + if ((void 0 === n && (n = e.length), 'string' != typeof e || 'string' != typeof t)) return !1; + for (var r = 0; r < n; r++) { + var i = e.charCodeAt(r), + o = t.charCodeAt(r); + if (i !== o) + if (u(i) && u(o)) { + var s = Math.abs(i - o); + if (0 !== s && 32 !== s) return !1; + } else if (String.fromCharCode(i).toLowerCase() !== String.fromCharCode(o).toLowerCase()) return !1; + } + return !0; + } + function l(e) { + return ((e = +e) >= 11904 && e <= 55215) || (e >= 63744 && e <= 64255) || (e >= 65281 && e <= 65374); + } + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.empty = ''), + (t.isFalsyOrWhitespace = function (e) { + return !e || 'string' != typeof e || 0 === e.trim().length; + }), + (t.pad = function (e, t, n) { + void 0 === n && (n = '0'); + for (var r = '' + e, i = [r], o = r.length; o < t; o++) i.push(n); + return i.reverse().join(''); + }); + var c = /{(\d+)}/g; + (t.format = function (e) { + for (var t = [], n = 1; n < arguments.length; n++) t[n - 1] = arguments[n]; + return 0 === t.length + ? e + : e.replace(c, function (e, n) { + var r = parseInt(n, 10); + return isNaN(r) || r < 0 || r >= t.length ? e : t[r]; + }); + }), + (t.escape = function (e) { + return e.replace(/[<|>|&]/g, function (e) { + switch (e) { + case '<': + return '<'; + case '>': + return '>'; + case '&': + return '&'; + default: + return e; + } + }); + }), + (t.escapeRegExpCharacters = n), + (t.trim = function (e, t) { + return void 0 === t && (t = ' '), i(r(e, t), t); + }), + (t.ltrim = r), + (t.rtrim = i), + (t.convertSimple2RegExpPattern = function (e) { + return e.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*'); + }), + (t.startsWith = function (e, t) { + if (e.length < t.length) return !1; + if (e === t) return !0; + for (var n = 0; n < t.length; n++) if (e[n] !== t[n]) return !1; + return !0; + }), + (t.endsWith = function (e, t) { + var n = e.length - t.length; + return n > 0 ? e.indexOf(t, n) === n : 0 === n && e === t; + }), + (t.createRegExp = function (e, t, r) { + if ((void 0 === r && (r = {}), !e)) throw new Error('Cannot create regex from empty string'); + t || (e = n(e)), + r.wholeWord && (/\B/.test(e.charAt(0)) || (e = '\\b' + e), /\B/.test(e.charAt(e.length - 1)) || (e += '\\b')); + var i = ''; + return r.global && (i += 'g'), r.matchCase || (i += 'i'), r.multiline && (i += 'm'), new RegExp(e, i); + }), + (t.regExpLeadsToEndlessLoop = function (e) { + return ( + '^' !== e.source && + '^$' !== e.source && + '$' !== e.source && + '^\\s*$' !== e.source && + !(!e.exec('') || 0 !== e.lastIndex) + ); + }), + (t.firstNonWhitespaceIndex = function (e) { + for (var t = 0, n = e.length; t < n; t++) { + var r = e.charCodeAt(t); + if (32 !== r && 9 !== r) return t; + } + return -1; + }), + (t.getLeadingWhitespace = function (e, t, n) { + void 0 === t && (t = 0), void 0 === n && (n = e.length); + for (var r = t; r < n; r++) { + var i = e.charCodeAt(r); + if (32 !== i && 9 !== i) return e.substring(t, r); + } + return e.substring(t, n); + }), + (t.lastNonWhitespaceIndex = function (e, t) { + void 0 === t && (t = e.length - 1); + for (var n = t; n >= 0; n--) { + var r = e.charCodeAt(n); + if (32 !== r && 9 !== r) return n; + } + return -1; + }), + (t.compare = function (e, t) { + return e < t ? -1 : e > t ? 1 : 0; + }), + (t.isLowerAsciiLetter = o), + (t.isUpperAsciiLetter = s), + (t.equalsIgnoreCase = function (e, t) { + return (e ? e.length : 0) === (t ? t.length : 0) && a(e, t); + }), + (t.startsWithIgnoreCase = function (e, t) { + var n = t.length; + return !(t.length > e.length) && a(e, t, n); + }), + (t.commonPrefixLength = function (e, t) { + var n, + r = Math.min(e.length, t.length); + for (n = 0; n < r; n++) if (e.charCodeAt(n) !== t.charCodeAt(n)) return n; + return r; + }), + (t.commonSuffixLength = function (e, t) { + var n, + r = Math.min(e.length, t.length), + i = e.length - 1, + o = t.length - 1; + for (n = 0; n < r; n++) if (e.charCodeAt(i - n) !== t.charCodeAt(o - n)) return n; + return r; + }), + (t.isHighSurrogate = function (e) { + return 55296 <= e && e <= 56319; + }), + (t.isLowSurrogate = function (e) { + return 56320 <= e && e <= 57343; + }); + var f = + /(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u08BD\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE33\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDCFF]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD50-\uDFFF]|\uD83B[\uDC00-\uDEBB])/; + t.containsRTL = function (e) { + return f.test(e); + }; + var d = + /(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEF8]|\uD83E[\uDD00-\uDDE6])/; + t.containsEmoji = function (e) { + return d.test(e); + }; + var h = /^[\t\n\r\x20-\x7E]*$/; + (t.isBasicASCII = function (e) { + return h.test(e); + }), + (t.containsFullWidthCharacter = function (e) { + for (var t = 0, n = e.length; t < n; t++) if (l(e.charCodeAt(t))) return !0; + return !1; + }), + (t.isFullWidthCharacter = l), + (t.UTF8_BOM_CHARACTER = String.fromCharCode(65279)), + (t.startsWithUTF8BOM = function (e) { + return !!(e && e.length > 0 && 65279 === e.charCodeAt(0)); + }), + (t.safeBtoa = function (e) { + return btoa(encodeURIComponent(e)); + }), + (t.repeat = function (e, t) { + for (var n = '', r = 0; r < t; r++) n += e; + return n; + }); + }), + i(e[11], t([0, 1, 3]), function (e, t, n) { + 'use strict'; + function r(e, t) { + for (var n = void 0, r = -1, i = 0; i < e.length; i++) { + var o = e.charCodeAt(i); + if ( + (o >= 97 && o <= 122) || + (o >= 65 && o <= 90) || + (o >= 48 && o <= 57) || + 45 === o || + 46 === o || + 95 === o || + 126 === o || + (t && 47 === o) + ) + -1 !== r && ((n += encodeURIComponent(e.substring(r, i))), (r = -1)), void 0 !== n && (n += e.charAt(i)); + else { + void 0 === n && (n = e.substr(0, i)); + var s = _[o]; + void 0 !== s + ? (-1 !== r && ((n += encodeURIComponent(e.substring(r, i))), (r = -1)), (n += s)) + : -1 === r && (r = i); + } + } + return -1 !== r && (n += encodeURIComponent(e.substring(r))), void 0 !== n ? n : e; + } + function i(e) { + var t; + return ( + (t = + e.authority && e.path.length > 1 && 'file' === e.scheme + ? '//' + e.authority + e.path + : 47 === e.path.charCodeAt(0) && + ((e.path.charCodeAt(1) >= 65 && e.path.charCodeAt(1) <= 90) || + (e.path.charCodeAt(1) >= 97 && e.path.charCodeAt(1) <= 122)) && + 58 === e.path.charCodeAt(2) + ? e.path[1].toLowerCase() + e.path.substr(2) + : e.path), + n.isWindows && (t = t.replace(/\//g, '\\')), + t + ); + } + function o(e, t) { + var n = t + ? function (e) { + for (var t = void 0, n = 0; n < e.length; n++) { + var r = e.charCodeAt(n); + 35 === r || 63 === r ? (void 0 === t && (t = e.substr(0, n)), (t += _[r])) : void 0 !== t && (t += e[n]); + } + return void 0 !== t ? t : e; + } + : r, + i = '', + o = e.scheme, + s = e.authority, + u = e.path, + a = e.query, + l = e.fragment; + if ((o && ((i += o), (i += ':')), (s || 'file' === o) && ((i += h), (i += h)), s)) { + var c = s.indexOf('@'); + if (-1 !== c) { + var f = s.substr(0, c); + (s = s.substr(c + 1)), + -1 === (c = f.indexOf(':')) + ? (i += n(f, !1)) + : ((i += n(f.substr(0, c), !1)), (i += ':'), (i += n(f.substr(c + 1), !1))), + (i += '@'); + } + -1 === (c = (s = s.toLowerCase()).indexOf(':')) ? (i += n(s, !1)) : ((i += n(s.substr(0, c), !1)), (i += s.substr(c))); + } + if (u) { + if (u.length >= 3 && 47 === u.charCodeAt(0) && 58 === u.charCodeAt(2)) { + (d = u.charCodeAt(1)) >= 65 && d <= 90 && (u = '/' + String.fromCharCode(d + 32) + ':' + u.substr(3)); + } else if (u.length >= 2 && 58 === u.charCodeAt(1)) { + var d = u.charCodeAt(0); + d >= 65 && d <= 90 && (u = String.fromCharCode(d + 32) + ':' + u.substr(2)); + } + i += n(u, !0); + } + return a && ((i += '?'), (i += n(a, !1))), l && ((i += '#'), (i += t ? l : r(l, !1))), i; + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var u, + a = /^\w[\w\d+.-]*$/, + l = /^\//, + c = /^\/\//, + f = !0, + d = '', + h = '/', + p = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/, + m = (function () { + function e(e, t, n, r, i) { + 'object' == typeof e + ? ((this.scheme = e.scheme || d), + (this.authority = e.authority || d), + (this.path = e.path || d), + (this.query = e.query || d), + (this.fragment = e.fragment || d)) + : ((this.scheme = e || d), + (this.authority = t || d), + (this.path = (function (e, t) { + switch (e) { + case 'https': + case 'http': + case 'file': + t ? t[0] !== h && (t = h + t) : (t = h); + } + return t; + })(this.scheme, n || d)), + (this.query = r || d), + (this.fragment = i || d), + (function (e) { + if (!e.scheme) { + if (f) + throw new Error( + '[UriError]: Scheme is missing: {scheme: "", authority: "' + + e.authority + + '", path: "' + + e.path + + '", query: "' + + e.query + + '", fragment: "' + + e.fragment + + '"}' + ); + console.warn( + '[UriError]: Scheme is missing: {scheme: "", authority: "' + + e.authority + + '", path: "' + + e.path + + '", query: "' + + e.query + + '", fragment: "' + + e.fragment + + '"}' + ); + } + if (e.scheme && !a.test(e.scheme)) throw new Error('[UriError]: Scheme contains illegal characters.'); + if (e.path) + if (e.authority) { + if (!l.test(e.path)) + throw new Error( + '[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character' + ); + } else if (c.test(e.path)) + throw new Error( + '[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")' + ); + })(this)); + } + return ( + (e.isUri = function (t) { + return ( + t instanceof e || + (!!t && + 'string' == typeof t.authority && + 'string' == typeof t.fragment && + 'string' == typeof t.path && + 'string' == typeof t.query && + 'string' == typeof t.scheme) + ); + }), + Object.defineProperty(e.prototype, 'fsPath', { + get: function () { + return i(this); + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.with = function (e) { + if (!e) return this; + var t = e.scheme, + n = e.authority, + r = e.path, + i = e.query, + o = e.fragment; + return ( + void 0 === t ? (t = this.scheme) : null === t && (t = d), + void 0 === n ? (n = this.authority) : null === n && (n = d), + void 0 === r ? (r = this.path) : null === r && (r = d), + void 0 === i ? (i = this.query) : null === i && (i = d), + void 0 === o ? (o = this.fragment) : null === o && (o = d), + t === this.scheme && n === this.authority && r === this.path && i === this.query && o === this.fragment + ? this + : new g(t, n, r, i, o) + ); + }), + (e.parse = function (e) { + var t = p.exec(e); + return t + ? new g( + t[2] || d, + decodeURIComponent(t[4] || d), + decodeURIComponent(t[5] || d), + decodeURIComponent(t[7] || d), + decodeURIComponent(t[9] || d) + ) + : new g(d, d, d, d, d); + }), + (e.file = function (e) { + var t = d; + if ((n.isWindows && (e = e.replace(/\\/g, h)), e[0] === h && e[1] === h)) { + var r = e.indexOf(h, 2); + -1 === r ? ((t = e.substring(2)), (e = h)) : ((t = e.substring(2, r)), (e = e.substring(r) || h)); + } + return new g('file', t, e, d, d); + }), + (e.from = function (e) { + return new g(e.scheme, e.authority, e.path, e.query, e.fragment); + }), + (e.prototype.toString = function (e) { + return void 0 === e && (e = !1), o(this, e); + }), + (e.prototype.toJSON = function () { + return this; + }), + (e.revive = function (t) { + if (t) { + if (t instanceof e) return t; + var n = new g(t); + return (n._fsPath = t.fsPath), (n._formatted = t.external), n; + } + return t; + }), + e + ); + })(); + t.URI = m; + var g = (function (e) { + function t() { + var t = (null !== e && e.apply(this, arguments)) || this; + return (t._formatted = null), (t._fsPath = null), t; + } + return ( + s(t, e), + Object.defineProperty(t.prototype, 'fsPath', { + get: function () { + return this._fsPath || (this._fsPath = i(this)), this._fsPath; + }, + enumerable: !0, + configurable: !0 + }), + (t.prototype.toString = function (e) { + return ( + void 0 === e && (e = !1), + e ? o(this, !0) : (this._formatted || (this._formatted = o(this, !1)), this._formatted) + ); + }), + (t.prototype.toJSON = function () { + var e = { $mid: 1 }; + return ( + this._fsPath && (e.fsPath = this._fsPath), + this._formatted && (e.external = this._formatted), + this.path && (e.path = this.path), + this.scheme && (e.scheme = this.scheme), + this.authority && (e.authority = this.authority), + this.query && (e.query = this.query), + this.fragment && (e.fragment = this.fragment), + e + ); + }), + t + ); + })(m), + _ = + ((u = {}), + (u[58] = '%3A'), + (u[47] = '%2F'), + (u[63] = '%3F'), + (u[35] = '%23'), + (u[91] = '%5B'), + (u[93] = '%5D'), + (u[64] = '%40'), + (u[33] = '%21'), + (u[36] = '%24'), + (u[38] = '%26'), + (u[39] = '%27'), + (u[40] = '%28'), + (u[41] = '%29'), + (u[42] = '%2A'), + (u[43] = '%2B'), + (u[44] = '%2C'), + (u[59] = '%3B'), + (u[61] = '%3D'), + (u[32] = '%20'), + u); + }); + var u; + !(function () { + var e = Object.create(null); + e['WinJS/Core/_WinJS'] = {}; + var t = function (t, n, r) { + var i = {}, + o = !1, + s = n.map(function (t) { + return 'exports' === t ? ((o = !0), i) : e[t]; + }), + u = r.apply({}, s); + e[t] = o ? i : u; + }; + t('WinJS/Core/_Global', [], function () { + 'use strict'; + return 'undefined' != typeof window ? window : 'undefined' != typeof self ? self : 'undefined' != typeof global ? global : {}; + }), + t('WinJS/Core/_BaseCoreUtils', ['WinJS/Core/_Global'], function (e) { + 'use strict'; + var t = null; + return { + hasWinRT: !!e.Windows, + markSupportedForProcessing: function (e) { + return (e.supportedForProcessing = !0), e; + }, + _setImmediate: function (n) { + null === t && + (t = e.setImmediate + ? e.setImmediate.bind(e) + : 'undefined' != typeof process && 'function' == typeof process.nextTick + ? process.nextTick.bind(process) + : e.setTimeout.bind(e)), + t(n); + } + }; + }), + t('WinJS/Core/_WriteProfilerMark', ['WinJS/Core/_Global'], function (e) { + 'use strict'; + return e.msWriteProfilerMark || function () {}; + }), + t( + 'WinJS/Core/_Base', + ['WinJS/Core/_WinJS', 'WinJS/Core/_Global', 'WinJS/Core/_BaseCoreUtils', 'WinJS/Core/_WriteProfilerMark'], + function (e, t, n, r) { + 'use strict'; + function i(e, t, n) { + var r, + i, + o, + s = Object.keys(t), + u = Array.isArray(e); + for (i = 0, o = s.length; i < o; i++) { + var a = s[i], + l = 95 !== a.charCodeAt(0), + c = t[a]; + !c || 'object' != typeof c || (void 0 === c.value && 'function' != typeof c.get && 'function' != typeof c.set) + ? l + ? u + ? e.forEach(function (e) { + e[a] = c; + }) + : (e[a] = c) + : ((r = r || {})[a] = { value: c, enumerable: l, configurable: !0, writable: !0 }) + : (void 0 === c.enumerable && (c.enumerable = l), + n && c.setName && 'function' == typeof c.setName && c.setName(n + '.' + a), + ((r = r || {})[a] = c)); + } + r && + (u + ? e.forEach(function (e) { + Object.defineProperties(e, r); + }) + : Object.defineProperties(e, r)); + } + return ( + (function () { + function n(n, r) { + var i = n || {}; + if (r) { + var o = r.split('.'); + i === t && 'WinJS' === o[0] && ((i = e), o.splice(0, 1)); + for (var s = 0, u = o.length; s < u; s++) { + var a = o[s]; + i[a] || Object.defineProperty(i, a, { value: {}, writable: !1, enumerable: !0, configurable: !0 }), + (i = i[a]); + } + } + return i; + } + function o(e, t, r) { + var o = n(e, t); + return r && i(o, r, t || ''), o; + } + var s = e; + s.Namespace || (s.Namespace = Object.create(Object.prototype)); + var u = { uninitialized: 1, working: 2, initialized: 3 }; + Object.defineProperties(s.Namespace, { + defineWithParent: { value: o, writable: !0, enumerable: !0, configurable: !0 }, + define: { + value: function (e, n) { + return o(t, e, n); + }, + writable: !0, + enumerable: !0, + configurable: !0 + }, + _lazy: { + value: function (e) { + var t, + n, + i = u.uninitialized; + return { + setName: function (e) { + t = e; + }, + get: function () { + switch (i) { + case u.initialized: + return n; + case u.uninitialized: + i = u.working; + try { + r('WinJS.Namespace._lazy:' + t + ',StartTM'), (n = e()); + } finally { + r('WinJS.Namespace._lazy:' + t + ',StopTM'), (i = u.uninitialized); + } + return (e = null), (i = u.initialized), n; + case u.working: + throw 'Illegal: reentrancy on initialization'; + default: + throw 'Illegal'; + } + }, + set: function (e) { + switch (i) { + case u.working: + throw 'Illegal: reentrancy on initialization'; + default: + (i = u.initialized), (n = e); + } + }, + enumerable: !0, + configurable: !0 + }; + }, + writable: !0, + enumerable: !0, + configurable: !0 + }, + _moduleDefine: { + value: function (e, r, o) { + var s = [e], + u = null; + return r && ((u = n(t, r)), s.push(u)), i(s, o, r || ''), u; + }, + writable: !0, + enumerable: !0, + configurable: !0 + } + }); + })(), + (function () { + function t(e, t, r) { + return (e = e || function () {}), n.markSupportedForProcessing(e), t && i(e.prototype, t), r && i(e, r), e; + } + e.Namespace.define('WinJS.Class', { + define: t, + derive: function (e, r, o, s) { + if (e) { + r = r || function () {}; + var u = e.prototype; + return ( + (r.prototype = Object.create(u)), + n.markSupportedForProcessing(r), + Object.defineProperty(r.prototype, 'constructor', { + value: r, + writable: !0, + configurable: !0, + enumerable: !0 + }), + o && i(r.prototype, o), + s && i(r, s), + r + ); + } + return t(r, o, s); + }, + mix: function (e) { + e = e || function () {}; + var t, n; + for (t = 1, n = arguments.length; t < n; t++) i(e.prototype, arguments[t]); + return e; + } + }); + })(), + { Namespace: e.Namespace, Class: e.Class } + ); + } + ), + t('WinJS/Core/_ErrorFromName', ['WinJS/Core/_Base'], function (e) { + 'use strict'; + var t = e.Class.derive( + Error, + function (e, t) { + (this.name = e), (this.message = t || e); + }, + {}, + { supportedForProcessing: !1 } + ); + return e.Namespace.define('WinJS', { ErrorFromName: t }), t; + }), + t('WinJS/Core/_Events', ['exports', 'WinJS/Core/_Base'], function (e, t) { + 'use strict'; + function n(e) { + var t = '_on' + e + 'state'; + return { + get: function () { + var e = this[t]; + return e && e.userHandler; + }, + set: function (n) { + var r = this[t]; + n + ? (r || + ((r = { + wrapper: function (e) { + return r.userHandler(e); + }, + userHandler: n + }), + Object.defineProperty(this, t, { value: r, enumerable: !1, writable: !0, configurable: !0 }), + this.addEventListener(e, r.wrapper, !1)), + (r.userHandler = n)) + : r && (this.removeEventListener(e, r.wrapper, !1), (this[t] = null)); + }, + enumerable: !0 + }; + } + var r = t.Class.define( + function (e, t, n) { + (this.detail = t), (this.target = n), (this.timeStamp = Date.now()), (this.type = e); + }, + { + bubbles: { value: !1, writable: !1 }, + cancelable: { value: !1, writable: !1 }, + currentTarget: { + get: function () { + return this.target; + } + }, + defaultPrevented: { + get: function () { + return this._preventDefaultCalled; + } + }, + trusted: { value: !1, writable: !1 }, + eventPhase: { value: 0, writable: !1 }, + target: null, + timeStamp: null, + type: null, + preventDefault: function () { + this._preventDefaultCalled = !0; + }, + stopImmediatePropagation: function () { + this._stopImmediatePropagationCalled = !0; + }, + stopPropagation: function () {} + }, + { supportedForProcessing: !1 } + ), + i = { + _listeners: null, + addEventListener: function (e, t, n) { + (n = n || !1), (this._listeners = this._listeners || {}); + for (var r = (this._listeners[e] = this._listeners[e] || []), i = 0, o = r.length; i < o; i++) { + var s = r[i]; + if (s.useCapture === n && s.listener === t) return; + } + r.push({ listener: t, useCapture: n }); + }, + dispatchEvent: function (e, t) { + var n = this._listeners && this._listeners[e]; + if (n) { + for ( + var i = new r(e, t, this), o = 0, s = (n = n.slice(0, n.length)).length; + o < s && !i._stopImmediatePropagationCalled; + o++ + ) + n[o].listener(i); + return i.defaultPrevented || !1; + } + return !1; + }, + removeEventListener: function (e, t, n) { + n = n || !1; + var r = this._listeners && this._listeners[e]; + if (r) + for (var i = 0, o = r.length; i < o; i++) { + var s = r[i]; + if (s.listener === t && s.useCapture === n) { + r.splice(i, 1), 0 === r.length && delete this._listeners[e]; + break; + } + } + } + }; + t.Namespace._moduleDefine(e, 'WinJS.Utilities', { + _createEventProperty: n, + createEventProperties: function () { + for (var e = {}, t = 0, r = arguments.length; t < r; t++) { + var i = arguments[t]; + e['on' + i] = n(i); + } + return e; + }, + eventMixin: i + }); + }), + t('WinJS/Core/_Trace', ['WinJS/Core/_Global'], function (e) { + 'use strict'; + function t(e) { + return e; + } + return { + _traceAsyncOperationStarting: + (e.Debug && e.Debug.msTraceAsyncOperationStarting && e.Debug.msTraceAsyncOperationStarting.bind(e.Debug)) || t, + _traceAsyncOperationCompleted: + (e.Debug && e.Debug.msTraceAsyncOperationCompleted && e.Debug.msTraceAsyncOperationCompleted.bind(e.Debug)) || t, + _traceAsyncCallbackStarting: + (e.Debug && e.Debug.msTraceAsyncCallbackStarting && e.Debug.msTraceAsyncCallbackStarting.bind(e.Debug)) || t, + _traceAsyncCallbackCompleted: + (e.Debug && e.Debug.msTraceAsyncCallbackCompleted && e.Debug.msTraceAsyncCallbackCompleted.bind(e.Debug)) || t + }; + }), + t( + 'WinJS/Promise/_StateMachine', + [ + 'WinJS/Core/_Global', + 'WinJS/Core/_BaseCoreUtils', + 'WinJS/Core/_Base', + 'WinJS/Core/_ErrorFromName', + 'WinJS/Core/_Events', + 'WinJS/Core/_Trace' + ], + function (e, t, n, r, i, o) { + 'use strict'; + function s() {} + function u(e, t) { + var n; + (n = t && 'object' == typeof t && 'function' == typeof t.then ? D : x), (e._value = t), e._setState(n); + } + function a(e, t, n, r, i, o) { + return { exception: e, error: t, promise: n, handler: o, id: r, parent: i }; + } + function l(e, t, n, r) { + var i = n._isException, + o = n._errorId; + return a(i ? t : null, i ? null : t, e, o, n, r); + } + function c(e, t, n) { + var r = n._isException, + i = n._errorId; + return b(e, i, r), a(r ? t : null, r ? null : t, e, i, n); + } + function f(e, t) { + var n = ++W; + return b(e, n), a(null, t, e, n); + } + function d(e, t) { + var n = ++W; + return b(e, n, !0), a(t, null, e, n); + } + function h(e, t, n, r) { + y(e, { c: t, e: n, p: r, asyncOpID: o._traceAsyncOperationStarting('WinJS.Promise.done') }); + } + function p(e, t, n, r) { + (e._value = t), _(e, t, n, r), e._setState(U); + } + function m(t, n) { + var r = t._value, + i = t._listeners; + if (i) { + t._listeners = null; + var s, u; + for (s = 0, u = Array.isArray(i) ? i.length : 1; s < u; s++) { + var a = 1 === u ? i : i[s], + l = a.c, + c = a.promise; + if ((o._traceAsyncOperationCompleted(a.asyncOpID, e.Debug && e.Debug.MS_ASYNC_OP_STATUS_SUCCESS), c)) { + o._traceAsyncCallbackStarting(a.asyncOpID); + try { + c._setCompleteValue(l ? l(r) : r); + } catch (e) { + c._setExceptionValue(e); + } finally { + o._traceAsyncCallbackCompleted(); + } + c._state !== D && c._listeners && n.push(c); + } else Y.prototype.done.call(t, l); + } + } + } + function g(t, n) { + var r = t._value, + i = t._listeners; + if (i) { + t._listeners = null; + var s, u; + for (s = 0, u = Array.isArray(i) ? i.length : 1; s < u; s++) { + var a = 1 === u ? i : i[s], + c = a.e, + f = a.promise, + d = + e.Debug && + (r && r.name === P ? e.Debug.MS_ASYNC_OP_STATUS_CANCELED : e.Debug.MS_ASYNC_OP_STATUS_ERROR); + if ((o._traceAsyncOperationCompleted(a.asyncOpID, d), f)) { + var h = !1; + try { + c + ? (o._traceAsyncCallbackStarting(a.asyncOpID), + (h = !0), + c.handlesOnError || _(f, r, l, t, c), + f._setCompleteValue(c(r))) + : f._setChainedErrorValue(r, t); + } catch (e) { + f._setExceptionValue(e); + } finally { + h && o._traceAsyncCallbackCompleted(); + } + f._state !== D && f._listeners && n.push(f); + } else B.prototype.done.call(t, null, c); + } + } + } + function _(e, t, n, r, i) { + if (L._listeners[N]) { + if (t instanceof Error && t.message === P) return; + L.dispatchEvent(N, n(e, t, r, i)); + } + } + function v(e, t) { + var n = e._listeners; + if (n) { + var r, i; + for (r = 0, i = Array.isArray(n) ? n.length : 1; r < i; r++) { + var o = 1 === i ? n : n[r], + s = o.p; + if (s) + try { + s(t); + } catch (e) {} + o.c || o.e || !o.promise || o.promise._progress(t); + } + } + } + function y(e, t) { + var n = e._listeners; + n ? (n = Array.isArray(n) ? n : [n]).push(t) : (n = t), (e._listeners = n); + } + function b(e, t, n) { + (e._isException = n || !1), (e._errorId = t); + } + function C(e, t, n, r) { + (e._value = t), _(e, t, n, r), e._setState(F); + } + function E(e, t) { + var n; + (n = t && 'object' == typeof t && 'function' == typeof t.then ? D : k), (e._value = t), e._setState(n); + } + function S(e, t, n, r) { + var i = new K(e); + return y(e, { promise: i, c: t, e: n, p: r, asyncOpID: o._traceAsyncOperationStarting('WinJS.Promise.then') }), i; + } + e.Debug && (e.Debug.setNonUserCodeExceptions = !0); + var L = new (n.Class.mix(n.Class.define(null, {}, { supportedForProcessing: !1 }), i.eventMixin))(); + L._listeners = {}; + var N = 'error', + P = 'Canceled', + A = !1, + M = { promise: 1, thenPromise: 2, errorPromise: 4, exceptionPromise: 8, completePromise: 16 }; + M.all = M.promise | M.thenPromise | M.errorPromise | M.exceptionPromise | M.completePromise; + var I, + w, + D, + O, + T, + R, + x, + k, + U, + F, + W = 1; + (I = { + name: 'created', + enter: function (e) { + e._setState(w); + }, + cancel: s, + done: s, + then: s, + _completed: s, + _error: s, + _notify: s, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }), + (w = { + name: 'working', + enter: s, + cancel: function (e) { + e._setState(T); + }, + done: h, + then: S, + _completed: u, + _error: p, + _notify: s, + _progress: v, + _setCompleteValue: E, + _setErrorValue: C + }), + (D = { + name: 'waiting', + enter: function (e) { + var t = e._value; + if (t instanceof K && t._state !== F && t._state !== k) y(t, { promise: e }); + else { + var n = function (r) { + t._errorId ? e._chainedError(r, t) : (_(e, r, l, t, n), e._error(r)); + }; + (n.handlesOnError = !0), t.then(e._completed.bind(e), n, e._progress.bind(e)); + } + }, + cancel: function (e) { + e._setState(O); + }, + done: h, + then: S, + _completed: u, + _error: p, + _notify: s, + _progress: v, + _setCompleteValue: E, + _setErrorValue: C + }), + (O = { + name: 'waiting_canceled', + enter: function (e) { + e._setState(R); + var t = e._value; + t.cancel && t.cancel(); + }, + cancel: s, + done: h, + then: S, + _completed: u, + _error: p, + _notify: s, + _progress: v, + _setCompleteValue: E, + _setErrorValue: C + }), + (T = { + name: 'canceled', + enter: function (e) { + e._setState(R), e._cancelAction(); + }, + cancel: s, + done: h, + then: S, + _completed: u, + _error: p, + _notify: s, + _progress: v, + _setCompleteValue: E, + _setErrorValue: C + }), + (R = { + name: 'canceling', + enter: function (e) { + var t = new Error(P); + (t.name = t.message), (e._value = t), e._setState(U); + }, + cancel: s, + done: s, + then: s, + _completed: s, + _error: s, + _notify: s, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }), + (x = { + name: 'complete_notify', + enter: function (e) { + if (((e.done = Y.prototype.done), (e.then = Y.prototype.then), e._listeners)) + for (var t, n = [e]; n.length; ) (t = n.shift())._state._notify(t, n); + e._setState(k); + }, + cancel: s, + done: null, + then: null, + _completed: s, + _error: s, + _notify: m, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }), + (k = { + name: 'success', + enter: function (e) { + (e.done = Y.prototype.done), (e.then = Y.prototype.then), e._cleanupAction(); + }, + cancel: s, + done: null, + then: null, + _completed: s, + _error: s, + _notify: m, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }), + (U = { + name: 'error_notify', + enter: function (e) { + if (((e.done = B.prototype.done), (e.then = B.prototype.then), e._listeners)) + for (var t, n = [e]; n.length; ) (t = n.shift())._state._notify(t, n); + e._setState(F); + }, + cancel: s, + done: null, + then: null, + _completed: s, + _error: s, + _notify: g, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }), + (F = { + name: 'error', + enter: function (e) { + (e.done = B.prototype.done), (e.then = B.prototype.then), e._cleanupAction(); + }, + cancel: s, + done: null, + then: null, + _completed: s, + _error: s, + _notify: g, + _progress: s, + _setCompleteValue: s, + _setErrorValue: s + }); + var q, + j = n.Class.define( + null, + { + _listeners: null, + _nextState: null, + _state: null, + _value: null, + cancel: function () { + this._state.cancel(this), this._run(); + }, + done: function (e, t, n) { + this._state.done(this, e, t, n); + }, + then: function e(t, n, r) { + if (this.then === e) return this._state.then(this, t, n, r); + this.then(t, n, r); + }, + _chainedError: function (e, t) { + var n = this._state._error(this, e, c, t); + return this._run(), n; + }, + _completed: function (e) { + var t = this._state._completed(this, e); + return this._run(), t; + }, + _error: function (e) { + var t = this._state._error(this, e, f); + return this._run(), t; + }, + _progress: function (e) { + this._state._progress(this, e); + }, + _setState: function (e) { + this._nextState = e; + }, + _setCompleteValue: function (e) { + this._state._setCompleteValue(this, e), this._run(); + }, + _setChainedErrorValue: function (e, t) { + var n = this._state._setErrorValue(this, e, c, t); + return this._run(), n; + }, + _setExceptionValue: function (e) { + var t = this._state._setErrorValue(this, e, d); + return this._run(), t; + }, + _run: function () { + for (; this._nextState; ) + (this._state = this._nextState), (this._nextState = null), this._state.enter(this); + } + }, + { supportedForProcessing: !1 } + ), + K = n.Class.derive( + j, + function (e) { + A && (!0 === A || A & M.thenPromise) && (this._stack = H._getStack()), + (this._creator = e), + this._setState(I), + this._run(); + }, + { + _creator: null, + _cancelAction: function () { + this._creator && this._creator.cancel(); + }, + _cleanupAction: function () { + this._creator = null; + } + }, + { supportedForProcessing: !1 } + ), + B = n.Class.define( + function (e) { + A && (!0 === A || A & M.errorPromise) && (this._stack = H._getStack()), (this._value = e), _(this, e, f); + }, + { + cancel: function () {}, + done: function (e, t) { + var n = this._value; + if (t) + try { + t.handlesOnError || _(null, n, l, this, t); + var r = t(n); + return void (r && 'object' == typeof r && 'function' == typeof r.done && r.done()); + } catch (e) { + n = e; + } + (n instanceof Error && n.message === P) || H._doneHandler(n); + }, + then: function (e, t) { + if (!t) return this; + var n, + r = this._value; + try { + t.handlesOnError || _(null, r, l, this, t), (n = new Y(t(r))); + } catch (e) { + n = e === r ? this : new V(e); + } + return n; + } + }, + { supportedForProcessing: !1 } + ), + V = n.Class.derive( + B, + function (e) { + A && (!0 === A || A & M.exceptionPromise) && (this._stack = H._getStack()), + (this._value = e), + _(this, e, d); + }, + {}, + { supportedForProcessing: !1 } + ), + Y = n.Class.define( + function (e) { + if ( + (A && (!0 === A || A & M.completePromise) && (this._stack = H._getStack()), + e && 'object' == typeof e && 'function' == typeof e.then) + ) { + var t = new K(null); + return t._setCompleteValue(e), t; + } + this._value = e; + }, + { + cancel: function () {}, + done: function (e) { + if (e) + try { + var t = e(this._value); + t && 'object' == typeof t && 'function' == typeof t.done && t.done(); + } catch (e) { + H._doneHandler(e); + } + }, + then: function (e) { + try { + var t = e ? e(this._value) : this._value; + return t === this._value ? this : new Y(t); + } catch (e) { + return new V(e); + } + } + }, + { supportedForProcessing: !1 } + ), + H = n.Class.derive( + j, + function (e, t) { + A && (!0 === A || A & M.promise) && (this._stack = H._getStack()), + (this._oncancel = t), + this._setState(I), + this._run(); + try { + e(this._completed.bind(this), this._error.bind(this), this._progress.bind(this)); + } catch (e) { + this._setExceptionValue(e); + } + }, + { + _oncancel: null, + _cancelAction: function () { + try { + if (!this._oncancel) throw new Error('Promise did not implement oncancel'); + this._oncancel(); + } catch (e) { + e.message, e.stack; + L.dispatchEvent('error', e); + } + }, + _cleanupAction: function () { + this._oncancel = null; + } + }, + { + addEventListener: function (e, t, n) { + L.addEventListener(e, t, n); + }, + any: function (e) { + return new H( + function (t, n) { + var r = Object.keys(e); + 0 === r.length && t(); + var i = 0; + r.forEach(function (o) { + H.as(e[o]).then( + function () { + t({ key: o, value: e[o] }); + }, + function (s) { + s instanceof Error && s.name === P + ? ++i === r.length && t(H.cancel) + : n({ key: o, value: e[o] }); + } + ); + }); + }, + function () { + Object.keys(e).forEach(function (t) { + var n = H.as(e[t]); + 'function' == typeof n.cancel && n.cancel(); + }); + } + ); + }, + as: function (e) { + return e && 'object' == typeof e && 'function' == typeof e.then ? e : new Y(e); + }, + cancel: { + get: function () { + return (q = q || new B(new r(P))); + } + }, + dispatchEvent: function (e, t) { + return L.dispatchEvent(e, t); + }, + is: function (e) { + return e && 'object' == typeof e && 'function' == typeof e.then; + }, + join: function (e) { + return new H( + function (t, n, r) { + var i = Object.keys(e), + o = Array.isArray(e) ? [] : {}, + s = Array.isArray(e) ? [] : {}, + u = 0, + a = i.length, + l = function (e) { + if (0 == --a) { + var u = Object.keys(o).length; + if (0 === u) t(s); + else { + var l = 0; + i.forEach(function (e) { + var t = o[e]; + t instanceof Error && t.name === P && l++; + }), + l === u ? t(H.cancel) : n(o); + } + } else r({ Key: e, Done: !0 }); + }; + i.forEach(function (t) { + var n = e[t]; + void 0 === n + ? u++ + : H.then( + n, + function (e) { + (s[t] = e), l(t); + }, + function (e) { + (o[t] = e), l(t); + } + ); + }), + 0 !== (a -= u) || t(s); + }, + function () { + Object.keys(e).forEach(function (t) { + var n = H.as(e[t]); + 'function' == typeof n.cancel && n.cancel(); + }); + } + ); + }, + removeEventListener: function (e, t, n) { + L.removeEventListener(e, t, n); + }, + supportedForProcessing: !1, + then: function (e, t, n, r) { + return H.as(e).then(t, n, r); + }, + thenEach: function (e, t, n, r) { + var i = Array.isArray(e) ? [] : {}; + return ( + Object.keys(e).forEach(function (o) { + i[o] = H.as(e[o]).then(t, n, r); + }), + H.join(i) + ); + }, + timeout: function (n, r) { + var i = (function (n) { + var r; + return new H( + function (i) { + n ? (r = e.setTimeout(i, n)) : t._setImmediate(i); + }, + function () { + r && e.clearTimeout(r); + } + ); + })(n); + return r + ? (function (e, t) { + var n = function () { + e.cancel(); + }; + return ( + e.then(function () { + t.cancel(); + }), + t.then(n, n), + t + ); + })(i, r) + : i; + }, + wrap: function (e) { + return new Y(e); + }, + wrapError: function (e) { + return new B(e); + }, + _veryExpensiveTagWithStack: { + get: function () { + return A; + }, + set: function (e) { + A = e; + } + }, + _veryExpensiveTagWithStack_tag: M, + _getStack: function () { + if (e.Debug && e.Debug.debuggerEnabled) + try { + throw new Error(); + } catch (e) { + return e.stack; + } + }, + _cancelBlocker: function (e, t) { + if (!H.is(e)) return H.wrap(e); + var n, + r, + i = new H( + function (e, t) { + (n = e), (r = t); + }, + function () { + (n = null), (r = null), t && t(); + } + ); + return ( + e.then( + function (e) { + n && n(e); + }, + function (e) { + r && r(e); + } + ), + i + ); + } + } + ); + return ( + Object.defineProperties(H, i.createEventProperties(N)), + (H._doneHandler = function (e) { + t._setImmediate(function () { + throw e; + }); + }), + { PromiseStateMachine: j, Promise: H, state_created: I } + ); + } + ), + t('WinJS/Promise', ['WinJS/Core/_Base', 'WinJS/Promise/_StateMachine'], function (e, t) { + 'use strict'; + return e.Namespace.define('WinJS', { Promise: t.Promise }), t.Promise; + }), + ((u = e['WinJS/Core/_WinJS']).TPromise = u.Promise), + (u.PPromise = u.Promise), + 'undefined' == typeof exports && 'function' == typeof i && i.amd ? i('vs/base/common/winjs.base', [], u) : (module.exports = u); + })(), + i(e[4], t([0, 1, 8]), function (e, t, n) { + 'use strict'; + function r(e) { + i(e) || t.errorHandler.onUnexpectedError(e); + } + function i(e) { + return e instanceof Error && e.name === u && e.message === u; + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = {}; + n.TPromise.addEventListener('error', function (e) { + var t = e.detail, + n = t.id; + t.parent + ? t.handler && o && delete o[n] + : ((o[n] = t), + 1 === Object.keys(o).length && + setTimeout(function () { + var e = o; + (o = {}), + Object.keys(e).forEach(function (t) { + var n = e[t]; + n.exception ? r(n.exception) : n.error && r(n.error), + console.log('WARNING: Promise with no error callback:' + n.id), + console.log(n), + n.exception && console.log(n.exception.stack); + }); + }, 0)); + }); + var s = (function () { + function e() { + (this.listeners = []), + (this.unexpectedErrorHandler = function (e) { + setTimeout(function () { + if (e.stack) throw new Error(e.message + '\n\n' + e.stack); + throw e; + }, 0); + }); + } + return ( + (e.prototype.emit = function (e) { + this.listeners.forEach(function (t) { + t(e); + }); + }), + (e.prototype.onUnexpectedError = function (e) { + this.unexpectedErrorHandler(e), this.emit(e); + }), + (e.prototype.onUnexpectedExternalError = function (e) { + this.unexpectedErrorHandler(e); + }), + e + ); + })(); + (t.ErrorHandler = s), + (t.errorHandler = new s()), + (t.onUnexpectedError = r), + (t.onUnexpectedExternalError = function (e) { + i(e) || t.errorHandler.onUnexpectedExternalError(e); + }), + (t.transformErrorForSerialization = function (e) { + if (e instanceof Error) return { $isError: !0, name: e.name, message: e.message, stack: e.stacktrace || e.stack }; + return e; + }); + var u = 'Canceled'; + (t.isPromiseCanceledError = i), + (t.canceled = function () { + var e = new Error(u); + return (e.name = e.message), e; + }), + (t.illegalArgument = function (e) { + return e ? new Error('Illegal argument: ' + e) : new Error('Illegal argument'); + }), + (t.illegalState = function (e) { + return e ? new Error('Illegal state: ' + e) : new Error('Illegal state'); + }); + }), + i(e[9], t([0, 1, 4, 16, 7, 15]), function (e, t, n, r, i, o) { + 'use strict'; + function s(e, t) { + return function (n, r, i) { + return ( + void 0 === r && (r = null), + e( + function (e) { + return n.call(r, t(e)); + }, + null, + i + ) + ); + }; + } + function u(e, t) { + return function (n, r, i) { + return ( + void 0 === r && (r = null), + e( + function (e) { + return t(e) && n.call(r, e); + }, + null, + i + ) + ); + }; + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var a; + !(function (e) { + var t = { dispose: function () {} }; + e.None = function () { + return t; + }; + })((a = t.Event || (t.Event = {}))); + var l = (function () { + function e(e) { + void 0 === e && (e = null), + (this._options = e), + (this._event = null), + (this._disposed = !1), + (this._deliveryQueue = null), + (this._listeners = null); + } + return ( + Object.defineProperty(e.prototype, 'event', { + get: function () { + var t = this; + return ( + this._event || + (this._event = function (n, r, i) { + t._listeners || (t._listeners = new o.LinkedList()); + var s = t._listeners.isEmpty(); + s && t._options && t._options.onFirstListenerAdd && t._options.onFirstListenerAdd(t); + var u = t._listeners.push(r ? [n, r] : n); + s && t._options && t._options.onFirstListenerDidAdd && t._options.onFirstListenerDidAdd(t), + t._options && t._options.onListenerDidAdd && t._options.onListenerDidAdd(t, n, r); + var a; + return ( + (a = { + dispose: function () { + if ( + ((a.dispose = e._noop), + !t._disposed && (u(), t._options && t._options.onLastListenerRemove)) + ) { + (t._listeners && !t._listeners.isEmpty()) || t._options.onLastListenerRemove(t); + } + } + }), + Array.isArray(i) && i.push(a), + a + ); + }), + this._event + ); + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.fire = function (e) { + if (this._listeners) { + this._deliveryQueue || (this._deliveryQueue = []); + for (var t = this._listeners.iterator(), r = t.next(); !r.done; r = t.next()) + this._deliveryQueue.push([r.value, e]); + for (; this._deliveryQueue.length > 0; ) { + var i = this._deliveryQueue.shift(), + o = i[0], + s = i[1]; + try { + 'function' == typeof o ? o.call(void 0, s) : o[0].call(o[1], s); + } catch (r) { + n.onUnexpectedError(r); + } + } + } + }), + (e.prototype.dispose = function () { + this._listeners && (this._listeners = null), + this._deliveryQueue && (this._deliveryQueue.length = 0), + (this._disposed = !0); + }), + (e._noop = function () {}), + e + ); + })(); + t.Emitter = l; + var c = (function () { + function e() { + var e = this; + (this.hasListeners = !1), + (this.events = []), + (this.emitter = new l({ + onFirstListenerAdd: function () { + return e.onFirstListenerAdd(); + }, + onLastListenerRemove: function () { + return e.onLastListenerRemove(); + } + })); + } + return ( + Object.defineProperty(e.prototype, 'event', { + get: function () { + return this.emitter.event; + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.add = function (e) { + var t = this, + n = { event: e, listener: null }; + this.events.push(n), this.hasListeners && this.hook(n); + return i.toDisposable( + r.once(function () { + t.hasListeners && t.unhook(n); + var e = t.events.indexOf(n); + t.events.splice(e, 1); + }) + ); + }), + (e.prototype.onFirstListenerAdd = function () { + var e = this; + (this.hasListeners = !0), + this.events.forEach(function (t) { + return e.hook(t); + }); + }), + (e.prototype.onLastListenerRemove = function () { + var e = this; + (this.hasListeners = !1), + this.events.forEach(function (t) { + return e.unhook(t); + }); + }), + (e.prototype.hook = function (e) { + var t = this; + e.listener = e.event(function (e) { + return t.emitter.fire(e); + }); + }), + (e.prototype.unhook = function (e) { + e.listener && e.listener.dispose(), (e.listener = null); + }), + (e.prototype.dispose = function () { + this.emitter.dispose(); + }), + e + ); + })(); + (t.EventMultiplexer = c), + (t.once = function (e) { + return function (t, n, r) { + void 0 === n && (n = null); + var i = !1, + o = e( + function (e) { + if (!i) return o ? o.dispose() : (i = !0), t.call(n, e); + }, + null, + r + ); + return i && o.dispose(), o; + }; + }), + (t.anyEvent = function () { + for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[t]; + return function (t, n, r) { + return ( + void 0 === n && (n = null), + i.combinedDisposable( + e.map(function (e) { + return e( + function (e) { + return t.call(n, e); + }, + null, + r + ); + }) + ) + ); + }; + }), + (t.debounceEvent = function (e, t, n, r) { + void 0 === n && (n = 100), void 0 === r && (r = !1); + var i, + o = void 0, + s = void 0, + u = 0, + a = new l({ + onFirstListenerAdd: function () { + i = e(function (e) { + u++, + (o = t(o, e)), + r && !s && a.fire(o), + clearTimeout(s), + (s = setTimeout(function () { + var e = o; + (o = void 0), (s = void 0), (!r || u > 1) && a.fire(e), (u = 0); + }, n)); + }); + }, + onLastListenerRemove: function () { + i.dispose(); + } + }); + return a.event; + }); + var f = (function () { + function e() { + this.buffers = []; + } + return ( + (e.prototype.wrapEvent = function (e) { + var t = this; + return function (n, r, i) { + return e( + function (e) { + var i = t.buffers[t.buffers.length - 1]; + i + ? i.push(function () { + return n.call(r, e); + }) + : n.call(r, e); + }, + void 0, + i + ); + }; + }), + (e.prototype.bufferEvents = function (e) { + var t = []; + this.buffers.push(t); + var n = e(); + return ( + this.buffers.pop(), + t.forEach(function (e) { + return e(); + }), + n + ); + }), + e + ); + })(); + (t.EventBufferer = f), (t.mapEvent = s), (t.filterEvent = u); + var d = (function () { + function e(e) { + this._event = e; + } + return ( + Object.defineProperty(e.prototype, 'event', { + get: function () { + return this._event; + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.map = function (t) { + return new e(s(this._event, t)); + }), + (e.prototype.filter = function (t) { + return new e(u(this._event, t)); + }), + (e.prototype.on = function (e, t, n) { + return this._event(e, t, n); + }), + e + ); + })(); + t.chain = function (e) { + return new d(e); + }; + var h = (function () { + function e() { + var e = this; + (this.listening = !1), + (this.inputEvent = a.None), + (this.inputEventListener = i.Disposable.None), + (this.emitter = new l({ + onFirstListenerDidAdd: function () { + (e.listening = !0), (e.inputEventListener = e.inputEvent(e.emitter.fire, e.emitter)); + }, + onLastListenerRemove: function () { + (e.listening = !1), e.inputEventListener.dispose(); + } + })), + (this.event = this.emitter.event); + } + return ( + Object.defineProperty(e.prototype, 'input', { + set: function (e) { + (this.inputEvent = e), + this.listening && + (this.inputEventListener.dispose(), (this.inputEventListener = e(this.emitter.fire, this.emitter))); + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.dispose = function () { + this.inputEventListener.dispose(), this.emitter.dispose(); + }), + e + ); + })(); + t.Relay = h; + }), + i(e[10], t([0, 1, 9]), function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r, + i = Object.freeze(function (e, t) { + var n = setTimeout(e.bind(t), 0); + return { + dispose: function () { + clearTimeout(n); + } + }; + }); + !(function (e) { + (e.isCancellationToken = function (t) { + return ( + t === e.None || + t === e.Cancelled || + t instanceof o || + (!(!t || 'object' != typeof t) && + 'boolean' == typeof t.isCancellationRequested && + 'function' == typeof t.onCancellationRequested) + ); + }), + (e.None = Object.freeze({ isCancellationRequested: !1, onCancellationRequested: n.Event.None })), + (e.Cancelled = Object.freeze({ isCancellationRequested: !0, onCancellationRequested: i })); + })((r = t.CancellationToken || (t.CancellationToken = {}))); + var o = (function () { + function e() { + (this._isCancelled = !1), (this._emitter = null); + } + return ( + (e.prototype.cancel = function () { + this._isCancelled || ((this._isCancelled = !0), this._emitter && (this._emitter.fire(void 0), this.dispose())); + }), + Object.defineProperty(e.prototype, 'isCancellationRequested', { + get: function () { + return this._isCancelled; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(e.prototype, 'onCancellationRequested', { + get: function () { + return this._isCancelled ? i : (this._emitter || (this._emitter = new n.Emitter()), this._emitter.event); + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.dispose = function () { + this._emitter && (this._emitter.dispose(), (this._emitter = null)); + }), + e + ); + })(), + s = (function () { + function e() {} + return ( + Object.defineProperty(e.prototype, 'token', { + get: function () { + return this._token || (this._token = new o()), this._token; + }, + enumerable: !0, + configurable: !0 + }), + (e.prototype.cancel = function () { + this._token ? this._token instanceof o && this._token.cancel() : (this._token = r.Cancelled); + }), + (e.prototype.dispose = function () { + this._token ? this._token instanceof o && this._token.dispose() : (this._token = r.None); + }), + e + ); + })(); + t.CancellationTokenSource = s; + }), + i(e[14], t([0, 1, 10, 4, 7, 8]), function (e, t, n, r, i, o) { + 'use strict'; + function u(e) { + var t = new n.CancellationTokenSource(), + i = e(t.token), + o = new Promise(function (e, n) { + t.token.onCancellationRequested(function () { + n(r.canceled()); + }), + Promise.resolve(i).then( + function (n) { + t.dispose(), e(n); + }, + function (e) { + t.dispose(), n(e); + } + ); + }); + return new ((function () { + function e() {} + return ( + (e.prototype.cancel = function () { + t.cancel(); + }), + (e.prototype.then = function (e, t) { + return o.then(e, t); + }), + (e.prototype.catch = function (e) { + return this.then(void 0, e); + }), + e + ); + })())(); + } + function a(e, t) { + return t + ? new Promise(function (n, i) { + var o = setTimeout(n, e); + t.onCancellationRequested(function () { + clearTimeout(o), i(r.canceled()); + }); + }) + : u(function (t) { + return a(e, t); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.isThenable = function (e) { + return e && 'function' == typeof e.then; + }), + (t.createCancelablePromise = u); + var l = (function () { + function e(e) { + (this.defaultDelay = e), + (this.timeout = null), + (this.completionPromise = null), + (this.doResolve = null), + (this.task = null); + } + return ( + (e.prototype.trigger = function (e, t) { + var n = this; + return ( + void 0 === t && (t = this.defaultDelay), + (this.task = e), + this.cancelTimeout(), + this.completionPromise || + (this.completionPromise = new o.TPromise(function (e, t) { + (n.doResolve = e), (n.doReject = t); + }).then(function () { + (n.completionPromise = null), (n.doResolve = null); + var e = n.task; + return (n.task = null), e(); + })), + (this.timeout = setTimeout(function () { + (n.timeout = null), n.doResolve(null); + }, t)), + this.completionPromise + ); + }), + (e.prototype.cancel = function () { + this.cancelTimeout(), this.completionPromise && (this.doReject(r.canceled()), (this.completionPromise = null)); + }), + (e.prototype.cancelTimeout = function () { + null !== this.timeout && (clearTimeout(this.timeout), (this.timeout = null)); + }), + (e.prototype.dispose = function () { + this.cancelTimeout(); + }), + e + ); + })(); + (t.Delayer = l), + (t.timeout = a), + (t.always = function (e, t) { + function n() { + try { + t(); + } catch (e) { + r.onUnexpectedError(e); + } + } + return ( + e.then( + function (e) { + return n(); + }, + function (e) { + return n(); + } + ), + Promise.resolve(e) + ); + }), + (t.first = function (e, t, n) { + void 0 === t && + (t = function (e) { + return !!e; + }), + void 0 === n && (n = null); + var r = 0, + i = e.length, + o = function () { + if (r >= i) return Promise.resolve(n); + var s = e[r++]; + return Promise.resolve(s()).then(function (e) { + return t(e) ? Promise.resolve(e) : o(); + }); + }; + return o(); + }); + var c = (function (e) { + function t(t, n) { + var r = e.call(this) || this; + return (r._token = -1), 'function' == typeof t && 'number' == typeof n && r.setIfNotSet(t, n), r; + } + return ( + s(t, e), + (t.prototype.dispose = function () { + this.cancel(), e.prototype.dispose.call(this); + }), + (t.prototype.cancel = function () { + -1 !== this._token && (clearTimeout(this._token), (this._token = -1)); + }), + (t.prototype.cancelAndSet = function (e, t) { + var n = this; + this.cancel(), + (this._token = setTimeout(function () { + (n._token = -1), e(); + }, t)); + }), + (t.prototype.setIfNotSet = function (e, t) { + var n = this; + -1 === this._token && + (this._token = setTimeout(function () { + (n._token = -1), e(); + }, t)); + }), + t + ); + })(i.Disposable); + t.TimeoutTimer = c; + var f = (function (e) { + function t() { + var t = e.call(this) || this; + return (t._token = -1), t; + } + return ( + s(t, e), + (t.prototype.dispose = function () { + this.cancel(), e.prototype.dispose.call(this); + }), + (t.prototype.cancel = function () { + -1 !== this._token && (clearInterval(this._token), (this._token = -1)); + }), + (t.prototype.cancelAndSet = function (e, t) { + this.cancel(), + (this._token = setInterval(function () { + e(); + }, t)); + }), + t + ); + })(i.Disposable); + t.IntervalTimer = f; + var d = (function () { + function e(e, t) { + (this.timeoutToken = -1), (this.runner = e), (this.timeout = t), (this.timeoutHandler = this.onTimeout.bind(this)); + } + return ( + (e.prototype.dispose = function () { + this.cancel(), (this.runner = null); + }), + (e.prototype.cancel = function () { + this.isScheduled() && (clearTimeout(this.timeoutToken), (this.timeoutToken = -1)); + }), + (e.prototype.schedule = function (e) { + void 0 === e && (e = this.timeout), this.cancel(), (this.timeoutToken = setTimeout(this.timeoutHandler, e)); + }), + (e.prototype.isScheduled = function () { + return -1 !== this.timeoutToken; + }), + (e.prototype.onTimeout = function () { + (this.timeoutToken = -1), this.runner && this.doRun(); + }), + (e.prototype.doRun = function () { + this.runner && this.runner(); + }), + e + ); + })(); + (t.RunOnceScheduler = d), + (function () { + if ('function' != typeof requestIdleCallback || 'function' != typeof cancelIdleCallback) { + var e = Object.freeze({ + didTimeout: !0, + timeRemaining: function () { + return 15; + } + }); + t.runWhenIdle = function (t, n) { + void 0 === n && (n = 0); + var r = setTimeout(function () { + return t(e); + }, n), + i = !1; + return { + dispose: function () { + i || ((i = !0), clearTimeout(r)); + } + }; + }; + } else + t.runWhenIdle = function (e, t) { + var n = requestIdleCallback(e, 'number' == typeof t ? { timeout: t } : void 0), + r = !1; + return { + dispose: function () { + r || ((r = !0), cancelIdleCallback(n)); + } + }; + }; + })(); + var h = (function () { + function e(e) { + var n = this; + (this._executor = function () { + try { + n._value = e(); + } catch (e) { + n._error = e; + } finally { + n._didRun = !0; + } + }), + (this._handle = t.runWhenIdle(function () { + return n._executor(); + })); + } + return ( + (e.prototype.dispose = function () { + this._handle.dispose(); + }), + (e.prototype.getValue = function () { + if ((this._didRun || (this._handle.dispose(), this._executor()), this._error)) throw this._error; + return this._value; + }), + e + ); + })(); + t.IdleValue = h; + }), + i(e[18], t([0, 1, 8, 3, 14]), function (e, t, n, r, i) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = (function () { + function e(e) { + !(function (e) { + return i.isThenable(e) && 'function' == typeof e.done; + })(e) + ? (this._winjsPromise = new n.Promise(function (t, n) { + var i = !0; + e( + function (e) { + i + ? r.setImmediate(function () { + return t(e); + }) + : t(e); + }, + function (e) { + i + ? r.setImmediate(function () { + return n(e); + }) + : n(e); + } + ), + (i = !1); + })) + : (this._winjsPromise = e); + } + return ( + (e.all = function (t) { + return new e( + n.Promise.join(t).then(null, function (e) { + for (var t in e) if (e.hasOwnProperty(t)) return e[t]; + }) + ); + }), + (e.race = function (t) { + return new e( + n.Promise.any(t).then( + function (e) { + return e.value; + }, + function (e) { + return e.value; + } + ) + ); + }), + (e.resolve = function (t) { + return new e(n.Promise.wrap(t)); + }), + (e.reject = function (t) { + return new e(n.Promise.wrapError(t)); + }), + (e.prototype.then = function (t, i) { + var o = !0, + s = new e( + this._winjsPromise.then( + t && + function (e) { + return o + ? new n.Promise(function (n, i) { + r.setImmediate(function () { + var r; + try { + r = t(e); + } catch (e) { + return void i(e); + } + n(r); + }); + }) + : t(e); + }, + i && + function (e) { + return o + ? new n.Promise(function (t, n) { + r.setImmediate(function () { + var r; + try { + r = i(e); + } catch (e) { + return void n(e); + } + t(r); + }); + }) + : i(e); + } + ) + ); + return (o = !1), s; + }), + (e.prototype.catch = function (e) { + return this.then(null, e); + }), + e + ); + })(); + t.PolyfillPromise = o; + }), + i(e[33], t([0, 1, 4, 7, 3, 18]), function (e, t, n, r, i, o) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var u = self; + void 0 === u.Promise && (u.Promise = o.PolyfillPromise); + var a = '$initialize', + l = !1; + t.logOnceWebWorkerWarning = function (e) { + i.isWeb && + (l || + ((l = !0), + console.warn( + 'Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/Microsoft/monaco-editor#faq' + )), + console.warn(e.message)); + }; + var c = (function () { + function e(e) { + (this._workerId = -1), (this._handler = e), (this._lastSentReq = 0), (this._pendingReplies = Object.create(null)); + } + return ( + (e.prototype.setWorkerId = function (e) { + this._workerId = e; + }), + (e.prototype.sendMessage = function (e, t) { + var n = this, + r = String(++this._lastSentReq); + return new Promise(function (i, o) { + (n._pendingReplies[r] = { resolve: i, reject: o }), + n._send({ vsWorker: n._workerId, req: r, method: e, args: t }); + }); + }), + (e.prototype.handleMessage = function (e) { + var t; + try { + t = JSON.parse(e); + } catch (e) { + return; + } + t && t.vsWorker && ((-1 !== this._workerId && t.vsWorker !== this._workerId) || this._handleMessage(t)); + }), + (e.prototype._handleMessage = function (e) { + var t = this; + if (e.seq) { + var r = e; + if (!this._pendingReplies[r.seq]) return void console.warn('Got reply to unknown seq'); + var i = this._pendingReplies[r.seq]; + if ((delete this._pendingReplies[r.seq], r.err)) { + var o = r.err; + return ( + r.err.$isError && + (((o = new Error()).name = r.err.name), (o.message = r.err.message), (o.stack = r.err.stack)), + void i.reject(o) + ); + } + i.resolve(r.res); + } else { + var s = e, + u = s.req; + this._handler.handleMessage(s.method, s.args).then( + function (e) { + t._send({ vsWorker: t._workerId, seq: u, res: e, err: void 0 }); + }, + function (e) { + e.detail instanceof Error && (e.detail = n.transformErrorForSerialization(e.detail)), + t._send({ + vsWorker: t._workerId, + seq: u, + res: void 0, + err: n.transformErrorForSerialization(e) + }); + } + ); + } + }), + (e.prototype._send = function (e) { + var t = JSON.stringify(e); + this._handler.sendMessage(t); + }), + e + ); + })(), + f = (function (e) { + function t(t, n) { + var r = e.call(this) || this, + i = null; + (r._worker = r._register( + t.create( + 'vs/base/common/worker/simpleWorker', + function (e) { + r._protocol.handleMessage(e); + }, + function (e) { + i && i(e); + } + ) + )), + (r._protocol = new c({ + sendMessage: function (e) { + r._worker.postMessage(e); + }, + handleMessage: function (e, t) { + return Promise.resolve(null); + } + })), + r._protocol.setWorkerId(r._worker.getId()); + var o = null; + void 0 !== self.require && 'function' == typeof self.require.getConfig + ? (o = self.require.getConfig()) + : void 0 !== self.requirejs && (o = self.requirejs.s.contexts._.config), + (r._onModuleLoaded = r._protocol.sendMessage(a, [r._worker.getId(), n, o])), + (r._lazyProxy = new Promise(function (e, t) { + (i = t), + r._onModuleLoaded.then( + function (t) { + for (var n = {}, r = 0; r < t.length; r++) n[t[r]] = u(t[r], s); + e(n); + }, + function (e) { + t(e), r._onError('Worker failed to load ' + n, e); + } + ); + })); + var s = function (e, t) { + return r._request(e, t); + }, + u = function (e, t) { + return function () { + var n = Array.prototype.slice.call(arguments, 0); + return t(e, n); + }; + }; + return r; + } + return ( + s(t, e), + (t.prototype.getProxyObject = function () { + return this._lazyProxy; + }), + (t.prototype._request = function (e, t) { + var n = this; + return new Promise(function (r, i) { + n._onModuleLoaded.then(function () { + n._protocol.sendMessage(e, t).then(r, i); + }, i); + }); + }), + (t.prototype._onError = function (e, t) { + console.error(e), console.info(t); + }), + t + ); + })(r.Disposable); + t.SimpleWorkerClient = f; + var d = (function () { + function e(e, t) { + var n = this; + (this._requestHandler = t), + (this._protocol = new c({ + sendMessage: function (t) { + e(t); + }, + handleMessage: function (e, t) { + return n._handleMessage(e, t); + } + })); + } + return ( + (e.prototype.onmessage = function (e) { + this._protocol.handleMessage(e); + }), + (e.prototype._handleMessage = function (e, t) { + if (e === a) return this.initialize(t[0], t[1], t[2]); + if (!this._requestHandler || 'function' != typeof this._requestHandler[e]) + return Promise.reject(new Error('Missing requestHandler or method: ' + e)); + try { + return Promise.resolve(this._requestHandler[e].apply(this._requestHandler, t)); + } catch (e) { + return Promise.reject(e); + } + }), + (e.prototype.initialize = function (e, t, n) { + var r = this; + if ((this._protocol.setWorkerId(e), this._requestHandler)) { + var i = []; + for (var o in this._requestHandler) 'function' == typeof this._requestHandler[o] && i.push(o); + return Promise.resolve(i); + } + return ( + n && + (void 0 !== n.baseUrl && delete n.baseUrl, + void 0 !== n.paths && void 0 !== n.paths.vs && delete n.paths.vs, + (n.catchError = !0), + self.require.config(n)), + new Promise(function (e, n) { + self.require( + [t], + function () { + for (var t = [], i = 0; i < arguments.length; i++) t[i] = arguments[i]; + var o = t[0]; + if (((r._requestHandler = o.create()), r._requestHandler)) { + var s = []; + for (var u in r._requestHandler) 'function' == typeof r._requestHandler[u] && s.push(u); + e(s); + } else n(new Error('No RequestHandler!')); + }, + n + ); + }) + ); + }), + e + ); + })(); + (t.SimpleWorkerServer = d), + (t.create = function (e) { + return new d(e, null); + }); + }), + i(e[2], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var n = (function () { + function e(e, t) { + (this.lineNumber = e), (this.column = t); + } + return ( + (e.prototype.with = function (t, n) { + return ( + void 0 === t && (t = this.lineNumber), + void 0 === n && (n = this.column), + t === this.lineNumber && n === this.column ? this : new e(t, n) + ); + }), + (e.prototype.delta = function (e, t) { + return void 0 === e && (e = 0), void 0 === t && (t = 0), this.with(this.lineNumber + e, this.column + t); + }), + (e.prototype.equals = function (t) { + return e.equals(this, t); + }), + (e.equals = function (e, t) { + return (!e && !t) || (!!e && !!t && e.lineNumber === t.lineNumber && e.column === t.column); + }), + (e.prototype.isBefore = function (t) { + return e.isBefore(this, t); + }), + (e.isBefore = function (e, t) { + return e.lineNumber < t.lineNumber || (!(t.lineNumber < e.lineNumber) && e.column < t.column); + }), + (e.prototype.isBeforeOrEqual = function (t) { + return e.isBeforeOrEqual(this, t); + }), + (e.isBeforeOrEqual = function (e, t) { + return e.lineNumber < t.lineNumber || (!(t.lineNumber < e.lineNumber) && e.column <= t.column); + }), + (e.compare = function (e, t) { + var n = 0 | e.lineNumber, + r = 0 | t.lineNumber; + if (n === r) { + return (0 | e.column) - (0 | t.column); + } + return n - r; + }), + (e.prototype.clone = function () { + return new e(this.lineNumber, this.column); + }), + (e.prototype.toString = function () { + return '(' + this.lineNumber + ',' + this.column + ')'; + }), + (e.lift = function (t) { + return new e(t.lineNumber, t.column); + }), + (e.isIPosition = function (e) { + return e && 'number' == typeof e.lineNumber && 'number' == typeof e.column; + }), + e + ); + })(); + t.Position = n; + }), + i(e[5], t([0, 1, 2]), function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + function e(e, t, n, r) { + e > n || (e === n && t > r) + ? ((this.startLineNumber = n), (this.startColumn = r), (this.endLineNumber = e), (this.endColumn = t)) + : ((this.startLineNumber = e), (this.startColumn = t), (this.endLineNumber = n), (this.endColumn = r)); + } + return ( + (e.prototype.isEmpty = function () { + return e.isEmpty(this); + }), + (e.isEmpty = function (e) { + return e.startLineNumber === e.endLineNumber && e.startColumn === e.endColumn; + }), + (e.prototype.containsPosition = function (t) { + return e.containsPosition(this, t); + }), + (e.containsPosition = function (e, t) { + return ( + !(t.lineNumber < e.startLineNumber || t.lineNumber > e.endLineNumber) && + !(t.lineNumber === e.startLineNumber && t.column < e.startColumn) && + !(t.lineNumber === e.endLineNumber && t.column > e.endColumn) + ); + }), + (e.prototype.containsRange = function (t) { + return e.containsRange(this, t); + }), + (e.containsRange = function (e, t) { + return ( + !(t.startLineNumber < e.startLineNumber || t.endLineNumber < e.startLineNumber) && + !(t.startLineNumber > e.endLineNumber || t.endLineNumber > e.endLineNumber) && + !(t.startLineNumber === e.startLineNumber && t.startColumn < e.startColumn) && + !(t.endLineNumber === e.endLineNumber && t.endColumn > e.endColumn) + ); + }), + (e.prototype.plusRange = function (t) { + return e.plusRange(this, t); + }), + (e.plusRange = function (t, n) { + var r, i, o, s; + return ( + n.startLineNumber < t.startLineNumber + ? ((r = n.startLineNumber), (i = n.startColumn)) + : n.startLineNumber === t.startLineNumber + ? ((r = n.startLineNumber), (i = Math.min(n.startColumn, t.startColumn))) + : ((r = t.startLineNumber), (i = t.startColumn)), + n.endLineNumber > t.endLineNumber + ? ((o = n.endLineNumber), (s = n.endColumn)) + : n.endLineNumber === t.endLineNumber + ? ((o = n.endLineNumber), (s = Math.max(n.endColumn, t.endColumn))) + : ((o = t.endLineNumber), (s = t.endColumn)), + new e(r, i, o, s) + ); + }), + (e.prototype.intersectRanges = function (t) { + return e.intersectRanges(this, t); + }), + (e.intersectRanges = function (t, n) { + var r = t.startLineNumber, + i = t.startColumn, + o = t.endLineNumber, + s = t.endColumn, + u = n.startLineNumber, + a = n.startColumn, + l = n.endLineNumber, + c = n.endColumn; + return ( + r < u ? ((r = u), (i = a)) : r === u && (i = Math.max(i, a)), + o > l ? ((o = l), (s = c)) : o === l && (s = Math.min(s, c)), + r > o ? null : r === o && i > s ? null : new e(r, i, o, s) + ); + }), + (e.prototype.equalsRange = function (t) { + return e.equalsRange(this, t); + }), + (e.equalsRange = function (e, t) { + return ( + !!e && + !!t && + e.startLineNumber === t.startLineNumber && + e.startColumn === t.startColumn && + e.endLineNumber === t.endLineNumber && + e.endColumn === t.endColumn + ); + }), + (e.prototype.getEndPosition = function () { + return new n.Position(this.endLineNumber, this.endColumn); + }), + (e.prototype.getStartPosition = function () { + return new n.Position(this.startLineNumber, this.startColumn); + }), + (e.prototype.toString = function () { + return ( + '[' + this.startLineNumber + ',' + this.startColumn + ' -> ' + this.endLineNumber + ',' + this.endColumn + ']' + ); + }), + (e.prototype.setEndPosition = function (t, n) { + return new e(this.startLineNumber, this.startColumn, t, n); + }), + (e.prototype.setStartPosition = function (t, n) { + return new e(t, n, this.endLineNumber, this.endColumn); + }), + (e.prototype.collapseToStart = function () { + return e.collapseToStart(this); + }), + (e.collapseToStart = function (t) { + return new e(t.startLineNumber, t.startColumn, t.startLineNumber, t.startColumn); + }), + (e.fromPositions = function (t, n) { + return void 0 === n && (n = t), new e(t.lineNumber, t.column, n.lineNumber, n.column); + }), + (e.lift = function (t) { + return t ? new e(t.startLineNumber, t.startColumn, t.endLineNumber, t.endColumn) : null; + }), + (e.isIRange = function (e) { + return ( + e && + 'number' == typeof e.startLineNumber && + 'number' == typeof e.startColumn && + 'number' == typeof e.endLineNumber && + 'number' == typeof e.endColumn + ); + }), + (e.areIntersectingOrTouching = function (e, t) { + return ( + !( + e.endLineNumber < t.startLineNumber || + (e.endLineNumber === t.startLineNumber && e.endColumn < t.startColumn) + ) && + !(t.endLineNumber < e.startLineNumber || (t.endLineNumber === e.startLineNumber && t.endColumn < e.startColumn)) + ); + }), + (e.areIntersecting = function (e, t) { + return ( + !( + e.endLineNumber < t.startLineNumber || + (e.endLineNumber === t.startLineNumber && e.endColumn <= t.startColumn) + ) && + !( + t.endLineNumber < e.startLineNumber || + (t.endLineNumber === e.startLineNumber && t.endColumn <= e.startColumn) + ) + ); + }), + (e.compareRangesUsingStarts = function (e, t) { + if (e && t) { + var n = 0 | e.startLineNumber, + r = 0 | t.startLineNumber; + if (n === r) { + var i = 0 | e.startColumn, + o = 0 | t.startColumn; + if (i === o) { + var s = 0 | e.endLineNumber, + u = 0 | t.endLineNumber; + if (s === u) { + return (0 | e.endColumn) - (0 | t.endColumn); + } + return s - u; + } + return i - o; + } + return n - r; + } + return (e ? 1 : 0) - (t ? 1 : 0); + }), + (e.compareRangesUsingEnds = function (e, t) { + return e.endLineNumber === t.endLineNumber + ? e.endColumn === t.endColumn + ? e.startLineNumber === t.startLineNumber + ? e.startColumn - t.startColumn + : e.startLineNumber - t.startLineNumber + : e.endColumn - t.endColumn + : e.endLineNumber - t.endLineNumber; + }), + (e.spansMultipleLines = function (e) { + return e.endLineNumber > e.startLineNumber; + }), + e + ); + })(); + t.Range = r; + }), + i(e[22], t([0, 1, 2, 5]), function (e, t, n, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = (function (e) { + function t(t, n, r, i) { + var o = e.call(this, t, n, r, i) || this; + return ( + (o.selectionStartLineNumber = t), + (o.selectionStartColumn = n), + (o.positionLineNumber = r), + (o.positionColumn = i), + o + ); + } + return ( + s(t, e), + (t.prototype.clone = function () { + return new t( + this.selectionStartLineNumber, + this.selectionStartColumn, + this.positionLineNumber, + this.positionColumn + ); + }), + (t.prototype.toString = function () { + return ( + '[' + + this.selectionStartLineNumber + + ',' + + this.selectionStartColumn + + ' -> ' + + this.positionLineNumber + + ',' + + this.positionColumn + + ']' + ); + }), + (t.prototype.equalsSelection = function (e) { + return t.selectionsEqual(this, e); + }), + (t.selectionsEqual = function (e, t) { + return ( + e.selectionStartLineNumber === t.selectionStartLineNumber && + e.selectionStartColumn === t.selectionStartColumn && + e.positionLineNumber === t.positionLineNumber && + e.positionColumn === t.positionColumn + ); + }), + (t.prototype.getDirection = function () { + return this.selectionStartLineNumber === this.startLineNumber && this.selectionStartColumn === this.startColumn + ? 0 + : 1; + }), + (t.prototype.setEndPosition = function (e, n) { + return 0 === this.getDirection() + ? new t(this.startLineNumber, this.startColumn, e, n) + : new t(e, n, this.startLineNumber, this.startColumn); + }), + (t.prototype.getPosition = function () { + return new n.Position(this.positionLineNumber, this.positionColumn); + }), + (t.prototype.setStartPosition = function (e, n) { + return 0 === this.getDirection() + ? new t(e, n, this.endLineNumber, this.endColumn) + : new t(this.endLineNumber, this.endColumn, e, n); + }), + (t.fromPositions = function (e, n) { + return void 0 === n && (n = e), new t(e.lineNumber, e.column, n.lineNumber, n.column); + }), + (t.liftSelection = function (e) { + return new t(e.selectionStartLineNumber, e.selectionStartColumn, e.positionLineNumber, e.positionColumn); + }), + (t.selectionsArrEqual = function (e, t) { + if ((e && !t) || (!e && t)) return !1; + if (!e && !t) return !0; + if (e.length !== t.length) return !1; + for (var n = 0, r = e.length; n < r; n++) if (!this.selectionsEqual(e[n], t[n])) return !1; + return !0; + }), + (t.isISelection = function (e) { + return ( + e && + 'number' == typeof e.selectionStartLineNumber && + 'number' == typeof e.selectionStartColumn && + 'number' == typeof e.positionLineNumber && + 'number' == typeof e.positionColumn + ); + }), + (t.createWithDirection = function (e, n, r, i, o) { + return 0 === o ? new t(e, n, r, i) : new t(r, i, e, n); + }), + t + ); + })(r.Range); + t.Selection = i; + }), + i(e[23], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var n = (function () { + function e(e, t, n) { + (this.offset = 0 | e), (this.type = t), (this.language = n); + } + return ( + (e.prototype.toString = function () { + return '(' + this.offset + ', ' + this.type + ')'; + }), + e + ); + })(); + t.Token = n; + var r = (function () { + return function (e, t) { + (this.tokens = e), (this.endState = t); + }; + })(); + t.TokenizationResult = r; + var i = (function () { + return function (e, t) { + (this.tokens = e), (this.endState = t); + }; + })(); + t.TokenizationResult2 = i; + }), + i(e[6], t([0, 1]), function (e, t) { + 'use strict'; + function n(e) { + return e < 0 ? 0 : e > 4294967295 ? 4294967295 : 0 | e; + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + function e(e, t, n) { + for (var r = new Uint8Array(e * t), i = 0, o = e * t; i < o; i++) r[i] = n; + (this._data = r), (this.rows = e), (this.cols = t); + } + return ( + (e.prototype.get = function (e, t) { + return this._data[e * this.cols + t]; + }), + (e.prototype.set = function (e, t, n) { + this._data[e * this.cols + t] = n; + }), + e + ); + })(); + (t.Uint8Matrix = r), + (t.toUint8 = function (e) { + return e < 0 ? 0 : e > 255 ? 255 : 0 | e; + }), + (t.toUint32 = n), + (t.toUint32Array = function (e) { + for (var t = e.length, r = new Uint32Array(t), i = 0; i < t; i++) r[i] = n(e[i]); + return r; + }); + }), + i(e[25], t([0, 1, 6]), function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + function e(t) { + var r = n.toUint8(t); + (this._defaultValue = r), (this._asciiMap = e._createAsciiMap(r)), (this._map = new Map()); + } + return ( + (e._createAsciiMap = function (e) { + for (var t = new Uint8Array(256), n = 0; n < 256; n++) t[n] = e; + return t; + }), + (e.prototype.set = function (e, t) { + var r = n.toUint8(t); + e >= 0 && e < 256 ? (this._asciiMap[e] = r) : this._map.set(e, r); + }), + (e.prototype.get = function (e) { + return e >= 0 && e < 256 ? this._asciiMap[e] : this._map.get(e) || this._defaultValue; + }), + e + ); + })(); + t.CharacterClassifier = r; + var i = (function () { + function e() { + this._actual = new r(0); + } + return ( + (e.prototype.add = function (e) { + this._actual.set(e, 1); + }), + (e.prototype.has = function (e) { + return 1 === this._actual.get(e); + }), + e + ); + })(); + t.CharacterSet = i; + }), + i(e[26], t([0, 1, 13, 17]), function (e, t, n, r) { + 'use strict'; + function i(e, t, r, i) { + return new n.LcsDiff(e, t, r).ComputeDiff(i); + } + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = 5e3, + s = 3, + u = (function () { + function e(t) { + for (var n = [], r = [], i = 0, o = t.length; i < o; i++) + (n[i] = e._getFirstNonBlankColumn(t[i], 1)), (r[i] = e._getLastNonBlankColumn(t[i], 1)); + (this._lines = t), (this._startColumns = n), (this._endColumns = r); + } + return ( + (e.prototype.getLength = function () { + return this._lines.length; + }), + (e.prototype.getElementAtIndex = function (e) { + return this._lines[e].substring(this._startColumns[e] - 1, this._endColumns[e] - 1); + }), + (e.prototype.getStartLineNumber = function (e) { + return e + 1; + }), + (e.prototype.getEndLineNumber = function (e) { + return e + 1; + }), + (e._getFirstNonBlankColumn = function (e, t) { + var n = r.firstNonWhitespaceIndex(e); + return -1 === n ? t : n + 1; + }), + (e._getLastNonBlankColumn = function (e, t) { + var n = r.lastNonWhitespaceIndex(e); + return -1 === n ? t : n + 2; + }), + (e.prototype.getCharSequence = function (e, t, n) { + for (var r = [], i = [], o = [], s = 0, u = t; u <= n; u++) + for ( + var l = this._lines[u], + c = e ? this._startColumns[u] : 1, + f = e ? this._endColumns[u] : l.length + 1, + d = c; + d < f; + d++ + ) + (r[s] = l.charCodeAt(d - 1)), (i[s] = u + 1), (o[s] = d), s++; + return new a(r, i, o); + }), + e + ); + })(), + a = (function () { + function e(e, t, n) { + (this._charCodes = e), (this._lineNumbers = t), (this._columns = n); + } + return ( + (e.prototype.getLength = function () { + return this._charCodes.length; + }), + (e.prototype.getElementAtIndex = function (e) { + return this._charCodes[e]; + }), + (e.prototype.getStartLineNumber = function (e) { + return this._lineNumbers[e]; + }), + (e.prototype.getStartColumn = function (e) { + return this._columns[e]; + }), + (e.prototype.getEndLineNumber = function (e) { + return this._lineNumbers[e]; + }), + (e.prototype.getEndColumn = function (e) { + return this._columns[e] + 1; + }), + e + ); + })(), + l = (function () { + function e(e, t, n, r, i, o, s, u) { + (this.originalStartLineNumber = e), + (this.originalStartColumn = t), + (this.originalEndLineNumber = n), + (this.originalEndColumn = r), + (this.modifiedStartLineNumber = i), + (this.modifiedStartColumn = o), + (this.modifiedEndLineNumber = s), + (this.modifiedEndColumn = u); + } + return ( + (e.createFromDiffChange = function (t, n, r) { + var i, o, s, u, a, l, c, f; + return ( + 0 === t.originalLength + ? ((i = 0), (o = 0), (s = 0), (u = 0)) + : ((i = n.getStartLineNumber(t.originalStart)), + (o = n.getStartColumn(t.originalStart)), + (s = n.getEndLineNumber(t.originalStart + t.originalLength - 1)), + (u = n.getEndColumn(t.originalStart + t.originalLength - 1))), + 0 === t.modifiedLength + ? ((a = 0), (l = 0), (c = 0), (f = 0)) + : ((a = r.getStartLineNumber(t.modifiedStart)), + (l = r.getStartColumn(t.modifiedStart)), + (c = r.getEndLineNumber(t.modifiedStart + t.modifiedLength - 1)), + (f = r.getEndColumn(t.modifiedStart + t.modifiedLength - 1))), + new e(i, o, s, u, a, l, c, f) + ); + }), + e + ); + })(), + c = (function () { + function e(e, t, n, r, i) { + (this.originalStartLineNumber = e), + (this.originalEndLineNumber = t), + (this.modifiedStartLineNumber = n), + (this.modifiedEndLineNumber = r), + (this.charChanges = i); + } + return ( + (e.createFromDiffResult = function (t, n, r, o, u, a, c) { + var f, + d, + h, + p, + m = void 0; + if ( + (0 === n.originalLength + ? ((f = r.getStartLineNumber(n.originalStart) - 1), (d = 0)) + : ((f = r.getStartLineNumber(n.originalStart)), + (d = r.getEndLineNumber(n.originalStart + n.originalLength - 1))), + 0 === n.modifiedLength + ? ((h = o.getStartLineNumber(n.modifiedStart) - 1), (p = 0)) + : ((h = o.getStartLineNumber(n.modifiedStart)), + (p = o.getEndLineNumber(n.modifiedStart + n.modifiedLength - 1))), + a && 0 !== n.originalLength && 0 !== n.modifiedLength && u()) + ) { + var g = r.getCharSequence(t, n.originalStart, n.originalStart + n.originalLength - 1), + _ = o.getCharSequence(t, n.modifiedStart, n.modifiedStart + n.modifiedLength - 1), + v = i(g, _, u, !0); + c && + (v = (function (e) { + if (e.length <= 1) return e; + for (var t = [e[0]], n = t[0], r = 1, i = e.length; r < i; r++) { + var o = e[r], + u = o.originalStart - (n.originalStart + n.originalLength), + a = o.modifiedStart - (n.modifiedStart + n.modifiedLength); + Math.min(u, a) < s + ? ((n.originalLength = o.originalStart + o.originalLength - n.originalStart), + (n.modifiedLength = o.modifiedStart + o.modifiedLength - n.modifiedStart)) + : (t.push(o), (n = o)); + } + return t; + })(v)), + (m = []); + for (var y = 0, b = v.length; y < b; y++) m.push(l.createFromDiffChange(v[y], g, _)); + } + return new e(f, d, h, p, m); + }), + e + ); + })(), + f = (function () { + function e(e, t, n) { + (this.shouldComputeCharChanges = n.shouldComputeCharChanges), + (this.shouldPostProcessCharChanges = n.shouldPostProcessCharChanges), + (this.shouldIgnoreTrimWhitespace = n.shouldIgnoreTrimWhitespace), + (this.shouldMakePrettyDiff = n.shouldMakePrettyDiff), + (this.maximumRunTimeMs = o), + (this.originalLines = e), + (this.modifiedLines = t), + (this.original = new u(e)), + (this.modified = new u(t)); + } + return ( + (e.prototype.computeDiff = function () { + if (1 === this.original.getLength() && 0 === this.original.getElementAtIndex(0).length) + return [ + { + originalStartLineNumber: 1, + originalEndLineNumber: 1, + modifiedStartLineNumber: 1, + modifiedEndLineNumber: this.modified.getLength(), + charChanges: [ + { + modifiedEndColumn: 0, + modifiedEndLineNumber: 0, + modifiedStartColumn: 0, + modifiedStartLineNumber: 0, + originalEndColumn: 0, + originalEndLineNumber: 0, + originalStartColumn: 0, + originalStartLineNumber: 0 + } + ] + } + ]; + if (1 === this.modified.getLength() && 0 === this.modified.getElementAtIndex(0).length) + return [ + { + originalStartLineNumber: 1, + originalEndLineNumber: this.original.getLength(), + modifiedStartLineNumber: 1, + modifiedEndLineNumber: 1, + charChanges: [ + { + modifiedEndColumn: 0, + modifiedEndLineNumber: 0, + modifiedStartColumn: 0, + modifiedStartLineNumber: 0, + originalEndColumn: 0, + originalEndLineNumber: 0, + originalStartColumn: 0, + originalStartLineNumber: 0 + } + ] + } + ]; + this.computationStartTime = new Date().getTime(); + var e = i( + this.original, + this.modified, + this._continueProcessingPredicate.bind(this), + this.shouldMakePrettyDiff + ); + if (this.shouldIgnoreTrimWhitespace) { + for (var t = [], n = 0, r = e.length; n < r; n++) + t.push( + c.createFromDiffResult( + this.shouldIgnoreTrimWhitespace, + e[n], + this.original, + this.modified, + this._continueProcessingPredicate.bind(this), + this.shouldComputeCharChanges, + this.shouldPostProcessCharChanges + ) + ); + return t; + } + for (var o = [], s = 0, a = 0, n = -1, l = e.length; n < l; n++) { + for ( + var f = n + 1 < l ? e[n + 1] : null, + d = f ? f.originalStart : this.originalLines.length, + h = f ? f.modifiedStart : this.modifiedLines.length; + s < d && a < h; + + ) { + var p = this.originalLines[s], + m = this.modifiedLines[a]; + if (p !== m) { + for ( + var g = u._getFirstNonBlankColumn(p, 1), _ = u._getFirstNonBlankColumn(m, 1); + g > 1 && _ > 1; + + ) { + if ((E = p.charCodeAt(g - 2)) !== (S = m.charCodeAt(_ - 2))) break; + g--, _--; + } + (g > 1 || _ > 1) && this._pushTrimWhitespaceCharChange(o, s + 1, 1, g, a + 1, 1, _); + for ( + var v = u._getLastNonBlankColumn(p, 1), + y = u._getLastNonBlankColumn(m, 1), + b = p.length + 1, + C = m.length + 1; + v < b && y < C; + + ) { + var E = p.charCodeAt(v - 1), + S = p.charCodeAt(y - 1); + if (E !== S) break; + v++, y++; + } + (v < b || y < C) && this._pushTrimWhitespaceCharChange(o, s + 1, v, b, a + 1, y, C); + } + s++, a++; + } + f && + (o.push( + c.createFromDiffResult( + this.shouldIgnoreTrimWhitespace, + f, + this.original, + this.modified, + this._continueProcessingPredicate.bind(this), + this.shouldComputeCharChanges, + this.shouldPostProcessCharChanges + ) + ), + (s += f.originalLength), + (a += f.modifiedLength)); + } + return o; + }), + (e.prototype._pushTrimWhitespaceCharChange = function (e, t, n, r, i, o, s) { + if (!this._mergeTrimWhitespaceCharChange(e, t, n, r, i, o, s)) { + var u = void 0; + this.shouldComputeCharChanges && (u = [new l(t, n, t, r, i, o, i, s)]), e.push(new c(t, t, i, i, u)); + } + }), + (e.prototype._mergeTrimWhitespaceCharChange = function (e, t, n, r, i, o, s) { + var u = e.length; + if (0 === u) return !1; + var a = e[u - 1]; + return ( + 0 !== a.originalEndLineNumber && + 0 !== a.modifiedEndLineNumber && + a.originalEndLineNumber + 1 === t && + a.modifiedEndLineNumber + 1 === i && + ((a.originalEndLineNumber = t), + (a.modifiedEndLineNumber = i), + this.shouldComputeCharChanges && a.charChanges.push(new l(t, n, t, r, i, o, i, s)), + !0) + ); + }), + (e.prototype._continueProcessingPredicate = function () { + if (0 === this.maximumRunTimeMs) return !0; + return new Date().getTime() - this.computationStartTime < this.maximumRunTimeMs; + }), + e + ); + })(); + t.DiffComputer = f; + }), + i(e[27], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.USUAL_WORD_SEPARATORS = '`~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?'), + (t.DEFAULT_WORD_REGEXP = (function (e) { + void 0 === e && (e = ''); + for (var n = '(-?\\d*\\.\\d\\w*)|([^', r = 0; r < t.USUAL_WORD_SEPARATORS.length; r++) + e.indexOf(t.USUAL_WORD_SEPARATORS[r]) >= 0 || (n += '\\' + t.USUAL_WORD_SEPARATORS[r]); + return (n += '\\s]+)'), new RegExp(n, 'g'); + })()), + (t.ensureValidWordDefinition = function (e) { + var n = t.DEFAULT_WORD_REGEXP; + if (e && e instanceof RegExp) + if (e.global) n = e; + else { + var r = 'g'; + e.ignoreCase && (r += 'i'), e.multiline && (r += 'm'), (n = new RegExp(e.source, r)); + } + return (n.lastIndex = 0), n; + }), + (t.getWordAtText = function (e, t, n, r) { + t.lastIndex = 0; + var i = t.exec(n); + if (!i) return null; + var o = + i[0].indexOf(' ') >= 0 + ? (function (e, t, n, r) { + var i = e - 1 - r; + t.lastIndex = 0; + for (var o; (o = t.exec(n)); ) { + var s = o.index || 0; + if (s > i) return null; + if (t.lastIndex >= i) return { word: o[0], startColumn: r + 1 + s, endColumn: r + 1 + t.lastIndex }; + } + return null; + })(e, t, n, r) + : (function (e, t, n, r) { + var i = e - 1 - r, + o = n.lastIndexOf(' ', i - 1) + 1, + s = n.indexOf(' ', i); + -1 === s && (s = n.length), (t.lastIndex = o); + for (var u; (u = t.exec(n)); ) { + var a = u.index || 0; + if (a <= i && t.lastIndex >= i) + return { word: u[0], startColumn: r + 1 + a, endColumn: r + 1 + t.lastIndex }; + } + return null; + })(e, t, n, r); + return (t.lastIndex = 0), o; + }); + }), + i(e[28], t([0, 1, 25, 6]), function (e, t, n, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = (function () { + function e(e) { + for (var t = 0, n = 0, i = 0, o = e.length; i < o; i++) { + var s = e[i], + u = s[0], + a = s[1], + l = s[2]; + a > t && (t = a), u > n && (n = u), l > n && (n = l); + } + t++, n++; + for (var c = new r.Uint8Matrix(n, t, 0), i = 0, o = e.length; i < o; i++) { + var f = e[i], + u = f[0], + a = f[1], + l = f[2]; + c.set(u, a, l); + } + (this._states = c), (this._maxCharCode = t); + } + return ( + (e.prototype.nextState = function (e, t) { + return t < 0 || t >= this._maxCharCode ? 0 : this._states.get(e, t); + }), + e + ); + })(), + o = null, + s = null, + u = (function () { + function e() {} + return ( + (e._createLink = function (e, t, n, r, i) { + var o = i - 1; + do { + var s = t.charCodeAt(o); + if (2 !== e.get(s)) break; + o--; + } while (o > r); + if (r > 0) { + var u = t.charCodeAt(r - 1), + a = t.charCodeAt(o); + ((40 === u && 41 === a) || (91 === u && 93 === a) || (123 === u && 125 === a)) && o--; + } + return { + range: { startLineNumber: n, startColumn: r + 1, endLineNumber: n, endColumn: o + 2 }, + url: t.substring(r, o + 1) + }; + }), + (e.computeLinks = function (t) { + for ( + var r = + (null === o && + (o = new i([ + [1, 104, 2], + [1, 72, 2], + [1, 102, 6], + [1, 70, 6], + [2, 116, 3], + [2, 84, 3], + [3, 116, 4], + [3, 84, 4], + [4, 112, 5], + [4, 80, 5], + [5, 115, 9], + [5, 83, 9], + [5, 58, 10], + [6, 105, 7], + [6, 73, 7], + [7, 108, 8], + [7, 76, 8], + [8, 101, 9], + [8, 69, 9], + [9, 58, 10], + [10, 47, 11], + [11, 47, 12] + ])), + o), + u = (function () { + if (null === s) { + for ( + s = new n.CharacterClassifier(0), e = 0; + e < + ' \t<>\'"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…' + .length; + e++ + ) + s.set( + ' \t<>\'"、。。、,.:;?!@#$%&*‘“〈《「『【〔([{「」}])〕】』」》〉”’`~…'.charCodeAt( + e + ), + 1 + ); + for (var e = 0; e < '.,;'.length; e++) s.set('.,;'.charCodeAt(e), 2); + } + return s; + })(), + a = [], + l = 1, + c = t.getLineCount(); + l <= c; + l++ + ) { + for ( + var f = t.getLineContent(l), d = f.length, h = 0, p = 0, m = 0, g = 1, _ = !1, v = !1, y = !1; + h < d; + + ) { + var b = !1, + C = f.charCodeAt(h); + if (13 === g) { + E = void 0; + switch (C) { + case 40: + (_ = !0), (E = 0); + break; + case 41: + E = _ ? 0 : 1; + break; + case 91: + (v = !0), (E = 0); + break; + case 93: + E = v ? 0 : 1; + break; + case 123: + (y = !0), (E = 0); + break; + case 125: + E = y ? 0 : 1; + break; + case 39: + E = 34 === m || 96 === m ? 0 : 1; + break; + case 34: + E = 39 === m || 96 === m ? 0 : 1; + break; + case 96: + E = 39 === m || 34 === m ? 0 : 1; + break; + default: + E = u.get(C); + } + 1 === E && (a.push(e._createLink(u, f, l, p, h)), (b = !0)); + } else if (12 === g) { + var E; + 1 === (E = u.get(C)) ? (b = !0) : (g = 13); + } else 0 === (g = r.nextState(g, C)) && (b = !0); + b && ((g = 1), (_ = !1), (v = !1), (y = !1), (p = h + 1), (m = C)), h++; + } + 13 === g && a.push(e._createLink(u, f, l, p, d)); + } + return a; + }), + e + ); + })(); + t.computeLinks = function (e) { + return e && 'function' == typeof e.getLineCount && 'function' == typeof e.getLineContent ? u.computeLinks(e) : []; + }; + }), + i(e[29], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var n = (function () { + function e() { + this._defaultValueSet = [ + ['true', 'false'], + ['True', 'False'], + ['Private', 'Public', 'Friend', 'ReadOnly', 'Partial', 'Protected', 'WriteOnly'], + ['public', 'protected', 'private'] + ]; + } + return ( + (e.prototype.navigateValueSet = function (e, t, n, r, i) { + if (e && t) { + if ((o = this.doNavigateValueSet(t, i))) return { range: e, value: o }; + } + if (n && r) { + var o = this.doNavigateValueSet(r, i); + if (o) return { range: n, value: o }; + } + return null; + }), + (e.prototype.doNavigateValueSet = function (e, t) { + var n = this.numberReplace(e, t); + return null !== n ? n : this.textReplace(e, t); + }), + (e.prototype.numberReplace = function (e, t) { + var n = Math.pow(10, e.length - (e.lastIndexOf('.') + 1)), + r = Number(e), + i = parseFloat(e); + return isNaN(r) || isNaN(i) || r !== i + ? null + : 0 !== r || t + ? ((r = Math.floor(r * n)), (r += t ? n : -n), String(r / n)) + : null; + }), + (e.prototype.textReplace = function (e, t) { + return this.valueSetsReplace(this._defaultValueSet, e, t); + }), + (e.prototype.valueSetsReplace = function (e, t, n) { + for (var r = null, i = 0, o = e.length; null === r && i < o; i++) r = this.valueSetReplace(e[i], t, n); + return r; + }), + (e.prototype.valueSetReplace = function (e, t, n) { + var r = e.indexOf(t); + return r >= 0 ? ((r += n ? 1 : -1) < 0 ? (r = e.length - 1) : (r %= e.length), e[r]) : null; + }), + (e.INSTANCE = new e()), + e + ); + })(); + t.BasicInplaceReplace = n; + }), + i(e[30], t([0, 1]), function (e, t) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + !(function (e) { + e[(e.Unnecessary = 1)] = 'Unnecessary'; + })(t.MarkerTag || (t.MarkerTag = {})); + !(function (e) { + (e[(e.Hint = 1)] = 'Hint'), (e[(e.Info = 2)] = 'Info'), (e[(e.Warning = 4)] = 'Warning'), (e[(e.Error = 8)] = 'Error'); + })(t.MarkerSeverity || (t.MarkerSeverity = {})); + !(function (e) { + (e[(e.Unknown = 0)] = 'Unknown'), + (e[(e.Backspace = 1)] = 'Backspace'), + (e[(e.Tab = 2)] = 'Tab'), + (e[(e.Enter = 3)] = 'Enter'), + (e[(e.Shift = 4)] = 'Shift'), + (e[(e.Ctrl = 5)] = 'Ctrl'), + (e[(e.Alt = 6)] = 'Alt'), + (e[(e.PauseBreak = 7)] = 'PauseBreak'), + (e[(e.CapsLock = 8)] = 'CapsLock'), + (e[(e.Escape = 9)] = 'Escape'), + (e[(e.Space = 10)] = 'Space'), + (e[(e.PageUp = 11)] = 'PageUp'), + (e[(e.PageDown = 12)] = 'PageDown'), + (e[(e.End = 13)] = 'End'), + (e[(e.Home = 14)] = 'Home'), + (e[(e.LeftArrow = 15)] = 'LeftArrow'), + (e[(e.UpArrow = 16)] = 'UpArrow'), + (e[(e.RightArrow = 17)] = 'RightArrow'), + (e[(e.DownArrow = 18)] = 'DownArrow'), + (e[(e.Insert = 19)] = 'Insert'), + (e[(e.Delete = 20)] = 'Delete'), + (e[(e.KEY_0 = 21)] = 'KEY_0'), + (e[(e.KEY_1 = 22)] = 'KEY_1'), + (e[(e.KEY_2 = 23)] = 'KEY_2'), + (e[(e.KEY_3 = 24)] = 'KEY_3'), + (e[(e.KEY_4 = 25)] = 'KEY_4'), + (e[(e.KEY_5 = 26)] = 'KEY_5'), + (e[(e.KEY_6 = 27)] = 'KEY_6'), + (e[(e.KEY_7 = 28)] = 'KEY_7'), + (e[(e.KEY_8 = 29)] = 'KEY_8'), + (e[(e.KEY_9 = 30)] = 'KEY_9'), + (e[(e.KEY_A = 31)] = 'KEY_A'), + (e[(e.KEY_B = 32)] = 'KEY_B'), + (e[(e.KEY_C = 33)] = 'KEY_C'), + (e[(e.KEY_D = 34)] = 'KEY_D'), + (e[(e.KEY_E = 35)] = 'KEY_E'), + (e[(e.KEY_F = 36)] = 'KEY_F'), + (e[(e.KEY_G = 37)] = 'KEY_G'), + (e[(e.KEY_H = 38)] = 'KEY_H'), + (e[(e.KEY_I = 39)] = 'KEY_I'), + (e[(e.KEY_J = 40)] = 'KEY_J'), + (e[(e.KEY_K = 41)] = 'KEY_K'), + (e[(e.KEY_L = 42)] = 'KEY_L'), + (e[(e.KEY_M = 43)] = 'KEY_M'), + (e[(e.KEY_N = 44)] = 'KEY_N'), + (e[(e.KEY_O = 45)] = 'KEY_O'), + (e[(e.KEY_P = 46)] = 'KEY_P'), + (e[(e.KEY_Q = 47)] = 'KEY_Q'), + (e[(e.KEY_R = 48)] = 'KEY_R'), + (e[(e.KEY_S = 49)] = 'KEY_S'), + (e[(e.KEY_T = 50)] = 'KEY_T'), + (e[(e.KEY_U = 51)] = 'KEY_U'), + (e[(e.KEY_V = 52)] = 'KEY_V'), + (e[(e.KEY_W = 53)] = 'KEY_W'), + (e[(e.KEY_X = 54)] = 'KEY_X'), + (e[(e.KEY_Y = 55)] = 'KEY_Y'), + (e[(e.KEY_Z = 56)] = 'KEY_Z'), + (e[(e.Meta = 57)] = 'Meta'), + (e[(e.ContextMenu = 58)] = 'ContextMenu'), + (e[(e.F1 = 59)] = 'F1'), + (e[(e.F2 = 60)] = 'F2'), + (e[(e.F3 = 61)] = 'F3'), + (e[(e.F4 = 62)] = 'F4'), + (e[(e.F5 = 63)] = 'F5'), + (e[(e.F6 = 64)] = 'F6'), + (e[(e.F7 = 65)] = 'F7'), + (e[(e.F8 = 66)] = 'F8'), + (e[(e.F9 = 67)] = 'F9'), + (e[(e.F10 = 68)] = 'F10'), + (e[(e.F11 = 69)] = 'F11'), + (e[(e.F12 = 70)] = 'F12'), + (e[(e.F13 = 71)] = 'F13'), + (e[(e.F14 = 72)] = 'F14'), + (e[(e.F15 = 73)] = 'F15'), + (e[(e.F16 = 74)] = 'F16'), + (e[(e.F17 = 75)] = 'F17'), + (e[(e.F18 = 76)] = 'F18'), + (e[(e.F19 = 77)] = 'F19'), + (e[(e.NumLock = 78)] = 'NumLock'), + (e[(e.ScrollLock = 79)] = 'ScrollLock'), + (e[(e.US_SEMICOLON = 80)] = 'US_SEMICOLON'), + (e[(e.US_EQUAL = 81)] = 'US_EQUAL'), + (e[(e.US_COMMA = 82)] = 'US_COMMA'), + (e[(e.US_MINUS = 83)] = 'US_MINUS'), + (e[(e.US_DOT = 84)] = 'US_DOT'), + (e[(e.US_SLASH = 85)] = 'US_SLASH'), + (e[(e.US_BACKTICK = 86)] = 'US_BACKTICK'), + (e[(e.US_OPEN_SQUARE_BRACKET = 87)] = 'US_OPEN_SQUARE_BRACKET'), + (e[(e.US_BACKSLASH = 88)] = 'US_BACKSLASH'), + (e[(e.US_CLOSE_SQUARE_BRACKET = 89)] = 'US_CLOSE_SQUARE_BRACKET'), + (e[(e.US_QUOTE = 90)] = 'US_QUOTE'), + (e[(e.OEM_8 = 91)] = 'OEM_8'), + (e[(e.OEM_102 = 92)] = 'OEM_102'), + (e[(e.NUMPAD_0 = 93)] = 'NUMPAD_0'), + (e[(e.NUMPAD_1 = 94)] = 'NUMPAD_1'), + (e[(e.NUMPAD_2 = 95)] = 'NUMPAD_2'), + (e[(e.NUMPAD_3 = 96)] = 'NUMPAD_3'), + (e[(e.NUMPAD_4 = 97)] = 'NUMPAD_4'), + (e[(e.NUMPAD_5 = 98)] = 'NUMPAD_5'), + (e[(e.NUMPAD_6 = 99)] = 'NUMPAD_6'), + (e[(e.NUMPAD_7 = 100)] = 'NUMPAD_7'), + (e[(e.NUMPAD_8 = 101)] = 'NUMPAD_8'), + (e[(e.NUMPAD_9 = 102)] = 'NUMPAD_9'), + (e[(e.NUMPAD_MULTIPLY = 103)] = 'NUMPAD_MULTIPLY'), + (e[(e.NUMPAD_ADD = 104)] = 'NUMPAD_ADD'), + (e[(e.NUMPAD_SEPARATOR = 105)] = 'NUMPAD_SEPARATOR'), + (e[(e.NUMPAD_SUBTRACT = 106)] = 'NUMPAD_SUBTRACT'), + (e[(e.NUMPAD_DECIMAL = 107)] = 'NUMPAD_DECIMAL'), + (e[(e.NUMPAD_DIVIDE = 108)] = 'NUMPAD_DIVIDE'), + (e[(e.KEY_IN_COMPOSITION = 109)] = 'KEY_IN_COMPOSITION'), + (e[(e.ABNT_C1 = 110)] = 'ABNT_C1'), + (e[(e.ABNT_C2 = 111)] = 'ABNT_C2'), + (e[(e.MAX_VALUE = 112)] = 'MAX_VALUE'); + })(t.KeyCode || (t.KeyCode = {})); + !(function (e) { + (e[(e.LTR = 0)] = 'LTR'), (e[(e.RTL = 1)] = 'RTL'); + })(t.SelectionDirection || (t.SelectionDirection = {})); + !(function (e) { + (e[(e.Auto = 1)] = 'Auto'), (e[(e.Hidden = 2)] = 'Hidden'), (e[(e.Visible = 3)] = 'Visible'); + })(t.ScrollbarVisibility || (t.ScrollbarVisibility = {})); + !(function (e) { + (e[(e.Left = 1)] = 'Left'), (e[(e.Center = 2)] = 'Center'), (e[(e.Right = 4)] = 'Right'), (e[(e.Full = 7)] = 'Full'); + })(t.OverviewRulerLane || (t.OverviewRulerLane = {})); + !(function (e) { + (e[(e.TextDefined = 0)] = 'TextDefined'), (e[(e.LF = 1)] = 'LF'), (e[(e.CRLF = 2)] = 'CRLF'); + })(t.EndOfLinePreference || (t.EndOfLinePreference = {})); + !(function (e) { + (e[(e.LF = 1)] = 'LF'), (e[(e.CRLF = 2)] = 'CRLF'); + })(t.DefaultEndOfLine || (t.DefaultEndOfLine = {})); + !(function (e) { + (e[(e.LF = 0)] = 'LF'), (e[(e.CRLF = 1)] = 'CRLF'); + })(t.EndOfLineSequence || (t.EndOfLineSequence = {})); + !(function (e) { + (e[(e.AlwaysGrowsWhenTypingAtEdges = 0)] = 'AlwaysGrowsWhenTypingAtEdges'), + (e[(e.NeverGrowsWhenTypingAtEdges = 1)] = 'NeverGrowsWhenTypingAtEdges'), + (e[(e.GrowsOnlyWhenTypingBefore = 2)] = 'GrowsOnlyWhenTypingBefore'), + (e[(e.GrowsOnlyWhenTypingAfter = 3)] = 'GrowsOnlyWhenTypingAfter'); + })(t.TrackedRangeStickiness || (t.TrackedRangeStickiness = {})); + !(function (e) { + (e[(e.Smooth = 0)] = 'Smooth'), (e[(e.Immediate = 1)] = 'Immediate'); + })(t.ScrollType || (t.ScrollType = {})); + !(function (e) { + (e[(e.NotSet = 0)] = 'NotSet'), + (e[(e.ContentFlush = 1)] = 'ContentFlush'), + (e[(e.RecoverFromMarkers = 2)] = 'RecoverFromMarkers'), + (e[(e.Explicit = 3)] = 'Explicit'), + (e[(e.Paste = 4)] = 'Paste'), + (e[(e.Undo = 5)] = 'Undo'), + (e[(e.Redo = 6)] = 'Redo'); + })(t.CursorChangeReason || (t.CursorChangeReason = {})); + !(function (e) { + (e[(e.None = 0)] = 'None'), + (e[(e.Small = 1)] = 'Small'), + (e[(e.Large = 2)] = 'Large'), + (e[(e.SmallBlocks = 3)] = 'SmallBlocks'), + (e[(e.LargeBlocks = 4)] = 'LargeBlocks'); + })(t.RenderMinimap || (t.RenderMinimap = {})); + !(function (e) { + (e[(e.None = 0)] = 'None'), + (e[(e.Same = 1)] = 'Same'), + (e[(e.Indent = 2)] = 'Indent'), + (e[(e.DeepIndent = 3)] = 'DeepIndent'); + })(t.WrappingIndent || (t.WrappingIndent = {})); + !(function (e) { + (e[(e.Hidden = 0)] = 'Hidden'), + (e[(e.Blink = 1)] = 'Blink'), + (e[(e.Smooth = 2)] = 'Smooth'), + (e[(e.Phase = 3)] = 'Phase'), + (e[(e.Expand = 4)] = 'Expand'), + (e[(e.Solid = 5)] = 'Solid'); + })(t.TextEditorCursorBlinkingStyle || (t.TextEditorCursorBlinkingStyle = {})); + !(function (e) { + (e[(e.Line = 1)] = 'Line'), + (e[(e.Block = 2)] = 'Block'), + (e[(e.Underline = 3)] = 'Underline'), + (e[(e.LineThin = 4)] = 'LineThin'), + (e[(e.BlockOutline = 5)] = 'BlockOutline'), + (e[(e.UnderlineThin = 6)] = 'UnderlineThin'); + })(t.TextEditorCursorStyle || (t.TextEditorCursorStyle = {})); + !(function (e) { + (e[(e.Off = 0)] = 'Off'), + (e[(e.On = 1)] = 'On'), + (e[(e.Relative = 2)] = 'Relative'), + (e[(e.Interval = 3)] = 'Interval'), + (e[(e.Custom = 4)] = 'Custom'); + })(t.RenderLineNumbersType || (t.RenderLineNumbersType = {})); + !(function (e) { + (e[(e.EXACT = 0)] = 'EXACT'), (e[(e.ABOVE = 1)] = 'ABOVE'), (e[(e.BELOW = 2)] = 'BELOW'); + })(t.ContentWidgetPositionPreference || (t.ContentWidgetPositionPreference = {})); + !(function (e) { + (e[(e.TOP_RIGHT_CORNER = 0)] = 'TOP_RIGHT_CORNER'), + (e[(e.BOTTOM_RIGHT_CORNER = 1)] = 'BOTTOM_RIGHT_CORNER'), + (e[(e.TOP_CENTER = 2)] = 'TOP_CENTER'); + })(t.OverlayWidgetPositionPreference || (t.OverlayWidgetPositionPreference = {})); + !(function (e) { + (e[(e.UNKNOWN = 0)] = 'UNKNOWN'), + (e[(e.TEXTAREA = 1)] = 'TEXTAREA'), + (e[(e.GUTTER_GLYPH_MARGIN = 2)] = 'GUTTER_GLYPH_MARGIN'), + (e[(e.GUTTER_LINE_NUMBERS = 3)] = 'GUTTER_LINE_NUMBERS'), + (e[(e.GUTTER_LINE_DECORATIONS = 4)] = 'GUTTER_LINE_DECORATIONS'), + (e[(e.GUTTER_VIEW_ZONE = 5)] = 'GUTTER_VIEW_ZONE'), + (e[(e.CONTENT_TEXT = 6)] = 'CONTENT_TEXT'), + (e[(e.CONTENT_EMPTY = 7)] = 'CONTENT_EMPTY'), + (e[(e.CONTENT_VIEW_ZONE = 8)] = 'CONTENT_VIEW_ZONE'), + (e[(e.CONTENT_WIDGET = 9)] = 'CONTENT_WIDGET'), + (e[(e.OVERVIEW_RULER = 10)] = 'OVERVIEW_RULER'), + (e[(e.SCROLLBAR = 11)] = 'SCROLLBAR'), + (e[(e.OVERLAY_WIDGET = 12)] = 'OVERLAY_WIDGET'), + (e[(e.OUTSIDE_EDITOR = 13)] = 'OUTSIDE_EDITOR'); + })(t.MouseTargetType || (t.MouseTargetType = {})); + !(function (e) { + (e[(e.None = 0)] = 'None'), + (e[(e.Indent = 1)] = 'Indent'), + (e[(e.IndentOutdent = 2)] = 'IndentOutdent'), + (e[(e.Outdent = 3)] = 'Outdent'); + })(t.IndentAction || (t.IndentAction = {})); + !(function (e) { + (e[(e.Method = 0)] = 'Method'), + (e[(e.Function = 1)] = 'Function'), + (e[(e.Constructor = 2)] = 'Constructor'), + (e[(e.Field = 3)] = 'Field'), + (e[(e.Variable = 4)] = 'Variable'), + (e[(e.Class = 5)] = 'Class'), + (e[(e.Struct = 6)] = 'Struct'), + (e[(e.Interface = 7)] = 'Interface'), + (e[(e.Module = 8)] = 'Module'), + (e[(e.Property = 9)] = 'Property'), + (e[(e.Event = 10)] = 'Event'), + (e[(e.Operator = 11)] = 'Operator'), + (e[(e.Unit = 12)] = 'Unit'), + (e[(e.Value = 13)] = 'Value'), + (e[(e.Constant = 14)] = 'Constant'), + (e[(e.Enum = 15)] = 'Enum'), + (e[(e.EnumMember = 16)] = 'EnumMember'), + (e[(e.Keyword = 17)] = 'Keyword'), + (e[(e.Text = 18)] = 'Text'), + (e[(e.Color = 19)] = 'Color'), + (e[(e.File = 20)] = 'File'), + (e[(e.Reference = 21)] = 'Reference'), + (e[(e.Customcolor = 22)] = 'Customcolor'), + (e[(e.Folder = 23)] = 'Folder'), + (e[(e.TypeParameter = 24)] = 'TypeParameter'), + (e[(e.Snippet = 25)] = 'Snippet'); + })(t.CompletionItemKind || (t.CompletionItemKind = {})); + !(function (e) { + (e[(e.KeepWhitespace = 1)] = 'KeepWhitespace'), (e[(e.InsertAsSnippet = 4)] = 'InsertAsSnippet'); + })(t.CompletionItemInsertTextRule || (t.CompletionItemInsertTextRule = {})); + !(function (e) { + (e[(e.Invoke = 0)] = 'Invoke'), + (e[(e.TriggerCharacter = 1)] = 'TriggerCharacter'), + (e[(e.TriggerForIncompleteCompletions = 2)] = 'TriggerForIncompleteCompletions'); + })(t.CompletionTriggerKind || (t.CompletionTriggerKind = {})); + !(function (e) { + (e[(e.Invoke = 1)] = 'Invoke'), + (e[(e.TriggerCharacter = 2)] = 'TriggerCharacter'), + (e[(e.ContentChange = 3)] = 'ContentChange'); + })(t.SignatureHelpTriggerReason || (t.SignatureHelpTriggerReason = {})); + !(function (e) { + (e[(e.Text = 0)] = 'Text'), (e[(e.Read = 1)] = 'Read'), (e[(e.Write = 2)] = 'Write'); + })(t.DocumentHighlightKind || (t.DocumentHighlightKind = {})); + !(function (e) { + (e[(e.File = 0)] = 'File'), + (e[(e.Module = 1)] = 'Module'), + (e[(e.Namespace = 2)] = 'Namespace'), + (e[(e.Package = 3)] = 'Package'), + (e[(e.Class = 4)] = 'Class'), + (e[(e.Method = 5)] = 'Method'), + (e[(e.Property = 6)] = 'Property'), + (e[(e.Field = 7)] = 'Field'), + (e[(e.Constructor = 8)] = 'Constructor'), + (e[(e.Enum = 9)] = 'Enum'), + (e[(e.Interface = 10)] = 'Interface'), + (e[(e.Function = 11)] = 'Function'), + (e[(e.Variable = 12)] = 'Variable'), + (e[(e.Constant = 13)] = 'Constant'), + (e[(e.String = 14)] = 'String'), + (e[(e.Number = 15)] = 'Number'), + (e[(e.Boolean = 16)] = 'Boolean'), + (e[(e.Array = 17)] = 'Array'), + (e[(e.Object = 18)] = 'Object'), + (e[(e.Key = 19)] = 'Key'), + (e[(e.Null = 20)] = 'Null'), + (e[(e.EnumMember = 21)] = 'EnumMember'), + (e[(e.Struct = 22)] = 'Struct'), + (e[(e.Event = 23)] = 'Event'), + (e[(e.Operator = 24)] = 'Operator'), + (e[(e.TypeParameter = 25)] = 'TypeParameter'); + })(t.SymbolKind || (t.SymbolKind = {})); + }), + i(e[31], t([0, 1, 10, 9, 21, 11, 8, 2, 5, 22, 23, 30]), function (e, t, n, r, i, o, s, u, a, l, c, f) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var d = (function () { + function e() {} + return ( + (e.chord = function (e, t) { + return i.KeyChord(e, t); + }), + (e.CtrlCmd = 2048), + (e.Shift = 1024), + (e.Alt = 512), + (e.WinCtrl = 256), + e + ); + })(); + (t.KeyMod = d), + (t.createMonacoBaseAPI = function () { + return { + editor: void 0, + languages: void 0, + CancellationTokenSource: n.CancellationTokenSource, + Emitter: r.Emitter, + KeyCode: f.KeyCode, + KeyMod: d, + Position: u.Position, + Range: a.Range, + Selection: l.Selection, + SelectionDirection: f.SelectionDirection, + MarkerSeverity: f.MarkerSeverity, + MarkerTag: f.MarkerTag, + Promise: s.TPromise, + Uri: o.URI, + Token: c.Token + }; + }); + }), + i(e[32], t([0, 1, 6]), function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = (function () { + return function (e, t) { + (this.index = e), (this.remainder = t); + }; + })(); + t.PrefixSumIndexOfResult = r; + var i = (function () { + function e(e) { + (this.values = e), + (this.prefixSum = new Uint32Array(e.length)), + (this.prefixSumValidIndex = new Int32Array(1)), + (this.prefixSumValidIndex[0] = -1); + } + return ( + (e.prototype.getCount = function () { + return this.values.length; + }), + (e.prototype.insertValues = function (e, t) { + e = n.toUint32(e); + var r = this.values, + i = this.prefixSum, + o = t.length; + return ( + 0 !== o && + ((this.values = new Uint32Array(r.length + o)), + this.values.set(r.subarray(0, e), 0), + this.values.set(r.subarray(e), e + o), + this.values.set(t, e), + e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), + (this.prefixSum = new Uint32Array(this.values.length)), + this.prefixSumValidIndex[0] >= 0 && this.prefixSum.set(i.subarray(0, this.prefixSumValidIndex[0] + 1)), + !0) + ); + }), + (e.prototype.changeValue = function (e, t) { + return ( + (e = n.toUint32(e)), + (t = n.toUint32(t)), + this.values[e] !== t && + ((this.values[e] = t), e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), !0) + ); + }), + (e.prototype.removeValues = function (e, t) { + (e = n.toUint32(e)), (t = n.toUint32(t)); + var r = this.values, + i = this.prefixSum; + if (e >= r.length) return !1; + var o = r.length - e; + return ( + t >= o && (t = o), + 0 !== t && + ((this.values = new Uint32Array(r.length - t)), + this.values.set(r.subarray(0, e), 0), + this.values.set(r.subarray(e + t), e), + (this.prefixSum = new Uint32Array(this.values.length)), + e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), + this.prefixSumValidIndex[0] >= 0 && this.prefixSum.set(i.subarray(0, this.prefixSumValidIndex[0] + 1)), + !0) + ); + }), + (e.prototype.getTotalValue = function () { + return 0 === this.values.length ? 0 : this._getAccumulatedValue(this.values.length - 1); + }), + (e.prototype.getAccumulatedValue = function (e) { + return e < 0 ? 0 : ((e = n.toUint32(e)), this._getAccumulatedValue(e)); + }), + (e.prototype._getAccumulatedValue = function (e) { + if (e <= this.prefixSumValidIndex[0]) return this.prefixSum[e]; + var t = this.prefixSumValidIndex[0] + 1; + 0 === t && ((this.prefixSum[0] = this.values[0]), t++), e >= this.values.length && (e = this.values.length - 1); + for (var n = t; n <= e; n++) this.prefixSum[n] = this.prefixSum[n - 1] + this.values[n]; + return (this.prefixSumValidIndex[0] = Math.max(this.prefixSumValidIndex[0], e)), this.prefixSum[e]; + }), + (e.prototype.getIndexOf = function (e) { + (e = Math.floor(e)), this.getTotalValue(); + for (var t = 0, n = this.values.length - 1, i = 0, o = 0, s = 0; t <= n; ) + if (((i = (t + (n - t) / 2) | 0), (o = this.prefixSum[i]), (s = o - this.values[i]), e < s)) n = i - 1; + else { + if (!(e >= o)) break; + t = i + 1; + } + return new r(i, e - s); + }), + e + ); + })(); + t.PrefixSumComputer = i; + var o = (function () { + function e(e) { + (this._cacheAccumulatedValueStart = 0), (this._cache = null), (this._actual = new i(e)), this._bustCache(); + } + return ( + (e.prototype._bustCache = function () { + (this._cacheAccumulatedValueStart = 0), (this._cache = null); + }), + (e.prototype.insertValues = function (e, t) { + this._actual.insertValues(e, t) && this._bustCache(); + }), + (e.prototype.changeValue = function (e, t) { + this._actual.changeValue(e, t) && this._bustCache(); + }), + (e.prototype.removeValues = function (e, t) { + this._actual.removeValues(e, t) && this._bustCache(); + }), + (e.prototype.getTotalValue = function () { + return this._actual.getTotalValue(); + }), + (e.prototype.getAccumulatedValue = function (e) { + return this._actual.getAccumulatedValue(e); + }), + (e.prototype.getIndexOf = function (e) { + if (((e = Math.floor(e)), null !== this._cache)) { + var t = e - this._cacheAccumulatedValueStart; + if (t >= 0 && t < this._cache.length) return this._cache[t]; + } + return this._actual.getIndexOf(e); + }), + (e.prototype.warmUpCache = function (e, t) { + for (var n = [], r = e; r <= t; r++) n[r - e] = this.getIndexOf(r); + (this._cache = n), (this._cacheAccumulatedValueStart = e); + }), + e + ); + })(); + t.PrefixSumComputerWithCache = o; + }), + i(e[19], t([0, 1, 2, 32]), function (e, t, n, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = (function () { + function e(e, t, n, r) { + (this._uri = e), (this._lines = t), (this._eol = n), (this._versionId = r), (this._lineStarts = null); + } + return ( + (e.prototype.dispose = function () { + this._lines.length = 0; + }), + (e.prototype.getText = function () { + return this._lines.join(this._eol); + }), + (e.prototype.onEvents = function (e) { + e.eol && e.eol !== this._eol && ((this._eol = e.eol), (this._lineStarts = null)); + for (var t = e.changes, r = 0, i = t.length; r < i; r++) { + var o = t[r]; + this._acceptDeleteRange(o.range), + this._acceptInsertText(new n.Position(o.range.startLineNumber, o.range.startColumn), o.text); + } + this._versionId = e.versionId; + }), + (e.prototype._ensureLineStarts = function () { + if (!this._lineStarts) { + for (var e = this._eol.length, t = this._lines.length, n = new Uint32Array(t), i = 0; i < t; i++) + n[i] = this._lines[i].length + e; + this._lineStarts = new r.PrefixSumComputer(n); + } + }), + (e.prototype._setLineText = function (e, t) { + (this._lines[e] = t), this._lineStarts && this._lineStarts.changeValue(e, this._lines[e].length + this._eol.length); + }), + (e.prototype._acceptDeleteRange = function (e) { + if (e.startLineNumber !== e.endLineNumber) + this._setLineText( + e.startLineNumber - 1, + this._lines[e.startLineNumber - 1].substring(0, e.startColumn - 1) + + this._lines[e.endLineNumber - 1].substring(e.endColumn - 1) + ), + this._lines.splice(e.startLineNumber, e.endLineNumber - e.startLineNumber), + this._lineStarts && this._lineStarts.removeValues(e.startLineNumber, e.endLineNumber - e.startLineNumber); + else { + if (e.startColumn === e.endColumn) return; + this._setLineText( + e.startLineNumber - 1, + this._lines[e.startLineNumber - 1].substring(0, e.startColumn - 1) + + this._lines[e.startLineNumber - 1].substring(e.endColumn - 1) + ); + } + }), + (e.prototype._acceptInsertText = function (e, t) { + if (0 !== t.length) { + var n = t.split(/\r\n|\r|\n/); + if (1 !== n.length) { + (n[n.length - 1] += this._lines[e.lineNumber - 1].substring(e.column - 1)), + this._setLineText(e.lineNumber - 1, this._lines[e.lineNumber - 1].substring(0, e.column - 1) + n[0]); + for (var r = new Uint32Array(n.length - 1), i = 1; i < n.length; i++) + this._lines.splice(e.lineNumber + i - 1, 0, n[i]), (r[i - 1] = n[i].length + this._eol.length); + this._lineStarts && this._lineStarts.insertValues(e.lineNumber, r); + } else + this._setLineText( + e.lineNumber - 1, + this._lines[e.lineNumber - 1].substring(0, e.column - 1) + + n[0] + + this._lines[e.lineNumber - 1].substring(e.column - 1) + ); + } + }), + e + ); + })(); + t.MirrorTextModel = i; + }), + i(e[34], t([0, 1, 24, 13, 12, 3, 11, 2, 5, 26, 19, 27, 28, 29, 31]), function (e, t, n, r, i, o, u, a, l, c, f, d, h, p, m) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var g = (function (e) { + function t() { + return (null !== e && e.apply(this, arguments)) || this; + } + return ( + s(t, e), + Object.defineProperty(t.prototype, 'uri', { + get: function () { + return this._uri; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(t.prototype, 'version', { + get: function () { + return this._versionId; + }, + enumerable: !0, + configurable: !0 + }), + Object.defineProperty(t.prototype, 'eol', { + get: function () { + return this._eol; + }, + enumerable: !0, + configurable: !0 + }), + (t.prototype.getValue = function () { + return this.getText(); + }), + (t.prototype.getLinesContent = function () { + return this._lines.slice(0); + }), + (t.prototype.getLineCount = function () { + return this._lines.length; + }), + (t.prototype.getLineContent = function (e) { + return this._lines[e - 1]; + }), + (t.prototype.getWordAtPosition = function (e, t) { + var n = d.getWordAtText(e.column, d.ensureValidWordDefinition(t), this._lines[e.lineNumber - 1], 0); + return n ? new l.Range(e.lineNumber, n.startColumn, e.lineNumber, n.endColumn) : null; + }), + (t.prototype.getWordUntilPosition = function (e, t) { + var n = this.getWordAtPosition(e, t); + return n + ? { + word: this._lines[e.lineNumber - 1].substring(n.startColumn - 1, e.column - 1), + startColumn: n.startColumn, + endColumn: e.column + } + : { word: '', startColumn: e.column, endColumn: e.column }; + }), + (t.prototype.createWordIterator = function (e) { + var t, + n, + r = this, + o = 0, + s = 0, + u = [], + a = function () { + if (s < u.length) { + var l = n.substring(u[s].start, u[s].end); + return (s += 1), t ? (t.value = l) : (t = { done: !1, value: l }), t; + } + return o >= r._lines.length + ? i.FIN + : ((n = r._lines[o]), (u = r._wordenize(n, e)), (s = 0), (o += 1), a()); + }; + return { next: a }; + }), + (t.prototype.getLineWords = function (e, t) { + for (var n = this._lines[e - 1], r = [], i = 0, o = this._wordenize(n, t); i < o.length; i++) { + var s = o[i]; + r.push({ word: n.substring(s.start, s.end), startColumn: s.start + 1, endColumn: s.end + 1 }); + } + return r; + }), + (t.prototype._wordenize = function (e, t) { + var n, + r = []; + for (t.lastIndex = 0; (n = t.exec(e)) && 0 !== n[0].length; ) + r.push({ start: n.index, end: n.index + n[0].length }); + return r; + }), + (t.prototype.getValueInRange = function (e) { + if ((e = this._validateRange(e)).startLineNumber === e.endLineNumber) + return this._lines[e.startLineNumber - 1].substring(e.startColumn - 1, e.endColumn - 1); + var t = this._eol, + n = e.startLineNumber - 1, + r = e.endLineNumber - 1, + i = []; + i.push(this._lines[n].substring(e.startColumn - 1)); + for (var o = n + 1; o < r; o++) i.push(this._lines[o]); + return i.push(this._lines[r].substring(0, e.endColumn - 1)), i.join(t); + }), + (t.prototype.offsetAt = function (e) { + return ( + (e = this._validatePosition(e)), + this._ensureLineStarts(), + this._lineStarts.getAccumulatedValue(e.lineNumber - 2) + (e.column - 1) + ); + }), + (t.prototype.positionAt = function (e) { + (e = Math.floor(e)), (e = Math.max(0, e)), this._ensureLineStarts(); + var t = this._lineStarts.getIndexOf(e), + n = this._lines[t.index].length; + return { lineNumber: 1 + t.index, column: 1 + Math.min(t.remainder, n) }; + }), + (t.prototype._validateRange = function (e) { + var t = this._validatePosition({ lineNumber: e.startLineNumber, column: e.startColumn }), + n = this._validatePosition({ lineNumber: e.endLineNumber, column: e.endColumn }); + return t.lineNumber !== e.startLineNumber || + t.column !== e.startColumn || + n.lineNumber !== e.endLineNumber || + n.column !== e.endColumn + ? { startLineNumber: t.lineNumber, startColumn: t.column, endLineNumber: n.lineNumber, endColumn: n.column } + : e; + }), + (t.prototype._validatePosition = function (e) { + if (!a.Position.isIPosition(e)) throw new Error('bad position'); + var t = e.lineNumber, + n = e.column, + r = !1; + if (t < 1) (t = 1), (n = 1), (r = !0); + else if (t > this._lines.length) (t = this._lines.length), (n = this._lines[t - 1].length + 1), (r = !0); + else { + var i = this._lines[t - 1].length + 1; + n < 1 ? ((n = 1), (r = !0)) : n > i && ((n = i), (r = !0)); + } + return r ? { lineNumber: t, column: n } : e; + }), + t + ); + })(f.MirrorTextModel), + _ = (function () { + function t(e) { + (this._foreignModuleFactory = e), (this._foreignModule = null); + } + return ( + (t.prototype.computeDiff = function (e, t, n) { + var r = this._getModel(e), + i = this._getModel(t); + if (!r || !i) return Promise.resolve(null); + var o = r.getLinesContent(), + s = i.getLinesContent(), + u = new c.DiffComputer(o, s, { + shouldComputeCharChanges: !0, + shouldPostProcessCharChanges: !0, + shouldIgnoreTrimWhitespace: n, + shouldMakePrettyDiff: !0 + }).computeDiff(), + a = !(u.length > 0) && this._modelsAreIdentical(r, i); + return Promise.resolve({ identical: a, changes: u }); + }), + (t.prototype._modelsAreIdentical = function (e, t) { + var n = e.getLineCount(); + if (n !== t.getLineCount()) return !1; + for (var r = 1; r <= n; r++) { + if (e.getLineContent(r) !== t.getLineContent(r)) return !1; + } + return !0; + }), + (t.prototype.computeMoreMinimalEdits = function (e, i) { + var o = this._getModel(e); + if (!o) return Promise.resolve(i); + for ( + var s = [], + u = void 0, + a = 0, + c = (i = n.mergeSort(i, function (e, t) { + if (e.range && t.range) return l.Range.compareRangesUsingStarts(e.range, t.range); + return (e.range ? 0 : 1) - (t.range ? 0 : 1); + })); + a < c.length; + a++ + ) { + var f = c[a], + d = f.range, + h = f.text, + p = f.eol; + if (('number' == typeof p && (u = p), d)) { + var m = o.getValueInRange(d); + if (((h = h.replace(/\r\n|\n|\r/g, o.eol)), m !== h)) + if (Math.max(h.length, m.length) > t._diffLimit) s.push({ range: d, text: h }); + else + for ( + var g = r.stringDiff(m, h, !1), + _ = o.offsetAt(l.Range.lift(d).getStartPosition()), + v = 0, + y = g; + v < y.length; + v++ + ) { + var b = y[v], + C = o.positionAt(_ + b.originalStart), + E = o.positionAt(_ + b.originalStart + b.originalLength), + S = { + text: h.substr(b.modifiedStart, b.modifiedLength), + range: { + startLineNumber: C.lineNumber, + startColumn: C.column, + endLineNumber: E.lineNumber, + endColumn: E.column + } + }; + o.getValueInRange(S.range) !== S.text && s.push(S); + } + } + } + return 'number' == typeof u && s.push({ eol: u, text: void 0, range: void 0 }), Promise.resolve(s); + }), + (t.prototype.computeLinks = function (e) { + var t = this._getModel(e); + return t ? Promise.resolve(h.computeLinks(t)) : Promise.resolve(null); + }), + (t.prototype.textualSuggest = function (e, n, r, i) { + var o = this._getModel(e); + if (!o) return Promise.resolve(null); + var s = [], + u = new RegExp(r, i), + a = o.getWordUntilPosition(n, u), + l = Object.create(null); + l[a.word] = !0; + for (var c = o.createWordIterator(u), f = c.next(); !f.done && s.length <= t._suggestionsLimit; f = c.next()) { + var d = f.value; + l[d] || + ((l[d] = !0), + isNaN(Number(d)) && + s.push({ + kind: 18, + label: d, + insertText: d, + range: { + startLineNumber: n.lineNumber, + startColumn: a.startColumn, + endLineNumber: n.lineNumber, + endColumn: a.endColumn + } + })); + } + return Promise.resolve({ suggestions: s }); + }), + (t.prototype.computeWordRanges = function (e, t, n, r) { + var i = this._getModel(e); + if (!i) return Promise.resolve(Object.create(null)); + for (var o = new RegExp(n, r), s = Object.create(null), u = t.startLineNumber; u < t.endLineNumber; u++) + for (var a = 0, l = i.getLineWords(u, o); a < l.length; a++) { + var c = l[a]; + if (isNaN(Number(c.word))) { + var f = s[c.word]; + f || ((f = []), (s[c.word] = f)), + f.push({ + startLineNumber: u, + startColumn: c.startColumn, + endLineNumber: u, + endColumn: c.endColumn + }); + } + } + return Promise.resolve(s); + }), + (t.prototype.navigateValueSet = function (e, t, n, r, i) { + var o = this._getModel(e); + if (!o) return Promise.resolve(null); + var s = new RegExp(r, i); + t.startColumn === t.endColumn && + (t = { + startLineNumber: t.startLineNumber, + startColumn: t.startColumn, + endLineNumber: t.endLineNumber, + endColumn: t.endColumn + 1 + }); + var u = o.getValueInRange(t), + a = o.getWordAtPosition({ lineNumber: t.startLineNumber, column: t.startColumn }, s); + if (!a) return Promise.resolve(null); + var l = o.getValueInRange(a), + c = p.BasicInplaceReplace.INSTANCE.navigateValueSet(t, u, a, l, n); + return Promise.resolve(c); + }), + (t.prototype.loadForeignModule = function (t, n) { + var r = this, + i = { + getMirrorModels: function () { + return r._getModels(); + } + }; + if (this._foreignModuleFactory) { + this._foreignModule = this._foreignModuleFactory(i, n); + var o = []; + for (var s in this._foreignModule) 'function' == typeof this._foreignModule[s] && o.push(s); + return Promise.resolve(o); + } + return new Promise(function (o, s) { + e( + [t], + function (e) { + r._foreignModule = e.create(i, n); + var t = []; + for (var s in r._foreignModule) 'function' == typeof r._foreignModule[s] && t.push(s); + o(t); + }, + s + ); + }); + }), + (t.prototype.fmr = function (e, t) { + if (!this._foreignModule || 'function' != typeof this._foreignModule[e]) + return Promise.reject(new Error('Missing requestHandler or method: ' + e)); + try { + return Promise.resolve(this._foreignModule[e].apply(this._foreignModule, t)); + } catch (e) { + return Promise.reject(e); + } + }), + (t._diffLimit = 1e4), + (t._suggestionsLimit = 1e4), + t + ); + })(); + t.BaseEditorSimpleWorker = _; + var v = (function (e) { + function t(t) { + var n = e.call(this, t) || this; + return (n._models = Object.create(null)), n; + } + return ( + s(t, e), + (t.prototype.dispose = function () { + this._models = Object.create(null); + }), + (t.prototype._getModel = function (e) { + return this._models[e]; + }), + (t.prototype._getModels = function () { + var e = this, + t = []; + return ( + Object.keys(this._models).forEach(function (n) { + return t.push(e._models[n]); + }), + t + ); + }), + (t.prototype.acceptNewModel = function (e) { + this._models[e.url] = new g(u.URI.parse(e.url), e.lines, e.EOL, e.versionId); + }), + (t.prototype.acceptModelChanged = function (e, t) { + if (this._models[e]) { + this._models[e].onEvents(t); + } + }), + (t.prototype.acceptRemovedModel = function (e) { + this._models[e] && delete this._models[e]; + }), + t + ); + })(_); + (t.EditorSimpleWorkerImpl = v), + (t.create = function () { + return new v(null); + }), + 'function' == typeof importScripts && (o.globals.monaco = m.createMonacoBaseAPI()); + }), + (function () { + 'use strict'; + var e = self.MonacoEnvironment, + t = e && e.baseUrl ? e.baseUrl : '../../../'; + ('function' == typeof self.define && self.define.amd) || importScripts(t + 'vs/loader.js'), + require.config({ baseUrl: t, catchError: !0 }); + var n = !0, + r = []; + self.onmessage = function (e) { + n + ? ((n = !1), + (function (e) { + require([e], function (e) { + setTimeout(function () { + var t = e.create(function (e) { + self.postMessage(e); + }, null); + for ( + self.onmessage = function (e) { + return t.onmessage(e.data); + }; + r.length > 0; + + ) + self.onmessage(r.shift()); + }, 0); + }); + })(e.data)) + : r.push(e); + }; + })(); +}.call(this)); +//# sourceMappingURL=../../../../min-maps/vs/base/worker/workerMain.js.map diff --git a/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/basic-languages/apex/apex.js b/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/basic-languages/apex/apex.js index 6c063b09577d556f9e8915752c58b741a60d386b..a1e8d165bc04ce473df1c190e560ceef2a57c52a 100644 --- a/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/basic-languages/apex/apex.js +++ b/packages/f-theme-editor/farris-theme-builder-site/src/assets/monaco/vs/basic-languages/apex/apex.js @@ -1,7 +1,277 @@ -/*!----------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * monaco-languages version: 1.6.0(858705e74270e53559a241fdee187e7a6ae53b23) - * Released under the MIT license - * https://github.com/Microsoft/monaco-languages/blob/master/LICENSE.md - *-----------------------------------------------------------------------------*/ -define("vs/basic-languages/apex/apex",["require","exports"],function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.conf={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}};var s=[];["abstract","activate","and","any","array","as","asc","assert","autonomous","begin","bigdecimal","blob","boolean","break","bulk","by","case","cast","catch","char","class","collect","commit","const","continue","convertcurrency","decimal","default","delete","desc","do","double","else","end","enum","exception","exit","export","extends","false","final","finally","float","for","from","future","get","global","goto","group","having","hint","if","implements","import","in","inner","insert","instanceof","int","interface","into","join","last_90_days","last_month","last_n_days","last_week","like","limit","list","long","loop","map","merge","native","new","next_90_days","next_month","next_n_days","next_week","not","null","nulls","number","object","of","on","or","outer","override","package","parallel","pragma","private","protected","public","retrieve","return","returning","rollback","savepoint","search","select","set","short","sort","stat","static","strictfp","super","switch","synchronized","system","testmethod","then","this","this_month","this_week","throw","throws","today","tolabel","tomorrow","transaction","transient","trigger","true","try","type","undelete","update","upsert","using","virtual","void","volatile","webservice","when","where","while","yesterday"].forEach(function(e){var t;s.push(e),s.push(e.toUpperCase()),s.push((t=e).charAt(0).toUpperCase()+t.substr(1))}),t.language={defaultToken:"",tokenPostfix:".apex",keywords:s,operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@apexdoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],apexdoc:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}}); \ No newline at end of file +/* eslint-disable no-undef */ +define('vs/basic-languages/apex/apex', ['require', 'exports'], function (e, t) { + + Object.defineProperty(t, '__esModule', { value: !0 }), + (t.conf = { + wordPattern: /(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g, + comments: { lineComment: '//', blockComment: ['/*', '*/'] }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'] + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: "'", close: "'" }, + { open: '<', close: '>' } + ], + folding: { + markers: { + start: new RegExp('^\\s*//\\s*(?:(?:#?region\\b)|(?:))') + } + } + }); + var s = []; + [ + 'abstract', + 'activate', + 'and', + 'any', + 'array', + 'as', + 'asc', + 'assert', + 'autonomous', + 'begin', + 'bigdecimal', + 'blob', + 'boolean', + 'break', + 'bulk', + 'by', + 'case', + 'cast', + 'catch', + 'char', + 'class', + 'collect', + 'commit', + 'const', + 'continue', + 'convertcurrency', + 'decimal', + 'default', + 'delete', + 'desc', + 'do', + 'double', + 'else', + 'end', + 'enum', + 'exception', + 'exit', + 'export', + 'extends', + 'false', + 'final', + 'finally', + 'float', + 'for', + 'from', + 'future', + 'get', + 'global', + 'goto', + 'group', + 'having', + 'hint', + 'if', + 'implements', + 'import', + 'in', + 'inner', + 'insert', + 'instanceof', + 'int', + 'interface', + 'into', + 'join', + 'last_90_days', + 'last_month', + 'last_n_days', + 'last_week', + 'like', + 'limit', + 'list', + 'long', + 'loop', + 'map', + 'merge', + 'native', + 'new', + 'next_90_days', + 'next_month', + 'next_n_days', + 'next_week', + 'not', + 'null', + 'nulls', + 'number', + 'object', + 'of', + 'on', + 'or', + 'outer', + 'override', + 'package', + 'parallel', + 'pragma', + 'private', + 'protected', + 'public', + 'retrieve', + 'return', + 'returning', + 'rollback', + 'savepoint', + 'search', + 'select', + 'set', + 'short', + 'sort', + 'stat', + 'static', + 'strictfp', + 'super', + 'switch', + 'synchronized', + 'system', + 'testmethod', + 'then', + 'this', + 'this_month', + 'this_week', + 'throw', + 'throws', + 'today', + 'tolabel', + 'tomorrow', + 'transaction', + 'transient', + 'trigger', + 'true', + 'try', + 'type', + 'undelete', + 'update', + 'upsert', + 'using', + 'virtual', + 'void', + 'volatile', + 'webservice', + 'when', + 'where', + 'while', + 'yesterday' + ].forEach(function (e) { + var t; + s.push(e), s.push(e.toUpperCase()), s.push((t = e).charAt(0).toUpperCase() + t.substr(1)); + }), + (t.language = { + defaultToken: '', + tokenPostfix: '.apex', + keywords: s, + operators: [ + '=', + '>', + '<', + '!', + '~', + '?', + ':', + '==', + '<=', + '>=', + '!=', + '&&', + '||', + '++', + '--', + '+', + '-', + '*', + '/', + '&', + '|', + '^', + '%', + '<<', + '>>', + '>>>', + '+=', + '-=', + '*=', + '/=', + '&=', + '|=', + '^=', + '%=', + '<<=', + '>>=', + '>>>=' + ], + symbols: /[=>](?!@symbols)/, '@brackets'], + [/@symbols/, { cases: { '@operators': 'delimiter', '@default': '' } }], + [/@\s*[a-zA-Z_\$][\w\$]*/, 'annotation'], + [/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/, 'number.float'], + [/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/, 'number.float'], + [/(@digits)[fFdD]/, 'number.float'], + [/(@digits)[lL]?/, 'number'], + [/[;,.]/, 'delimiter'], + [/"([^"\\]|\\.)*$/, 'string.invalid'], + [/'([^'\\]|\\.)*$/, 'string.invalid'], + [/"/, 'string', '@string."'], + [/'/, 'string', "@string.'"], + [/'[^\\']'/, 'string'], + [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], + [/'/, 'string.invalid'] + ], + whitespace: [ + [/[ \t\r\n]+/, ''], + [/\/\*\*(?!\/)/, 'comment.doc', '@apexdoc'], + [/\/\*/, 'comment', '@comment'], + [/\/\/.*$/, 'comment'] + ], + comment: [ + [/[^\/*]+/, 'comment'], + [/\*\//, 'comment', '@pop'], + [/[\/*]/, 'comment'] + ], + apexdoc: [ + [/[^\/*]+/, 'comment.doc'], + [/\*\//, 'comment.doc', '@pop'], + [/[\/*]/, 'comment.doc'] + ], + string: [ + [/[^\\"']+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/["']/, { cases: { '$#==$S2': { token: 'string', next: '@pop' }, '@default': 'string' } }] + ] + } + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..c162b74275ec5bd4e989ecf7d9005c3a8f002f0b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "devextreme/jest" + ], + "env": { + "node": true + }, + "parserOptions": { + "project": "packages/f-theme-editor/farris-theme-editor/themebuilder/tsconfig.json" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/.vscode/launch.json b/packages/f-theme-editor/farris-theme-editor/.vscode/launch.json new file mode 100644 index 0000000000000000000000000000000000000000..293690f993c19273d28b28eb25e3e7e4bf528efc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "command": "npm run generate-metadata", + "name": "Run npm start", + "request": "launch", + "type": "node-terminal" + }, + { + "type": "pwa-node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/themebuilder/src/metadata/generate.ts", + "outFiles": [ + "${workspaceFolder}/**/*.js" + ] + } + ] +} \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/.vscode/settings.json b/packages/f-theme-editor/farris-theme-editor/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..3b664107303df336bab8010caad42ddaed24550e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/README.md b/packages/f-theme-editor/farris-theme-editor/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b618d54bd944cad6977d95c3f27462e1e7012210 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/README.md @@ -0,0 +1 @@ +## 待更新 \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/angular.json b/packages/f-theme-editor/farris-theme-editor/angular.json new file mode 100644 index 0000000000000000000000000000000000000000..2397f7a0096dde3e57d01fb2f26c196afd1ff561 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/angular.json @@ -0,0 +1,171 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "farris-theme": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/farris-theme", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.css" + ], + "scripts": [], + "es5BrowserSupport": true + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "2mb", + "maximumError": "5mb" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "farris-theme:build" + }, + "configurations": { + "production": { + "browserTarget": "farris-theme:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "farris-theme:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.css" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "farris-theme-e2e": { + "root": "e2e/", + "projectType": "application", + "prefix": "", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "farris-theme:serve" + }, + "configurations": { + "production": { + "devServerTarget": "farris-theme:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "themebuilder": { + "root": "projects/themebuilder", + "sourceRoot": "projects/themebuilder/src", + "projectType": "library", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/themebuilder/tsconfig.lib.json", + "project": "projects/themebuilder/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/themebuilder/src/test.ts", + "tsConfig": "projects/themebuilder/tsconfig.spec.json", + "karmaConfig": "projects/themebuilder/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/themebuilder/tsconfig.lib.json", + "projects/themebuilder/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "farris-theme" +} \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/bebel.config.js b/packages/f-theme-editor/farris-theme-editor/bebel.config.js new file mode 100644 index 0000000000000000000000000000000000000000..5af04ddce0af8a19528c2bd8897e72dc601742b4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/bebel.config.js @@ -0,0 +1,56 @@ +/* + * @Author: your name + * @Date: 2022-01-04 14:35:26 + * @LastEditTime: 2022-01-05 10:26:35 + * @LastEditors: Please set LastEditors + * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @FilePath: /farris-theme/bebel.config.js + */ +module.exports = { + plugins: [ + '@babel/plugin-proposal-class-properties', + "babel-plugin-styled-components", + "@babel/plugin-syntax-dynamic-import" + ], + presets: [ + '@babel/preset-env', + ], + env: { + development: { + plugins: [ + // 加上这个plugin可以免去引入antd全局样式这一步 + ['import-separation', { libraryName: 'antd', libraryDirectory: 'es', style: true }], + '@babel/plugin-transform-runtime', + // react热更新所需要的babel + 'react-hot-loader/babel', + "@babel/plugin-proposal-class-properties", + ["babel-plugin-styled-components", { "displayName": true }], + "@babel/plugin-syntax-dynamic-import" + ], + presets: ["@babel/preset-env",] + }, + production: { + plugins: [ + ['import-separation', { libraryName: 'antd', libraryDirectory: 'es', style: true }], + '@babel/plugin-transform-runtime', + 'react-hot-loader/babel', + "@babel/plugin-proposal-class-properties", + "babel-plugin-styled-components", + "@babel/plugin-syntax-dynamic-import" + ], + presets: ["@babel/preset-env",] + }, + /** + * test环境下不能配置import-separation @babel/plugin-transform-runtime react-hot-loader三种plugin + * 否则测试会出错:SyntaxError: Cannot use import statement outside a module + */ + test: { + plugins: [ + "@babel/plugin-proposal-class-properties", + ["babel-plugin-styled-components", { "displayName": true }], + "@babel/plugin-syntax-dynamic-import" + ], + presets: ["@babel/preset-env",] + }, + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/build/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..5a77aa21b89da8b10e70ff197cf5eadd5059f0fe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "env": { + "node": true + }, + "plugins": [ + "node" + ], + "extends": [ + "plugin:node/recommended" + ], + "rules": { + "no-console": "off", + "node/no-unpublished-require": "off", + "node/no-unsupported-features/node-builtins": "off", + "node/shebang": "off" + }, + "globals": { + "console": true + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/docker-image/Dockerfile b/packages/f-theme-editor/farris-theme-editor/build/docker-image/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..f27c4f1e629125815aeb05b12030eae487d4ed40 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/docker-image/Dockerfile @@ -0,0 +1,104 @@ +FROM ubuntu:18.04 as builder + +# Setup APT +RUN echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/dx-no-recommends +RUN apt-get update && apt-get -y upgrade + +# Remove init system +RUN apt-get purge -y --allow-remove-essential init systemd + +# Curl +RUN apt-get install -y ca-certificates curl + +# Build-time utils +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y apt-transport-https gnupg localepurge + +# Node +RUN curl -L https://deb.nodesource.com/setup_12.x | bash - +RUN apt-get install -y nodejs +RUN npm i -g npm@6 +RUN npm cache clean --force +RUN npm set progress=false +RUN npm set loglevel=error +RUN npm set unsafe-perm=true +RUN npm set fetch-retries 5 +RUN npm set audit false +RUN npm set fund false + +# .NET Core +RUN curl -L https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg +RUN echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-bionic-prod bionic main" > /etc/apt/sources.list.d/dotnetdev.list +RUN apt-get update +RUN DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 apt-get install -y dotnet-sdk-2.1 +RUN rm /usr/share/dotnet/sdk/*/nuGetPackagesArchive.lzma + +# Slim +RUN rm -r /usr/share/dotnet/sdk/*/FSharp +RUN rm -r /usr/share/dotnet/sdk/*/Templates +RUN rm -r /usr/share/dotnet/sdk/*/DotnetTools +RUN rm -r /usr/share/dotnet/sdk/NuGetFallbackFolder/* +RUN rm -r /usr/share/dotnet/shared/Microsoft.AspNetCore.* +RUN find /usr/share/dotnet -type f -name '*.resources.dll' -delete +RUN find /usr/share/dotnet -type f -wholename '**/runtimes/win*/**' -delete + +# Chrome +RUN curl -L https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google.gpg +RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list +RUN apt-get update +RUN apt-get install -y google-chrome-stable +RUN rm -rf /opt/google/chrome/swiftshader /opt/google/chrome/libwidevinecdm.so +RUN find /opt/google/chrome/locales -type f ! -name 'en-US.pak' -delete + +# Firefox +RUN apt-get install -y firefox +RUN mkdir /firefox-profile +RUN for p in \ + '"browser.shell.checkDefaultBrowser", false' \ + '"datareporting.policy.dataSubmissionEnabled", false' \ + '"font.name-list.monospace.x-western", "Liberation Mono"' \ + '"font.name-list.sans-serif.x-western", "Liberation Sans"' \ + '"font.name-list.serif.x-western", "Liberation Serif"' ; do echo "user_pref($p);" >> /firefox-profile/prefs.js; done + +# Utils for docker-ci.sh +RUN apt-get install -y dbus-x11 httping x11vnc xvfb + +# Utils for drone-cache.sh +RUN apt-get install liblz4-tool + +# Yes :) +RUN apt-get install -y mc + +# Use UTF-8 +RUN apt-get install -y locales +RUN locale-gen en_US.UTF-8 +RUN printf "MANDELETE\nen_US.UTF-8" > /etc/locale.nopurge +RUN localepurge + +# Ensure UTC +RUN [ "$(date +%Z)" = "UTC" ] || exit 1 + +# Remove build-time utils +RUN apt-get purge -y apt-transport-https gnupg localepurge + +# Clean APT +RUN apt-get autoremove -y --purge +RUN apt-get clean +RUN rm -rf /etc/apt/sources.list.d/* /tmp/* /usr/share/doc/* /var/cache/* /var/lib/apt/lists/* /var/log/* + +############################################################# + +FROM scratch + +COPY --from=builder / / + +ENV LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 \ + TERM=xterm \ + DISPLAY=:99 \ + NUGET_XMLDOC_MODE=skip \ + DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 \ + DOTNET_CLI_TELEMETRY_OPTOUT=1 \ + DOTNET_USE_POLLING_FILE_WATCHER=true + +WORKDIR /devextreme +STOPSIGNAL SIGKILL diff --git a/packages/f-theme-editor/farris-theme-editor/build/docker-image/README.txt b/packages/f-theme-editor/farris-theme-editor/build/docker-image/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..6fadf9f5267640ec17569f3e4f35dfd38a699e2a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/docker-image/README.txt @@ -0,0 +1,9 @@ +Build: + docker build -t devexpress/devextreme-build:YYYY-MM-DD . + +Debug: + docker run --rm -ti -p 5900:5900 -e NO_HEADLESS=true -e TARGET=test -v REPO_PATH:/devextreme devexpress/devextreme-build:YYYY-MM-DD ./docker-ci.sh + +Move tag: + docker tag devexpress/devextreme-build:YYYY-MM-DD devexpress/devextreme-build:XX_X + docker push devexpress/devextreme-build:XX_X diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/aspnet.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/aspnet.js new file mode 100644 index 0000000000000000000000000000000000000000..3053f35333d6f9150df59c19df43678e5ffc4dd6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/aspnet.js @@ -0,0 +1,18 @@ +'use strict'; + +const gulp = require('gulp'); +const merge = require('merge-stream'); +const rename = require('gulp-rename'); +const headerPipes = require('./header-pipes.js'); +const compressionPipes = require('./compression-pipes.js'); +const context = require('./context'); + +gulp.task('aspnet', function() { + return merge( + gulp.src('./js/aspnet.js') + .pipe(rename('dx.aspnet.mvc.js')) + .pipe(compressionPipes.beautify()) + .pipe(headerPipes.bangLicense()) + .pipe(gulp.dest(context.RESULT_JS_PATH)) + ); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/bundler-config.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/bundler-config.js new file mode 100644 index 0000000000000000000000000000000000000000..49254b8ec8aacff325bb874353a6a46f5f90e3f3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/bundler-config.js @@ -0,0 +1,46 @@ +'use strict'; + +const gulp = require('gulp'); +const replace = require('gulp-replace'); +const concat = require('gulp-concat'); +const rename = require('gulp-rename'); +const header = require('gulp-header'); +const eol = require('gulp-eol'); + +const context = require('./context.js'); +const headerPipes = require('./header-pipes.js'); +const { packageDir } = require('./utils'); + +const BUNDLE_CONFIG_SOURCES = [ + 'js/bundles/modules/parts/core.js', + 'js/bundles/modules/parts/data.js', + 'js/bundles/modules/parts/widgets-base.js', + 'js/bundles/modules/parts/widgets-mobile.js', + 'js/bundles/modules/parts/widgets-web.js', + 'js/bundles/modules/parts/viz.js', + 'js/bundles/modules/parts/aspnet.js' +]; + +gulp.task('bundler-config', function() { + return gulp.src(BUNDLE_CONFIG_SOURCES) + .pipe(replace(/[^]*BUNDLER_PARTS.*?$([^]*)^.*?BUNDLER_PARTS_END[^]*/gm, '$1')) + .pipe(concat('dx.custom.js')) + .pipe(header('/* Comment lines below for the widgets you don\'t require and run "devextreme-bundler" in this directory, then include dx.custom.js in your project */')) + .pipe(headerPipes.useStrict()) + .pipe(replace(/require *\( *["']..\/..\//g, 'require(\'')) + .pipe(replace(/^[ ]{4}/gm, '')) + .pipe(replace(/^[\n\r]{2,}/gm, '\n\n')) + .pipe(eol()) + .pipe(gulp.dest('js/bundles')) + .pipe(rename('dx.custom.config.js')) + .pipe(replace(/require *\( *["']..\//g, 'require(\'devextreme/')) + .pipe(gulp.dest(`${context.RESULT_NPM_PATH}/${packageDir}/bundles`)); +}); + +gulp.task('bundler-config-watch', function() { + return gulp + .watch(BUNDLE_CONFIG_SOURCES, gulp.series('bundler-config')) + .on('ready', () => console.log( + 'bundler-config task is watching for changes...' + )); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/check_licenses.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/check_licenses.js new file mode 100644 index 0000000000000000000000000000000000000000..4b7254dda02fef4fc5b8e2cdac6c1046e214c496 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/check_licenses.js @@ -0,0 +1,26 @@ +'use strict'; +const gulp = require('gulp'); +const lazyPipe = require('lazypipe'); +const named = require('vinyl-named'); + +const checkRruleLicenseNotice = lazyPipe() + .pipe(named, function(file) { + const name = 'rrule.js - Library for working with recurrence rules for calendar dates.'; + const url = 'https://github.com/jakubroztocil/rrule'; + const copyright = 'Copyright 2010, Jakub Roztocil and Lars Schoning'; + const licenseUrl = 'https://github.com/jakubroztocil/rrule/blob/master/LICENCE'; + const licenseType = 'Licenced under the BSD licence.'; + const separator = '\\s*\\*\\s'; + + const fileContent = file.contents.toString(); + const re = new RegExp(`\\*!\\s*.*${name}${separator}${url}${separator}*\\*\\s${copyright}${separator}${licenseType}${separator}${licenseUrl}`); + + if(fileContent.search(re) === -1) { + throw new Error(`RRule license header wasn't found in ${file.stem}`); + } + }); + +gulp.task('check-license-notices', function() { + return gulp.src('artifacts/js/dx.all.js') + .pipe(checkRruleLicenseNotice()); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/compression-pipes.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/compression-pipes.js new file mode 100644 index 0000000000000000000000000000000000000000..ba2c9815415f059f5da72e4ef0a3efafc3e26c25 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/compression-pipes.js @@ -0,0 +1,73 @@ +'use strict'; + +const lazyPipe = require('lazypipe'); +const replace = require('gulp-replace'); +const uglify = require('gulp-uglify-es').default; +const gulpIf = require('gulp-if'); +const eol = require('gulp-eol'); +const prettify = require('gulp-jsbeautifier'); + +const context = require('./context.js'); + +const removeDebug = lazyPipe().pipe(function() { + return replace(/\/{2,}#DEBUG[\s\S]*?\/{2,}#ENDDEBUG/g, ''); +}); + +function saveLicenseComments(node, comment) { + return comment.value.charAt(0) === '!' + || comment.value.indexOf(context.EULA_URL) > -1; +} + +module.exports = { + + removeDebug: removeDebug, + + minify: lazyPipe() + .pipe(removeDebug) + .pipe(function() { + return gulpIf(context.uglify, uglify({ + output: { + ascii_only: true, + comments: saveLicenseComments + } + })); + }) + .pipe(eol), + + beautify: lazyPipe() + .pipe(function() { + return gulpIf(context.uglify, uglify({ + mangle: false, + warnings: false, + compress: { + 'sequences': false, + 'properties': true, + 'dead_code': true, + 'drop_debugger': true, + 'unsafe': false, + 'conditionals': false, + 'comparisons': false, + 'evaluate': true, + 'booleans': false, + 'loops': false, + 'unused': true, + 'hoist_funs': false, + 'hoist_vars': false, + 'if_return': false, + 'join_vars': false, + 'collapse_vars': false, + 'side_effects': false, + 'global_defs': {} + }, + output: { + 'braces': true, + 'ascii_only': true, + comments: saveLicenseComments + } + })); + }) + .pipe(function() { + return gulpIf(context.uglify, prettify()); + }) + .pipe(eol) +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/context.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/context.js new file mode 100644 index 0000000000000000000000000000000000000000..59cb76816dcc280d3a69babf0ad4b98fcf7abf30 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/context.js @@ -0,0 +1,26 @@ +'use strict'; + +// See tests in version-spec.js + +const argv = require('yargs') + .default('uglify', false) + .argv; + +const version = require('./version')( + require('../../package.json').version, + process.env.DEVEXTREME_DXBUILD_LABEL, + process.env.DEVEXTREME_DXBUILD_FLAVOR, + process.env.DEVEXTREME_DXBUILD_REVISION +); + +module.exports = { + version, + uglify: argv.uglify, + RESULT_JS_PATH: 'artifacts/js', + RESULT_NPM_PATH: 'artifacts/npm', + TRANSPILED_PATH: 'artifacts/transpiled', + TRANSPILED_PROD_RENOVATION_PATH: 'artifacts/transpiled-renovation-npm', + TRANSPILED_RENOVATION_PATH: 'artifacts/transpiled-renovation', + TRANSPILED_PROD_ESM_PATH: 'artifacts/transpiled-esm-npm', + EULA_URL: 'https://js.devexpress.com/Licensing/' +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/create_timezones_data.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/create_timezones_data.js new file mode 100644 index 0000000000000000000000000000000000000000..f543c9c433ba5c4791e8e467d7dc4ba4e4d29a30 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/create_timezones_data.js @@ -0,0 +1,85 @@ +'use strict'; +const gulp = require('gulp'); +const through = require('through2'); +const remoteSrc = require('gulp-remote-src'); +const rename = require('gulp-rename'); +const lint = require('gulp-eslint'); + +gulp.task('create-timezones-data', () => { + const momentTimezonesRawUrl = 'https://raw.githubusercontent.com/moment/moment-timezone/develop/data/unpacked/'; + + return remoteSrc(['latest.json'], { + base: momentTimezonesRawUrl + }).pipe( + through.obj((file, enc, callBack) => { + const rawJSON = file.contents.toString(); + const parsed = JSON.parse(rawJSON); + const transformed = transformTimezoneData(parsed); + const stringify = JSON.stringify(transformed, null, 2); + file.contents = Buffer.from('export default ' + stringify); + callBack(null, file); + })) + .pipe(rename('timezones_data.js')) + .pipe(lint({ + fix: true, + configFile: './.eslintrc.js' + })) + .pipe(lint.format()) + .pipe(gulp.dest('js/ui/scheduler/timezones')); +}); + +function prepareUntils(untils) { + const result = []; + + untils.forEach((until, index) => { + if(until === null) { + result.push('Infinity'); + } else { + if(until != null && index !== 0) { + const currentOffset = until - untils[index - 1]; + result.push((currentOffset / 1000).toString(36)); + } + + if(index === 0) { + result.push((until / 1000).toString(36)); + } + } + }); + return result.join('|'); +} + +function prepareOffsets(offsets) { + return offsets.filter((v, i, a) => a.indexOf(v) === i); +} + +function prepareOffsetIndices(offsets, timezoneOffsets) { + const offsetIndices = timezoneOffsets.map((offset) => offsets.indexOf(offset)); + return offsetIndices.join(''); +} + +function transformTimezoneData(input) { + const result = []; + + Object.keys(input).forEach(key => { + if(key === 'zones') { + const items = input[key]; + items.forEach(timezone => { + const timezoneOffsets = timezone.offsets; + const offsets = prepareOffsets(timezoneOffsets); + const untils = prepareUntils(timezone.untils); + const offsetIndices = prepareOffsetIndices(offsets, timezoneOffsets); + + result.push({ + id: timezone.name, + untils: untils, + offsets: offsets.join('|'), + offsetIndices: offsetIndices + }); + }); + } + }); + + return { + zones: result + }; +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/env-variables.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/env-variables.js new file mode 100644 index 0000000000000000000000000000000000000000..3c8a1f99202e8ceb50b53edaeb08b23498dc2210 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/env-variables.js @@ -0,0 +1,14 @@ +'use strict'; + +const TEST_CI = Boolean(process.env['DEVEXTREME_TEST_CI']); +const BUILD_ESM_PACKAGE = Boolean(process.env['BUILD_ESM_PACKAGE']); +const SKIP_THEMEBUILDER = Boolean(process.env['SKIP_THEMEBUILDER']); +const BUILD_INPROGRESS_RENOVATION = String(process.env['BUILD_INPROGRESS_RENOVATION']).toLowerCase() ==='true'; + +module.exports = { + TEST_CI: TEST_CI, + DOCKER_CI: Boolean(process.env['DEVEXTREME_DOCKER_CI']), + BUILD_ESM_PACKAGE: BUILD_ESM_PACKAGE && !TEST_CI, + SKIP_THEMEBUILDER: SKIP_THEMEBUILDER, + BUILD_INPROGRESS_RENOVATION: BUILD_INPROGRESS_RENOVATION +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generated_js.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/generated_js.jst new file mode 100644 index 0000000000000000000000000000000000000000..865ce08044dd32636387987d014c52144a0329b6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generated_js.jst @@ -0,0 +1,3 @@ +/* eslint-disable node/no-unsupported-features/es-syntax */ +// !!! AUTO-GENERATED FILE, DO NOT EDIT +export <%= exportName ? 'const ' + exportName + ' =' : 'default' %> <%= json %>; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/generator-options.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/generator-options.js new file mode 100644 index 0000000000000000000000000000000000000000..800c735314a1b395009ef48bebfc3979e03ef0b0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/generator-options.js @@ -0,0 +1,16 @@ +'use strict'; + +const BASE_GENERATOR_OPTIONS = { + defaultOptionsModule: 'js/core/options/utils', +}; + +const BASE_GENERATOR_OPTIONS_WITH_JQUERY = { + ...BASE_GENERATOR_OPTIONS, + jqueryComponentRegistratorModule: 'js/core/component_registrator', + jqueryBaseComponentModule: 'js/renovation/component_wrapper/common/component' +}; + +module.exports = { + BASE_GENERATOR_OPTIONS, + BASE_GENERATOR_OPTIONS_WITH_JQUERY +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/gulpfile.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/gulpfile.js new file mode 100644 index 0000000000000000000000000000000000000000..9233249c13394f8afd4d2c732311442534c2ab4b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/gulpfile.js @@ -0,0 +1,314 @@ +'use strict'; + +const gulp = require('gulp'); +const file = require('gulp-file'); +const del = require('del'); +const path = require('path'); +const fs = require('fs'); +const { generateComponents } = require('@devextreme-generator/build-helpers'); +const { InfernoGenerator } = require('@devextreme-generator/inferno'); +const ts = require('gulp-typescript'); +const plumber = require('gulp-plumber'); +const gulpIf = require('gulp-if'); +const babel = require('gulp-babel'); +const notify = require('gulp-notify'); +const watch = require('gulp-watch'); +const transpileConfig = require('../transpile-config'); +const env = require('../env-variables'); +const cached = require('gulp-cached'); + +const { + BASE_GENERATOR_OPTIONS, + BASE_GENERATOR_OPTIONS_WITH_JQUERY +} = require('./generator-options'); + +const generator = new InfernoGenerator(); + +const jQueryComponentsGlob = 'js/renovation/**/*.j.tsx'; + +const esmPackage = env.BUILD_ESM_PACKAGE; + +const SRC = [ + 'js/renovation/**/*.{tsx,ts}', + `!${jQueryComponentsGlob}`, + '!js/renovation/**/*.d.ts', + '!js/renovation/**/__tests__/**/*', + '!js/renovation/test_utils/**/*' +]; + +const IGNORE_PATHS_BY_FRAMEWORKS = { + vue: [], + // react: [], + angular: [] +}; + +const COMPAT_TESTS_PARTS = 'testing/tests/Renovation/'; + +const COMMON_SRC = ['js/**/*.d.ts', 'js/**/*.js']; + +const knownErrors = [ + 'js/renovation/component_wrapper/', + 'js\\renovation\\component_wrapper\\', + 'Cannot find module \'../../inferno/src\'', + // #region TODO remove it after fix https://trello.com/c/2LOaxO9F/2704-renovation-some-types-is-missing-on-new-type-defining + 'Cannot find name \'GridBaseView\'', + 'Property \'views\' of exported interface has or is using private name \'GridBaseView\'', + 'Public property \'views\' of exported class has or is using private name \'GridBaseView\'' + // #endregion +]; + +function deleteJQueryComponents(cb) { + del.sync(jQueryComponentsGlob); + cb(); +} + +function generateJQueryComponents(isWatch) { + const generator = new InfernoGenerator(); + generator.options = { + ...BASE_GENERATOR_OPTIONS_WITH_JQUERY, + generateJQueryOnly: true + }; + + + const pipe = isWatch ? + watch(SRC).on('ready', () => console.log( + 'generate-jquery-components task is watching for changes...' + )) : gulp.src(SRC); + + return pipe + .pipe(generateComponents(generator)) + .pipe(plumber(()=>null)) + .pipe(gulp.dest('js/renovation/')); +} + +const context = require('../context.js'); +const { ifEsmPackage } = require('../utils'); + +const processErrors = (knownErrors, errors = []) => (e) => { + if(!knownErrors.some(i => e.message.includes(i))) { + errors.push(e); + console.log(e.message); + } +}; + +function generateInfernoComponents(distPath = './', babelConfig = transpileConfig.cjs, dev) { + return function generateInfernoComponents(done) { + const tsProject = ts.createProject('build/gulp/generator/ts-configs/inferno.tsconfig.json'); + + generator.options = BASE_GENERATOR_OPTIONS_WITH_JQUERY; + + const errors = []; + const isNotDTS = (file) => !file.path.endsWith('.d.ts'); + const isDefault = distPath === './'; + + return gulp.src(SRC, { base: 'js' }) + .pipe(gulpIf(dev, cached('generate-inferno-component'))) + .pipe(generateComponents(generator)) + .pipe(plumber(() => null)) + .pipe(tsProject({ + error: processErrors(knownErrors, errors), + finish() {} + })) + .pipe(gulpIf(isNotDTS, babel(babelConfig))) + .pipe(gulpIf(isDefault, gulp.dest(context.TRANSPILED_PATH))) + .pipe(gulpIf(isDefault, gulp.dest(context.TRANSPILED_RENOVATION_PATH))) + .pipe(gulpIf(isDefault, gulp.dest(context.TRANSPILED_PROD_RENOVATION_PATH))) + .pipe(gulpIf(esmPackage, gulp.dest(path.join(context.TRANSPILED_PROD_ESM_PATH, distPath)))) + .on('end', function() { + done(/* !dev && errors.length || undefined*/); + }); + }; +} + +function processRenovationMeta() { + const widgetsMeta = generator + .getComponentsMeta() + .filter(meta => + meta.decorator && + meta.decorator.jQuery && + meta.decorator.jQuery.register === 'true' && + fs.existsSync(meta.path)); + + const metaJson = JSON.stringify(widgetsMeta.map(meta => ({ + widgetName: `dx${meta.name}`, + ...meta, + path: path.relative(COMPAT_TESTS_PARTS, meta.path).replace(/\\/g, '/') + })), null, 2); + + return file('widgets.json', metaJson, { src: true }) + .pipe(gulp.dest(COMPAT_TESTS_PARTS)); +} + +gulp.task('generate-jquery-components-clean', deleteJQueryComponents); + +gulp.task('generate-jquery-components-run', function generateJQuery() { + return generateJQueryComponents(false); +}); + +gulp.task('generate-jquery-components', gulp.series('generate-jquery-components-clean', 'generate-jquery-components-run')); + +gulp.task('generate-jquery-components-watch', function watchJQueryComponents() { + return generateJQueryComponents(true); +}); + +gulp.task('generate-components', gulp.series( + 'generate-jquery-components', + generateInfernoComponents(), + ifEsmPackage(generateInfernoComponents('./esm', transpileConfig.esm)), + ifEsmPackage(generateInfernoComponents('./cjs', transpileConfig.cjs)), + processRenovationMeta +)); + +gulp.task('generate-components-dev', gulp.series( + 'generate-jquery-components', + generateInfernoComponents('./', transpileConfig.cjs, true), + processRenovationMeta +)); + +gulp.task('generate-inferno-components-watch', function() { + gulp + .watch(SRC, gulp.series( + generateInfernoComponents('./', transpileConfig.cjs, true) + )) + .on('ready', () => console.log( + 'generate-inferno-components task is watching for changes...' + )); +}); + +function addGenerationTask( + frameworkName, + knownErrors = [], + compileTs = true, + copyArtifacts = false, + babelGeneratedFiles = true +) { + const frameworkDest = `artifacts/${frameworkName}`; + const generator = require(`@devextreme-generator/${frameworkName}`).default; + let tsProject = () => () => { }; + if(compileTs) { + tsProject = ts.createProject(`build/gulp/generator/ts-configs/${frameworkName}.tsconfig.json`); + } + + generator.options = BASE_GENERATOR_OPTIONS; + + function compileComponents(done) { + const errors = []; + const frameworkIgnorePaths = IGNORE_PATHS_BY_FRAMEWORKS[frameworkName]; + + return gulp.src([ + ...SRC, + ...frameworkIgnorePaths, + '!js/renovation/component_wrapper/**/*.*', + ], { base: 'js' }) + .pipe(generateComponents(generator)) + .pipe(plumber(() => null)) + .pipe(gulpIf(compileTs, tsProject({ + error: processErrors(knownErrors, errors), + finish() { } + }))).on('end', function() { + done(errors.map(e => e.message).join('\n') || undefined); + }); + } + + gulp.task(`${frameworkName}-compilation-check`, compileComponents); + + gulp.task(`generate-${frameworkName}-declaration-only`, function(done) { + return compileComponents(done) + .pipe(gulpIf(babelGeneratedFiles, babel(transpileConfig.cjs))) + .pipe(gulp.dest(frameworkDest)); + }); + + const frameworkSrc = `./artifacts/${frameworkName}`; + const artifactsSrc = ['./artifacts/css/**/*', `${frameworkSrc}/**/*`]; + + const generateSeries = [ + function cleanFrameworkArtifacts(cb) { + del.sync(frameworkSrc); + cb(); + }, + `generate-${frameworkName}-declaration-only`, + function() { + return gulp.src(COMMON_SRC) + .pipe( + gulpIf( + file => file.extname === '.js', + babel(transpileConfig.cjs) + ) + ) + .pipe(gulp.dest(frameworkDest)); + }]; + + if(copyArtifacts) { + const dest = `./playground/${frameworkName}/src/artifacts`; + generateSeries.push(function cleanFrameworkPlayground(cb) { + del.sync(dest); + cb(); + }); + generateSeries.push(function copyArtifacts() { + return gulp.src(artifactsSrc, { base: './artifacts/' }) + .pipe(gulp.dest(dest)); + }); + } + + gulp.task(`generate-${frameworkName}`, gulp.series(...generateSeries)); + + const watchTasks = [ + function() { + watch(COMMON_SRC) + .pipe(plumber({ + errorHandler: notify.onError('Error: <%= error.message %>') + .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation + })) + .pipe( + gulpIf( + file => file.extname === '.js', + babel(transpileConfig.cjs) + ) + ) + .pipe(gulp.dest(frameworkDest)); + }, + function declarationBuild() { + gulp.watch(SRC, gulp.series(`generate-${frameworkName}-declaration-only`)); + } + ]; + + if(copyArtifacts) { + watchTasks.push(function copyArtifacts() { + return gulp.src(artifactsSrc, { base: './artifacts/' }) + .pipe(watch(artifactsSrc, { base: './artifacts/', readDelay: 1000 })) + .pipe(gulp.dest(`./playground/${frameworkName}/src/artifacts`)); + }); + } + + gulp.task(`generate-${frameworkName}-watch`, gulp.series( + `generate-${frameworkName}`, + gulp.parallel(...watchTasks) + )); +} + +// addGenerationTask('react', +// ['Cannot find module \'csstype\'.'].concat(knownErrors), +// true, +// true, +// false +// ); +addGenerationTask('angular', [ + 'Cannot find module \'@angular/core\'', + 'Cannot find module \'@angular/common\'', + 'Cannot find module \'@angular/forms\'', + 'Cannot find module \'@angular/cdk/portal\'', + 'Cannot find module \'inferno\'', + 'Cannot find module \'inferno-create-element\'', +].concat(knownErrors)); + +addGenerationTask('vue', [], false, true, false); + +gulp.task('generate-components-watch', gulp.series('generate-components', function() { + gulp + .watch(SRC, gulp.series('generate-components-dev')) + .on('ready', () => console.log( + 'generate-components task is watching for changes...' + )); +})); + +// gulp.task('native-components-compilation-check', gulp.series('react-compilation-check', 'angular-compilation-check')); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/angular.tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/angular.tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..9b23843f68a6dd7be46b8e42a5aa64c2669d0b29 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/angular.tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "moduleResolution": "node" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/inferno.tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/inferno.tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..404df96b053fe0e4b7e482ba200c5563d0e95b5c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/inferno.tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "moduleResolution": "node", + "isolatedModules": true, + "allowSyntheticDefaultImports": true + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/jest.tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/jest.tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..c9a73cdfe9f0f2085ee676112d258d23fad91d4e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/jest.tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsxFactory": "h" + } + } + \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/react.tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/react.tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..79d42184b91efc68f1726c51127d77b3f8ca728d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/react.tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..f3f24fbb3aea1951d469ce6113a2fed73426c99e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/generator/ts-configs/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "strict": false, + "esModuleInterop": false, + "typeRoots": ["node_modules/@types"], + "forceConsistentCasingInFileNames": true, + // "jsx": "react", + "declaration": true + }, + "exclude": [ + "node_modules" + ] +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/gulp-data-uri.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/gulp-data-uri.js new file mode 100644 index 0000000000000000000000000000000000000000..ae160afd214643198dd6e55a200c2bade5ec598f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/gulp-data-uri.js @@ -0,0 +1,43 @@ +'use strict'; + +const replace = require('gulp-replace'); +const path = require('path'); +const fs = require('fs'); +const sass = require('sass'); +const dataUriRegex = /data-uri\((?:'(image\/svg\+xml;charset=UTF-8)',\s)?['"]?([^)'"]+)['"]?\)/g; + +const svg = (buffer, svgEncoding) => { + const encoding = svgEncoding || 'image/svg+xml;charset=UTF-8'; + const svg = encodeURIComponent(buffer.toString()); + return `"data:${encoding},${svg}"`; +}; + +const img = (buffer, ext) => { + return `"data:image/${ext};base64,${buffer.toString('base64')}"`; +}; + +const handler = (_, svgEncoding, fileName) => { + const relativePath = path.join(__dirname, '..', '..', fileName); + const filePath = path.resolve(relativePath); + const ext = filePath.split('.').pop(); + const data = fs.readFileSync(filePath); + const buffer = Buffer.from(data); + const escapedString = ext === 'svg' ? svg(buffer, svgEncoding) : img(buffer, ext); + return `url(${escapedString})`; +}; + +const sassFunction = (args) => { + const hasEncoding = args.getLength() === 2; + const encoding = hasEncoding ? args.getValue(0).getValue() : null; + const url = hasEncoding ? args.getValue(1).getValue() : args.getValue(0).getValue(); + + return new sass.types.String(handler(null, encoding, url)); +}; + +module.exports = { + gulpPipe: () => replace(dataUriRegex, handler), + resolveDataUri: (content) => content.replace(dataUriRegex, handler), + sassFunctions: { + 'data-uri($args...)': sassFunction + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/header-pipes.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/header-pipes.js new file mode 100644 index 0000000000000000000000000000000000000000..05ab4396d1be82af2d1b78fc86009f97375b473a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/header-pipes.js @@ -0,0 +1,30 @@ +'use strict'; + +const fs = require('fs'); +const lazyPipe = require('lazypipe'); +const header = require('gulp-header'); +const path = require('path'); + +const context = require('./context.js'); + +const licenseTemplate = fs.readFileSync(path.join(__dirname, './license-header.txt'), 'utf8'); + +const useStrict = lazyPipe().pipe(function() { + return header('"use strict";\n\n'); +}); + +function makeLicensePipe(commentType) { + return lazyPipe().pipe(function() { + return header(licenseTemplate, { + commentType: commentType, + version: context.version.product, + eula: context.EULA_URL + }); + }); +} + +module.exports = { + useStrict: useStrict, + bangLicense: makeLicensePipe('!'), + starLicense: makeLicensePipe('*') +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/js-bundles.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/js-bundles.js new file mode 100644 index 0000000000000000000000000000000000000000..461a7988fa074348a79c990530ee9f44f34fd6a1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/js-bundles.js @@ -0,0 +1,95 @@ +'use strict'; + +const gulp = require('gulp'); +const gulpIf = require('gulp-if'); +const lazyPipe = require('lazypipe'); +const named = require('vinyl-named'); +const notify = require('gulp-notify'); +const path = require('path'); +const plumber = require('gulp-plumber'); +const webpack = require('webpack'); +const webpackStream = require('webpack-stream'); + +const compressionPipes = require('./compression-pipes.js'); +const ctx = require('./context.js'); +const headerPipes = require('./header-pipes.js'); +const webpackConfig = require('../../webpack.config.js'); + +const namedDebug = lazyPipe() + .pipe(named, (file) => path.basename(file.path, path.extname(file.path)) + '.debug'); + +const BUNDLES = [ + '/bundles/dx.all.js', + '/bundles/dx.web.js', + '/bundles/dx.viz.js' +]; + +const DEBUG_BUNDLES = BUNDLES.concat([ '/bundles/dx.custom.js' ]); + +const processBundles = (bundles, pathPrefix) => bundles.map((bundle) => pathPrefix + bundle); +const muteWebPack = () => undefined; + +const bundleProdPipe = lazyPipe() + .pipe(named) + .pipe(() => webpackStream(webpackConfig, webpack, muteWebPack)) + .pipe(headerPipes.useStrict) + .pipe(headerPipes.bangLicense) + .pipe(compressionPipes.minify); + +const jsBundlesProd = (src, dist, bundles) => (() => + gulp.src(processBundles(bundles, src)) + .pipe(bundleProdPipe()) + .pipe(gulp.dest(dist)) +); + +gulp.task('js-bundles-prod', + jsBundlesProd(ctx.TRANSPILED_PROD_RENOVATION_PATH, + ctx.RESULT_JS_PATH, BUNDLES + ) +); + +function prepareDebugMeta(watch) { + const debugConfig = Object.assign({ watch }, webpackConfig); + const bundlesPath = ctx.TRANSPILED_PROD_RENOVATION_PATH; + + const bundles = processBundles(DEBUG_BUNDLES, bundlesPath); + + debugConfig.output = Object.assign({}, webpackConfig.output); + debugConfig.output['pathinfo'] = true; + debugConfig.mode = watch ? "development" : "production"; + + if(!ctx.uglify) { + debugConfig.devtool = 'eval-source-map'; + } + + return { debugConfig, bundles }; +} + +function createDebugBundlesStream(watch) { + const { debugConfig, bundles } = prepareDebugMeta(watch); + const destination = ctx.RESULT_JS_PATH; + + const task = () => gulp.src(bundles) + .pipe(namedDebug()) + .pipe(gulpIf(watch, plumber({ + errorHandler: notify.onError('Error: <%= error.message %>') + .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation + }))) + .pipe(webpackStream(debugConfig, webpack, muteWebPack)) + .pipe(headerPipes.useStrict()) + .pipe(headerPipes.bangLicense()) + .pipe(gulpIf(!watch, compressionPipes.beautify())) + .pipe(gulp.dest(destination)); + + task.displayName = 'js-bundles-debug'; + + return task; +} + +gulp.task('js-bundles-debug', gulp.series( + createDebugBundlesStream(false) +)); + +gulp.task('js-bundles-watch', gulp.parallel( + createDebugBundlesStream(true) +)); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/license-header.txt b/packages/f-theme-editor/farris-theme-editor/build/gulp/license-header.txt new file mode 100644 index 0000000000000000000000000000000000000000..5a8fe2bd76cbec4371d6f826a32a32676f6446ef --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/license-header.txt @@ -0,0 +1,8 @@ +/*<%= commentType %> +* DevExtreme (<%= file.relative.replace(/\\/g, '/') %>) +* Version: <%= version %> +* Build date: <%= (new Date()).toDateString() %> +* +* Copyright (c) 2012 - <%= (new Date()).getFullYear() %> Developer Express Inc. ALL RIGHTS RESERVED +* Read about DevExtreme licensing here: <%= eula %> +*/ diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/localization-template.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/localization-template.jst new file mode 100644 index 0000000000000000000000000000000000000000..43dffba193b4ef40c729dded3428b459754c4e98 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/localization-template.jst @@ -0,0 +1,13 @@ +(function(root, factory) { + if(typeof define === 'function' && define.amd) { + define(function(require) { + factory(require("devextreme/localization")); + }); + } else if(typeof module === "object" && module.exports) { + factory(require("devextreme/localization")); + } else { + factory(DevExpress.localization); + } +}(this, function(localization) { + localization.loadMessages(<%= json %>); +})); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/localization.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/localization.js new file mode 100644 index 0000000000000000000000000000000000000000..16aa7eb954ed0462f97f3099f1c7067423c64092 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/localization.js @@ -0,0 +1,164 @@ +'use strict'; + +const gulp = require('gulp'); +const path = require('path'); +const rename = require('gulp-rename'); +const template = require('gulp-template'); +const lint = require('gulp-eslint'); +const fs = require('fs'); + +const headerPipes = require('./header-pipes.js'); +const compressionPipes = require('./compression-pipes.js'); +const context = require('./context.js'); + +const Cldr = require('cldrjs'); +const locales = require('cldr-core/availableLocales.json').availableLocales.full; +const weekData = require('cldr-core/supplemental/weekData.json'); +const likelySubtags = require('cldr-core/supplemental/likelySubtags.json'); +const parentLocales = require('../../node_modules/cldr-core/supplemental/parentLocales.json').supplemental.parentLocales.parentLocale; + +const PARENT_LOCALE_SEPARATOR = '-'; + +const getParentLocale = (parentLocales, locale) => { + const parentLocale = parentLocales[locale]; + + if(parentLocale) { + return parentLocale !== 'root' && parentLocale; + } + + return locale.substr(0, locale.lastIndexOf(PARENT_LOCALE_SEPARATOR)); +}; + +const firstDayOfWeekData = function() { + const DAY_INDEXES = { + 'sun': 0, + 'mon': 1, + 'tue': 2, + 'wed': 3, + 'thu': 4, + 'fri': 5, + 'sat': 6 + }; + const DEFAULT_DAY_OF_WEEK_INDEX = 0; + + const result = {}; + + Cldr.load(weekData, likelySubtags); + + const getFirstIndex = (locale) => { + const firstDay = new Cldr(locale).supplemental.weekData.firstDay(); + return DAY_INDEXES[firstDay]; + }; + + locales.forEach(function(locale) { + const firstDayIndex = getFirstIndex(locale); + + const parentLocale = getParentLocale(parentLocales, locale); + if(firstDayIndex !== DEFAULT_DAY_OF_WEEK_INDEX && (!parentLocale || firstDayIndex !== getFirstIndex(parentLocale))) { + result[locale] = firstDayIndex; + } + }); + + return result; +}; + +const accountingFormats = function() { + const result = {}; + + locales.forEach(function(locale) { + const dataFilePath = `../../node_modules/cldr-numbers-full/main/${locale}/numbers.json`; + + if(fs.existsSync(path.join(__dirname, dataFilePath))) { + const numbersData = require(dataFilePath); + result[locale] = numbersData.main[locale].numbers['currencyFormats-numberSystem-latn'].accounting; + } + }); + + return result; +}; + +const RESULT_PATH = path.join(context.RESULT_JS_PATH, 'localization'); +const DICTIONARY_SOURCE_FOLDER = 'js/localization/messages'; + +const getLocales = function(directory) { + return fs.readdirSync(directory).map(file => { + return file.split('.')[0]; + }); +}; + +const serializeObject = function(obj, shift) { + const tab = ' '; + let result = JSON.stringify(obj, null, tab); + + if(shift) { + result = result.replace(/(\n)/g, '$1' + tab); + } + + return result; +}; + +const getMessages = function(directory, locale) { + const json = require(path.join('../../', directory, locale + '.json')); + + return serializeObject(json, true); +}; + +gulp.task('localization-messages', gulp.parallel(getLocales(DICTIONARY_SOURCE_FOLDER).map(locale => Object.assign( + function() { + return gulp + .src('build/gulp/localization-template.jst') + .pipe(template({ + json: getMessages(DICTIONARY_SOURCE_FOLDER, locale) + })) + .pipe(rename(['dx', 'messages', locale, 'js'].join('.'))) + .pipe(compressionPipes.beautify()) + .pipe(headerPipes.useStrict()) + .pipe(headerPipes.bangLicense()) + .pipe(gulp.dest(RESULT_PATH)); + }, + { displayName: 'dx.messages.' + locale } +)))); + +gulp.task('localization-generated-sources', gulp.parallel([ + { + data: require('../../js/localization/messages/en.json'), + filename: 'default_messages.js', + exportName: 'defaultMessages', + destination: 'js/localization' + }, + { + data: parentLocales, + filename: 'parent_locales.js', + destination: 'js/localization/cldr-data' + }, + { + data: firstDayOfWeekData(), + filename: 'first_day_of_week_data.js', + destination: 'js/localization/cldr-data' + }, + { + data: accountingFormats(), + filename: 'accounting_formats.js', + destination: 'js/localization/cldr-data' + + } +].map((source) => Object.assign( + function() { + return gulp + .src('build/gulp/generated_js.jst') + .pipe(template({ + exportName: source.exportName, + json: serializeObject(source.data) + })) + .pipe(lint({ + fix: true, + configFile: '.eslintrc.js' + })) + .pipe(lint.format()) + .pipe(rename(source.filename)) + .pipe(gulp.dest(source.destination)); + }, + { displayName: source.filename } +)))); + +gulp.task('localization', gulp.series('localization-messages', 'localization-generated-sources')); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/modules_metadata.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/modules_metadata.json new file mode 100644 index 0000000000000000000000000000000000000000..42811d55fb1823ca5a74f3834654478649aebf5d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/modules_metadata.json @@ -0,0 +1,856 @@ +[ + { + "name": "animation/frame", + "exports": { + "cancelAnimationFrame": { "path": "utils.cancelAnimationFrame" }, + "requestAnimationFrame": { "path": "utils.requestAnimationFrame" } + } + }, + { + "name": "animation/fx", + "exports": { + "default": { "path": "fx" } + } + }, + { + "name": "animation/presets", + "exports": { + "default": { "path": "animationPresets" } + } + }, + { + "name": "animation/transition_executor", + "exports": { + "default": { "path": "TransitionExecutor" } + } + }, + { + "name": "core/component_registrator", + "exports": { + "default": { "path": "registerComponent" } + } + }, + { + "name": "core/config", + "exports": { + "default": { "path": "config" } + } + }, + { + "name": "core/devices", + "exports": { + "default": { "path": "devices" } + } + }, + { + "name": "core/dom_component", + "exports": { + "default": { "path": "DOMComponent" }, + "Options": { "path": "DOMComponentOptions", "exportAs": "type" } + } + }, + { + "name": "core/element", + "exports": { + "dxElement": { "path": "core.dxElement", "exportAs": "type" } + } + }, + { + "name": "core/guid", + "exports": { + "default": { "path": "data.Guid" } + } + }, + { + "name": "core/set_template_engine", + "exports": { + "default": { "path": "setTemplateEngine" } + } + }, + { + "name": "data/apply_changes", + "exports": { + "default": { "path": "data.applyChanges" } + } + }, + { + "name": "data/array_store", + "exports": { + "default": { "path": "data.ArrayStore" } + } + }, + { + "name": "data/custom_store", + "exports": { + "default": { "path": "data.CustomStore" } + } + }, + { + "name": "data/data_source", + "exports": { + "default": { "path": "data.DataSource" } + } + }, + { + "name": "data/endpoint_selector", + "exports": { + "default": { "path": "EndpointSelector" } + } + }, + { + "name": "data/errors", + "exports": { + "errorHandler": { "path": "data.errorHandler" } + } + }, + { + "name": "data/index", + "exports": { + "LoadOptions": { "path": "data.LoadOptions", "exportAs": "type" } + } + }, + { + "name": "data/local_store", + "exports": { + "default": { "path": "data.LocalStore" } + } + }, + { + "name": "data/odata/context", + "exports": { + "default": { "path": "data.ODataContext" } + } + }, + { + "name": "data/odata/store", + "exports": { + "default": { "path": "data.ODataStore" } + } + }, + { + "name": "data/odata/utils", + "exports": { + "EdmLiteral": { "path": "data.EdmLiteral" }, + "keyConverters": { "path": "data.utils.odata.keyConverters" } + } + }, + { + "name": "data/query", + "exports": { + "default": { "path": "data.query" } + } + }, + { + "name": "data/utils", + "exports": { + "base64_encode": { "path": "data.base64_encode" } + } + }, + { + "name": "events/click" + }, + { + "name": "events/contextmenu" + }, + { + "name": "events/dblclick" + }, + { + "name": "events/drag" + }, + { + "name": "events/hold" + }, + { + "name": "events/hover" + }, + { + "name": "events/pointer" + }, + { + "name": "events/swipe" + }, + { + "name": "events/transform" + }, + { + "name": "events", + "exports": { + "on": { "path": "events.on" }, + "one": { "path": "events.one" }, + "off": { "path": "events.off" }, + "trigger": { "path": "events.trigger" }, + "triggerHandler": { "path": "events.triggerHandler" } + } + }, + { + "name": "file_management/error", + "exports": { + "default": { "path": "fileManagement.FileSystemError" } + } + }, + { + "name": "file_management/file_system_item", + "exports": { + "default": { "path": "fileManagement.FileSystemItem" } + } + }, + { + "name": "file_management/custom_provider", + "exports": { + "default": { "path": "fileManagement.CustomFileSystemProvider" } + } + }, + { + "name": "file_management/object_provider", + "exports": { + "default": { "path": "fileManagement.ObjectFileSystemProvider" } + } + }, + { + "name": "file_management/remote_provider", + "exports": { + "default": { "path": "fileManagement.RemoteFileSystemProvider" } + } + }, + { + "name": "integration/jquery" + }, + { + "name": "localization", + "exports": { + "loadMessages": { "path": "localization.loadMessages" }, + "formatMessage": { "path": "localization.formatMessage" }, + "formatNumber": { "path": "localization.formatNumber" }, + "parseNumber": { "path": "localization.parseNumber" }, + "formatDate": { "path": "localization.formatDate" }, + "parseDate": { "path": "localization.parseDate" }, + "locale": { "path": "localization.locale" } + } + }, + { + "name": "mobile/hide_top_overlay", + "exports": { + "default": { "path": "hideTopOverlay" } + } + }, + { + "name": "mobile/init_mobile_viewport", + "exports": { + "default": { "path": "utils.initMobileViewport" } + } + }, + { + "name": "ui/speed_dial_action", + "exports": { + "default": { "path": "ui.dxSpeedDialAction", "isWidget": true } + } + }, + { + "name": "ui/accordion", + "exports": { + "default": { "path": "ui.dxAccordion", "isWidget": true } + } + }, + { + "name": "ui/action_sheet", + "exports": { + "default": { "path": "ui.dxActionSheet", "isWidget": true } + } + }, + { + "name": "ui/autocomplete", + "exports": { + "default": { "path": "ui.dxAutocomplete", "isWidget": true } + } + }, + { + "name": "ui/box", + "exports": { + "default": { "path": "ui.dxBox", "isWidget": true } + } + }, + { + "name": "ui/button", + "exports": { + "default": { "path": "ui.dxButton", "isWidget": true } + } + }, + { + "name": "ui/button_group", + "exports": { + "default": { "path": "ui.dxButtonGroup", "isWidget": true } + } + }, + { + "name": "ui/calendar", + "exports": { + "default": { "path": "ui.dxCalendar", "isWidget": true } + } + }, + { + "name": "ui/check_box", + "exports": { + "default": { "path": "ui.dxCheckBox", "isWidget": true } + } + }, + { + "name": "ui/color_box", + "exports": { + "default": { "path": "ui.dxColorBox", "isWidget": true } + } + }, + { + "name": "ui/context_menu", + "exports": { + "default": { "path": "ui.dxContextMenu", "isWidget": true } + } + }, + { + "name": "ui/data_grid", + "exports": { + "default": { "path": "ui.dxDataGrid", "isWidget": true }, + "Column": { "path": "ui.dxDataGridColumn", "exportAs": "type" } + } + }, + { + "name": "ui/date_box", + "exports": { + "default": { "path": "ui.dxDateBox", "isWidget": true } + } + }, + { + "name": "ui/defer_rendering", + "exports": { + "default": { "path": "ui.dxDeferRendering", "isWidget": true } + } + }, + { + "name": "ui/diagram", + "exports": { + "default": { "path": "ui.dxDiagram", "isWidget": true } + } + }, + { + "name": "ui/dialog", + "exports": { + "alert": { "path": "ui.dialog.alert" }, + "confirm": { "path": "ui.dialog.confirm" }, + "custom": { "path": "ui.dialog.custom" } + } + }, + { + "name": "ui/draggable", + "exports": { + "default": { "path": "ui.dxDraggable", "isWidget": true } + } + }, + { + "name": "ui/drawer", + "exports": { + "default": { "path": "ui.dxDrawer", "isWidget": true } + } + }, + { + "name": "ui/drop_down_box", + "exports": { + "default": { "path": "ui.dxDropDownBox", "isWidget": true } + } + }, + { + "name": "ui/drop_down_button", + "exports": { + "default": { + "path": "ui.dxDropDownButton", + "isWidget": true + } + } + }, + { + "name": "ui/drop_down_editor/ui.drop_down_editor", + "isInternal": true, + "exports": { + "default": { "path": "ui.dxDropDownEditor" } + } + }, + { + "name": "ui/file_uploader", + "exports": { + "default": { "path": "ui.dxFileUploader", "isWidget": true } + } + }, + { + "name": "ui/filter_builder", + "exports": { + "default": { "path": "ui.dxFilterBuilder", "isWidget": true } + } + }, + { + "name": "ui/file_manager", + "exports": { + "default": { "path": "ui.dxFileManager", "isWidget": true } + } + }, + { + "name": "ui/form", + "exports": { + "default": { "path": "ui.dxForm", "isWidget": true } + } + }, + { + "name": "ui/gallery", + "exports": { + "default": { "path": "ui.dxGallery", "isWidget": true } + } + }, + { + "name": "ui/gantt", + "exports": { + "default": { "path": "ui.dxGantt", "isWidget": true } + } + }, + { + "name": "ui/html_editor", + "exports": { + "default": { "path": "ui.dxHtmlEditor", "isWidget": true } + } + }, + { + "name": "ui/list", + "exports": { + "default": { "path": "ui.dxList", "isWidget": true } + } + }, + { + "name": "ui/load_indicator", + "exports": { + "default": { "path": "ui.dxLoadIndicator", "isWidget": true } + } + }, + { + "name": "ui/load_panel", + "exports": { + "default": { "path": "ui.dxLoadPanel", "isWidget": true } + } + }, + { + "name": "ui/lookup", + "exports": { + "default": { "path": "ui.dxLookup", "isWidget": true } + } + }, + { + "name": "ui/map", + "exports": { + "default": { "path": "ui.dxMap", "isWidget": true } + } + }, + { + "name": "ui/menu", + "exports": { + "default": { "path": "ui.dxMenu", "isWidget": true } + } + }, + { + "name": "ui/multi_view", + "exports": { + "default": { "path": "ui.dxMultiView", "isWidget": true } + } + }, + { + "name": "ui/nav_bar", + "exports": { + "default": { "path": "ui.dxNavBar", "isWidget": true } + } + }, + { + "name": "ui/notify", + "exports": { + "default": { "path": "ui.notify" } + } + }, + { + "name": "ui/speed_dial_action/repaint_floating_action_button", + "exports": { + "default": { "path": "ui.repaintFloatingActionButton" } + } + }, + { + "name": "ui/number_box", + "exports": { + "default": { "path": "ui.dxNumberBox", "isWidget": true } + } + }, + { + "name": "ui/overlay", + "exports": { + "default": { "path": "ui.dxOverlay" }, + "baseZIndex": { "path": "ui.dxOverlay.baseZIndex" } + } + }, + { + "name": "ui/pivot_grid", + "exports": { + "default": { "path": "ui.dxPivotGrid", "isWidget": true } + } + }, + { + "name": "ui/pivot_grid/data_source", + "exports": { + "default": { "path": "data.PivotGridDataSource" } + } + }, + { + "name": "ui/pivot_grid/xmla_store", + "exports": { + "default": { "path": "data.XmlaStore" } + } + }, + { + "name": "ui/pivot_grid_field_chooser", + "exports": { + "default": { "path": "ui.dxPivotGridFieldChooser", "isWidget": true } + } + }, + { + "name": "ui/popover", + "exports": { + "default": { "path": "ui.dxPopover", "isWidget": true } + } + }, + { + "name": "ui/popup", + "exports": { + "default": { "path": "ui.dxPopup", "isWidget": true }, + "ToolbarItem": { "path": "ui.dxPopupToolbarItem", "exportAs": "type" } + } + }, + { + "name": "ui/progress_bar", + "exports": { + "default": { "path": "ui.dxProgressBar", "isWidget": true } + } + }, + { + "name": "ui/radio_group", + "exports": { + "default": { "path": "ui.dxRadioGroup", "isWidget": true } + } + }, + { + "name": "ui/range_slider", + "exports": { + "default": { "path": "ui.dxRangeSlider", "isWidget": true } + } + }, + { + "name": "ui/resizable", + "exports": { + "default": { "path": "ui.dxResizable", "isWidget": true } + } + }, + { + "name": "ui/recurrence_editor", + "isInternal": true, + "exports": { + "default": { "path": "ui.dxRecurrenceEditor", "isWidget": true } + } + }, + { + "name": "ui/responsive_box", + "exports": { + "default": { "path": "ui.dxResponsiveBox", "isWidget": true } + } + }, + { + "name": "ui/scheduler", + "exports": { + "default": { "path": "ui.dxScheduler", "isWidget": true } + } + }, + { + "name": "time_zone_utils", + "exports": { + "getTimeZones": { "path": "utils.getTimeZones" } + } + }, + { + "name": "ui/scroll_view", + "exports": { + "default": { "path": "ui.dxScrollView", "isWidget": true } + } + }, + { + "name": "ui/scroll_view/scrollable", + "exports": { + "Options": { "path": "ui.dxScrollableOptions", "exportAs": "type" } + } + }, + { + "name": "ui/select_box", + "exports": { + "default": { "path": "ui.dxSelectBox", "isWidget": true } + } + }, + { + "name": "ui/set_template_engine", + "exports": { + "default": { "path": "setTemplateEngine" } + } + }, + { + "name": "ui/slide_out", + "exports": { + "default": { "path": "ui.dxSlideOut", "isWidget": true } + } + }, + { + "name": "ui/slide_out_view", + "exports": { + "default": { "path": "ui.dxSlideOutView", "isWidget": true } + } + }, + { + "name": "ui/slider", + "exports": { + "default": { "path": "ui.dxSlider", "isWidget": true } + } + }, + { + "name": "ui/sortable", + "exports": { + "default": { "path": "ui.dxSortable", "isWidget": true } + } + }, + { + "name": "ui/switch", + "exports": { + "default": { "path": "ui.dxSwitch", "isWidget": true } + } + }, + { + "name": "ui/tab_panel", + "exports": { + "default": { "path": "ui.dxTabPanel", "isWidget": true } + } + }, + { + "name": "ui/tabs", + "exports": { + "default": { "path": "ui.dxTabs", "isWidget": true } + } + }, + { + "name": "ui/tag_box", + "exports": { + "default": { "path": "ui.dxTagBox", "isWidget": true } + } + }, + { + "name": "ui/text_area", + "exports": { + "default": { "path": "ui.dxTextArea", "isWidget": true } + } + }, + { + "name": "ui/text_box", + "exports": { + "default": { "path": "ui.dxTextBox", "isWidget": true } + } + }, + { + "name": "ui/themes", + "exports": { + "default": { "path": "ui.themes" } + } + }, + { + "name": "ui/tile_view", + "exports": { + "default": { "path": "ui.dxTileView", "isWidget": true } + } + }, + { + "name": "ui/toast", + "exports": { + "default": { "path": "ui.dxToast", "isWidget": true } + } + }, + { + "name": "ui/toolbar", + "exports": { + "default": { "path": "ui.dxToolbar", "isWidget": true } + } + }, + { + "name": "ui/tooltip", + "exports": { + "default": { "path": "ui.dxTooltip", "isWidget": true } + } + }, + { + "name": "ui/tree_list", + "exports": { + "default": { "path": "ui.dxTreeList", "isWidget": true } + } + }, + { + "name": "ui/tree_view", + "exports": { + "default": { "path": "ui.dxTreeView", "isWidget": true } + } + }, + { + "name": "ui/validation_engine", + "exports": { + "default": { "path": "validationEngine" } + } + }, + { + "name": "ui/validation_group", + "exports": { + "default": { "path": "ui.dxValidationGroup", "isWidget": true } + } + }, + { + "name": "ui/validation_summary", + "exports": { + "default": { "path": "ui.dxValidationSummary", "isWidget": true } + } + }, + { + "name": "ui/validator", + "exports": { + "default": { "path": "ui.dxValidator", "isWidget": true } + } + }, + { + "name": "ui/widget/template", + "exports": { + "Template": { "path": "ui.template", "exportAs": "type" } + } + }, + { + "name": "utils", + "exports": { + "compileGetter": { "path": "data.utils.compileGetter" }, + "compileSetter": { "path": "data.utils.compileSetter" } + } + }, + { + "name": "viz/bar_gauge", + "exports": { + "default": { "path": "viz.dxBarGauge", "isWidget": true } + } + }, + { + "name": "viz/bullet", + "exports": { + "default": { "path": "viz.dxBullet", "isWidget": true } + } + }, + { + "name": "viz/chart", + "exports": { + "default": { "path": "viz.dxChart", "isWidget": true } + } + }, + { + "name": "viz/circular_gauge", + "exports": { + "default": { "path": "viz.dxCircularGauge", "isWidget": true } + } + }, + { + "name": "viz/export", + "exports": { + "exportFromMarkup": { "path": "viz.exportFromMarkup" }, + "getMarkup": { "path": "viz.getMarkup" }, + "exportWidgets": { "path": "viz.exportWidgets" } + } + }, + { + "name": "viz/funnel", + "exports": { + "default": { "path": "viz.dxFunnel", "isWidget": true } + } + }, + { + "name": "viz/sankey", + "exports": { + "default": { "path": "viz.dxSankey", "isWidget": true } + } + }, + { + "name": "viz/linear_gauge", + "exports": { + "default": { "path": "viz.dxLinearGauge", "isWidget": true } + } + }, + { + "name": "viz/palette", + "exports": { + "currentPalette": { "path": "viz.currentPalette" }, + "getPalette": { "path": "viz.getPalette" }, + "generateColors": { "path": "viz.generateColors" }, + "registerPalette": { "path": "viz.registerPalette" } + } + }, + { + "name": "viz/pie_chart", + "exports": { + "default": { "path": "viz.dxPieChart", "isWidget": true } + } + }, + { + "name": "viz/polar_chart", + "exports": { + "default": { "path": "viz.dxPolarChart", "isWidget": true } + } + }, + { + "name": "viz/range_selector", + "exports": { + "default": { "path": "viz.dxRangeSelector", "isWidget": true } + } + }, + { + "name": "viz/sparkline", + "exports": { + "default": { "path": "viz.dxSparkline", "isWidget": true } + } + }, + { + "name": "viz/themes", + "exports": { + "currentTheme": { "path": "viz.currentTheme" }, + "getTheme": { "path": "viz.getTheme" }, + "refreshTheme": { "path": "viz.refreshTheme" }, + "registerTheme": { "path": "viz.registerTheme" } + } + }, + { + "name": "viz/tree_map", + "exports": { + "default": { "path": "viz.dxTreeMap", "isWidget": true } + } + }, + { + "name": "viz/utils", + "exports": { + "refreshPaths": { "path": "viz.refreshPaths" } + } + }, + { + "name": "viz/vector_map", + "exports": { + "default": { "path": "viz.dxVectorMap", "isWidget": true } + } + }, + { + "name": "viz/vector_map/projection", + "exports": { + "projection": { "path": "viz.map.projection" } + } + } +] diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/npm.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/npm.js new file mode 100644 index 0000000000000000000000000000000000000000..adc2fbddd234c263b92e7f23b0c1e088aaff39f0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/npm.js @@ -0,0 +1,135 @@ +'use strict'; + +require('./ts'); + +const eol = require('gulp-eol'); +const gulp = require('gulp'); +const gulpIf = require('gulp-if'); +const merge = require('merge-stream'); +const replace = require('gulp-replace'); + +const compressionPipes = require('./compression-pipes.js'); +const ctx = require('./context.js'); +const dataUri = require('./gulp-data-uri').gulpPipe; +const headerPipes = require('./header-pipes.js'); +const { packageDir, isEsmPackage } = require('./utils'); +const { version } = require('../../package.json'); + +const resultPath = ctx.RESULT_NPM_PATH; + +const srcGlobsPattern = (path, exclude) => [ + `${path}/**/*.js`, + `!${exclude}/**/*.*`, + `!${path}/bundles/*.js`, + `!${path}/cjs/bundles/**/*`, + `!${path}/esm/bundles/**/*`, + `!${path}/bundles/modules/parts/*.js`, + `!${path}/viz/vector_map.utils/*.js`, + `!${path}/viz/docs/*.js` +]; + +const esmPackageJsonGlobs = [ + `${ctx.TRANSPILED_PROD_ESM_PATH}/**/*.json`, + `!${ctx.TRANSPILED_PROD_ESM_PATH}/viz/vector_map.utils/**/*` +]; + +const esmSrcGlobs = srcGlobsPattern( + ctx.TRANSPILED_PROD_ESM_PATH, + ctx.TRANSPILED_PROD_RENOVATION_PATH +); + +const distGlobsPattern = (jsFolder, exclude) => [ + 'artifacts/**/*.*', + '!artifacts/transpiled**/**/*', + '!artifacts/npm/**/*.*', + '!artifacts/ts/jquery*', + '!artifacts/ts/knockout*', + '!artifacts/ts/globalize*', + '!artifacts/ts/cldr*', + '!artifacts/css/dx-diagram.*', + '!artifacts/css/dx-gantt.*', + `!${jsFolder}/angular**/*.*`, + `!${jsFolder}/angular*`, + `!${jsFolder}/knockout*`, + `!${jsFolder}/cldr/*.*`, + `!${jsFolder}/cldr*`, + `!${jsFolder}/globalize/*.*`, + `!${jsFolder}/globalize*`, + `!${jsFolder}/jquery*`, + `!${jsFolder}/jszip*`, + `!${jsFolder}/dx.custom*`, + `!${jsFolder}/dx.viz*`, + `!${jsFolder}/dx.web*`, + `!${jsFolder}/dx-diagram*`, + `!${jsFolder}/dx-gantt*`, + `!${jsFolder}/dx-quill*`, +]; + +const srcGlobs = esmSrcGlobs; +const distGlobs = distGlobsPattern(ctx.RESULT_JS_PATH); + +const jsonGlobs = ['js/**/*.json', '!js/viz/vector_map.utils/*.*']; + +const sources = (src, dist, distGlob) => (() => merge( + gulp + .src(src) + .pipe(headerPipes.starLicense()) + .pipe(compressionPipes.beautify()) + .pipe(gulp.dest(dist)), + + gulp + .src(esmPackageJsonGlobs) + .pipe(gulpIf(isEsmPackage, gulp.dest(dist))), + + gulp + .src(jsonGlobs) + .pipe(gulp.dest(dist)), + + gulp + .src('build/npm-bin/*.js') + .pipe(eol('\n')) + .pipe(gulp.dest(`${dist}/bin`)), + + gulp + .src('webpack.config.js') + .pipe(gulp.dest(`${dist}/bin`)), + + gulp + .src('package.json') + .pipe(replace(version, ctx.version.package)) + .pipe(gulp.dest(dist)), + + gulp + .src(distGlob) + .pipe(gulp.dest(`${dist}/dist`)), + + gulp + .src('README.md') + .pipe(gulp.dest(dist)) +)); + +const packagePath = `${resultPath}/${packageDir}`; + +gulp.task('npm-sources', gulp.series('ts-sources', sources(srcGlobs, packagePath, distGlobs))); + +const scssDir = `${resultPath}/${packageDir}/scss`; + +gulp.task('npm-sass', gulp.series( + 'create-scss-bundles', + gulp.parallel( + () => gulp + .src('scss/**/*') + .pipe(dataUri()) + .pipe(gulp.dest(scssDir)), + + () => gulp + .src('fonts/**/*', { base: '.' }) + .pipe(gulp.dest(`${scssDir}/widgets/material/typography`)), + + () => gulp + .src('icons/**/*', { base: '.' }) + .pipe(gulp.dest(`${scssDir}/widgets/base`)), + ) +)); + +gulp.task('npm', gulp.series('npm-sources', 'ts-check-public-modules', 'npm-sass')); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-qunit-renovation-widget.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-qunit-renovation-widget.js new file mode 100644 index 0000000000000000000000000000000000000000..c7f99e684321b976daba72262e99675c108f8f91 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-qunit-renovation-widget.js @@ -0,0 +1,12 @@ +'use strict'; +module.exports = ({ name, pathToComponentRegistrator, pathToWrapper, pathInRenovationFolder }) => { + const wrappedComponentImport = pathToWrapper ? + `import { WrappedWidget as Widget } from '${pathToWrapper}';` : + `import Widget from '${pathInRenovationFolder}';`; + return `${wrappedComponentImport} +import registerComponent from '${pathToComponentRegistrator}'; +import { wrapRenovatedWidget } from '/testing/helpers/wrapRenovatedWidget.js'; +const wrappedComponent = wrapRenovatedWidget(Widget); +registerComponent('dx${name}', wrappedComponent); +export default wrappedComponent;`; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-renovation-widget.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-renovation-widget.js new file mode 100644 index 0000000000000000000000000000000000000000..bea4325cccb6e983bec5204ca6cddabd0ca6fd02 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/overwrite-renovation-widget.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = ({ pathInRenovationFolder }) => + `import Widget from '${pathInRenovationFolder}'; +export default Widget;`; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/qunit-in-docker.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/qunit-in-docker.js new file mode 100644 index 0000000000000000000000000000000000000000..08d64e04de156e7ff4d13a387e98600e94fec1d5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/qunit-in-docker.js @@ -0,0 +1,17 @@ +const gulp = require('gulp'); +const shell = require('gulp-shell'); +const parseArguments = require('minimist'); + +gulp.task('qunit-in-docker', (d) => { + const variants = ['export', 'misc', 'ui', 'ui.widgets', 'ui.editors', 'ui.grid', 'ui.scheduler', 'viz', 'renovation']; + const args = parseArguments(process.argv); + const constellation = args['constel']; + if(variants.includes(constellation)) { + return shell.task('docker run --rm -ti -e TARGET=test -e JQUERY=true -e CONSTEL=' + constellation + + ' -e BROWSER=chrome -e LOCAL=true -p 9222:9222 -v ' + process.cwd() + ':/devextreme devexpress/devextreme-build:21_1 ./docker-ci.sh')(); + } else { + console.log('Use one of next variants:'); + variants.forEach(v => console.log(`npm run qunit-in-docker -- ${v}`)); + d(); + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-pipes.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-pipes.js new file mode 100644 index 0000000000000000000000000000000000000000..17b9e69468c2b6eda4730e4f73ff860333189535 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-pipes.js @@ -0,0 +1,63 @@ +'use strict'; + +const env = require('./env-variables'); +const path = require('path'); +const lazyPipe = require('lazypipe'); +const gulpEach = require('gulp-each'); +const gulpIf = require('gulp-if'); + +const renovatedComponentsPath = 'js/renovation/components'; +const fullRenovatedComponentsPath = '../../' + renovatedComponentsPath; + +const overwriteWidgetTemplate = require('./overwrite-renovation-widget.js'); +const overwriteQUnitWidgetTemplate = require('./overwrite-qunit-renovation-widget.js'); + +let fileToComponentMap = {}; + +function requireWithoutCache(module) { + delete require.cache[require.resolve(module)]; + return require(module); +} + +function loadConfig() { + const renovatedComponents = requireWithoutCache(fullRenovatedComponentsPath); + fileToComponentMap = {}; + renovatedComponents.forEach((component) => { + if(component.inProgress && !env.BUILD_INPROGRESS_RENOVATION) { + return; + } + + const oldComponentFileName = path.join('./js/', component.pathInJSFolder); + fileToComponentMap[path.resolve(oldComponentFileName)] = { + ...component, + pathToComponentRegistrator: path.relative( + path.dirname(oldComponentFileName), + './js/core/component_registrator' + ).replace(/\\/g, '/'), + pathInRenovationFolder: path + .relative( + path.dirname(oldComponentFileName), + path.join('./js/renovation', component.pathInRenovationFolder) + ).replace(/\\/g, '/'), + }; + }); +} + +loadConfig(); + +module.exports = { + renovatedComponentsPath: renovatedComponentsPath, + reloadConfig: (done) => { + loadConfig(); + done(); + }, + replaceWidgets: (wrapWidgetForQUnit) => (lazyPipe() + .pipe(function() { + return gulpIf((file) => fileToComponentMap[file.path], gulpEach((content, file, callback) => { + const component = fileToComponentMap[file.path]; + const fileContext = wrapWidgetForQUnit ? overwriteQUnitWidgetTemplate(component) : overwriteWidgetTemplate(component); + callback(null, fileContext); + })); + }) + )() +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-testing-playground.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-testing-playground.js new file mode 100644 index 0000000000000000000000000000000000000000..6c682743f730fb5d94a4512dc736c1d372ea0234 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/renovation-testing-playground.js @@ -0,0 +1,204 @@ + +const gulp = require('gulp'); +const path = require('path'); +const glob = require('glob'); +const del = require('del'); +const rename = require('gulp-rename'); +const lazyPipe = require('lazypipe'); +const webpack = require('webpack'); +const webpackStream = require('webpack-stream'); +const template = require('gulp-template'); +const lazypipe = require('lazypipe'); +const parseArguments = require('minimist'); + +function getPlaygroundName() { + process.env.BABEL_ENV = 'development'; + const args = parseArguments(process.argv, { string: ['playgroundName'] }); + const playgroundName = args['playgroundName']; + return playgroundName; +} + +const cssLightFileName = 'css/dx.light.css'; +const renovationRoot = 'testing/renovation/platforms/'; +const platforms = { + // 'react': { + // pattern: '*.jsx', entryName: (fn) => path.basename(fn, '.jsx'), + // getDeclarationFile: (basenameFilename) => basenameFilename + '.jsx' + // }, + 'angular': { + pattern: '!(declaration)**/app.component.ts', entryName: (fn) => path.basename(path.dirname(fn)), + getDeclarationFile: (basenameFilename) => path.join(basenameFilename, 'app.component.ts') + }, + // TODO uncomment after Vue generators + // 'vue': { + // pattern: '*.vue', entryName: (fn) => path.basename(fn, '.vue'), + // getEntyPoint: (fn) => path.join(path.dirname(fn), path.basename(fn, '.vue') + '-app.js'), + // getDeclarationFile: (basenameFilename) => basenameFilename + '.vue', + // }, +}; + +const declarationFiles = glob.sync(path.join(renovationRoot, 'declaration', '*.tsx')); +const templatePipe = (dest, data) => ( + lazyPipe() + .pipe(template, data) + .pipe(rename, (p) => { + p.basename = path.basename(dest); + p.extname = ''; + })() +); +function namedTask(name, task) { + task.displayName = name; + return task; +} + +const tasks = ({ isWatch }) => Object.entries(platforms) + .map(([platform, { pattern, getEntyPoint = (fn) => fn, entryName, getDeclarationFile }]) => { + const platformRoot = path.join(renovationRoot, platform); + const platformRootSrc = path.join(platformRoot, 'src'); + const platformDeclarationSrc = path.join(platformRootSrc, 'declaration'); + const platformRootDest = path.join(platformRoot, 'dist'); + const platformDeclarationDest = path.join(platformRootDest, 'declaration'); + const playgroundName = getPlaygroundName(); + const fileFilter = playgroundName ? (fn) => entryName(fn) === playgroundName : () => true; + const platformDeclarationFiles = declarationFiles + .map(fn => path.join(platformRootSrc, 'declaration', path.basename(fn, '.tsx'))) + .map(getDeclarationFile || ((basenameFilename) => basenameFilename + '.js')) + .filter(fileFilter); + const nativeFiles = glob.sync(path.join(platformRootSrc, pattern)) + .filter(fileFilter); + + const htmlFileGeneratorTask = destDir => fileName => { + const dest = path.join(destDir, path.basename(entryName(fileName) + '.html')); + const entryPointJS = entryName(fileName) + '.js'; + const pathToArtifacts = path.relative(destDir, 'artifacts').replace(/\\/g, '/'); + const style = path.join(pathToArtifacts, cssLightFileName); + return namedTask(`${platform}-html`, + () => gulp + .src('build/gulp/templates/playground-html-bootstrap.jst') + .pipe(templatePipe(dest, { style, entryPointJS })) + .pipe(gulp.dest(destDir)), + ); + }; + + let generateHtmlFiles = [ + ...nativeFiles.map(htmlFileGeneratorTask(platformRootDest)), + ...platformDeclarationFiles.map(htmlFileGeneratorTask(platformDeclarationDest)) + ]; + if(platform == 'vue') { + const vueAppFileGenerationTask = destDir => fileName => { + const appComponentModule = './' + path.relative(destDir, fileName) + .slice(0, -4) + .replace(/\\/g, '/'); + const destFileName = path.basename(getEntyPoint(fileName)); + return namedTask(`${platform}-vue-app`, + () => gulp + .src('build/gulp/templates/playground-vue-application.jst') + .pipe(templatePipe(destFileName, { appComponentModule })) + .pipe(gulp.dest(destDir)), + ); + }; + generateHtmlFiles = [ + ...generateHtmlFiles, + ...nativeFiles.map(vueAppFileGenerationTask(platformRootSrc)), + ...platformDeclarationFiles.map(vueAppFileGenerationTask(platformDeclarationSrc)) + ]; + } + if(platform == 'angular') { + const angularTemplateGenerationTask = fileName => { + const destFileName = path.basename(fileName, '.ts') + '.html'; + const destDir = path.join(platformDeclarationSrc, entryName(fileName)) + return namedTask(`${platform}-angular-app`, + () => gulp + .src('build/gulp/templates/playground-angular-declaration-template.jst') + .pipe(templatePipe(destFileName, {})) + .pipe(gulp.dest(destDir)) + ); + }; + generateHtmlFiles = [ + ...generateHtmlFiles, + ...platformDeclarationFiles.map(angularTemplateGenerationTask) + ]; + } + const declarationAppFileGeneratorTask = fileName => { + const relativePathToDeclationComponent = path.relative(path.dirname(fileName), path.join(renovationRoot, 'declaration')); + const componentModule = path.join(relativePathToDeclationComponent, entryName(fileName)) + .replace(/\\/g, '/'); + return namedTask(`${platform}-declaration-app`, + () => gulp + .src(`build/gulp/templates/playground-${platform}-declaration-application.jst`) + .pipe(templatePipe(path.basename(fileName), { componentModule })) + .pipe(gulp.dest(path.dirname(fileName))) + ); + }; + const generateDeclarationFiles = platformDeclarationFiles.map(declarationAppFileGeneratorTask); + const compileSourceGeneratorTask = (fileEntries, dest) => { + const getConfig = () => { + const webpackConfig = require(path.resolve(path.join(platformRoot, './webpack.config')))(path.resolve(platformRoot)); + const entries = fileEntries + .reduce((result, fn) => { + result[entryName(fn)] = path.resolve(getEntyPoint(fn)) + return result; + }, {}); + const _config = { + ...webpackConfig, + ...{ + watch: isWatch, + entry: entries, + output: { + path: path.resolve(dest), + publicPath: '/', + filename: '[name].js', + chunkFilename: '[id].chunk.js', + }, + resolveLoader: { + modules: [path.resolve('testing/renovation/node_modules'), 'node_modules'], + }, + }, + }; + return _config; + }; + // use lazypipe to prevent resolve webpack require dependencies + const webpackPipe = (config) => lazypipe().pipe(webpackStream, config, webpack)(); + return namedTask(`${platform}-compile-source`, + () => gulp + .src(path.resolve(platformRootSrc)) + .pipe(webpackPipe(getConfig())) + .pipe(gulp.dest(dest)) + ); + } + const compileSourceFiles = [ + compileSourceGeneratorTask(nativeFiles, platformRootDest), + compileSourceGeneratorTask(platformDeclarationFiles, platformDeclarationDest) + ] + return gulp.series( + gulp.parallel([...generateHtmlFiles, ...generateDeclarationFiles]), + gulp.parallel(compileSourceFiles) + ); + }); + +gulp.task('build-renovation-testing', gulp.series( + (done) => { process.env.BABEL_ENV = 'development'; done(); }, + gulp.parallel(tasks({ iswatch: false })) +)); + +gulp.task('build-renovation-testing:watch', gulp.series( + (done) => { + const playgroundName = getPlaygroundName(); + if(!playgroundName) { + console.log('\x1b[1mYou can use task with playground name for speedup: \x1b[32mnpm run build-renovation-testing -- playgroundName\x1b[0m') + } + done(); + }, + gulp.parallel(tasks({ isWatch: true })) +)); + +const foldersToCleanup = [ + ...(glob.sync(renovationRoot + '/**/dist')), + ...(glob.sync(renovationRoot + '/**/src/declaration')), + ...(glob.sync(renovationRoot + '/vue/src/**/*-app.js')), +] + .map(f => () => del(f)); +gulp.task('clean-renovation-testing', + gulp.parallel([...foldersToCleanup, (cb) => { cb(); }]) +); + diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.common.scss b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.common.scss new file mode 100644 index 0000000000000000000000000000000000000000..567db2d869340a2425893af9c56afa210ffbf6a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.common.scss @@ -0,0 +1,4 @@ +/*! +This file is kept for backward compatibility. +It is no longer required. +*/ diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.generic.scss b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.generic.scss new file mode 100644 index 0000000000000000000000000000000000000000..982f48ef1ac27e743e5789aca7e33c5908b651b4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.generic.scss @@ -0,0 +1,12 @@ +@use "../widgets/default/colors" with ($f-color: "$f-COLOR"); +@use "../widgets/default/sizes" with ($f-size: "$f-SIZE"); +@use "../widgets/default/typography"; +@use "../widgets/default/icons"; +@use "../widgets/default/widget"; +@use "../widgets/default/card"; +@use "../widgets/default/fieldset"; +@use "../widgets/default/common"; +// @use "../widgets/base/resizable"; +// @use "../widgets/base/draggable"; +// @use "../widgets/base/ui"; +@use "../widgets/default"; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.material.scss b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.material.scss new file mode 100644 index 0000000000000000000000000000000000000000..5eeaf32a09627626994fd75b037c8909ba74e01c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/bundle-template.material.scss @@ -0,0 +1,12 @@ +@use "../widgets/material/colors" with ($f-color: "$f-COLOR", $f-mode: "$f-MODE"); +@use "../widgets/material/sizes" with ($f-size: "$f-SIZE"); +@use "../widgets/material/typography"; +@use "../widgets/material/icons"; +@use "../widgets/material/widget"; +@use "../widgets/material/card"; +@use "../widgets/material/fieldset"; +@use "../widgets/material/common"; +@use "../widgets/base/resizable"; +@use "../widgets/base/draggable"; +@use "../widgets/base/ui"; +@use "../widgets/material"; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/style-compiler.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/style-compiler.js new file mode 100644 index 0000000000000000000000000000000000000000..e7e86c4c2c7043133d6d80fe7d87a61f96aa2543 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/style-compiler.js @@ -0,0 +1,144 @@ +'use strict'; + +const { task, src, parallel, series, dest, watch } = require('gulp'); +const { join } = require('path'); +const { existsSync, readFileSync, writeFileSync, mkdirSync } = require('fs'); +const replace = require('gulp-replace'); +const plumber = require('gulp-plumber'); +const sass = require('gulp-dart-sass'); + +const CleanCss = require('clean-css'); +const through = require('through2'); +const autoPrefix = require('gulp-autoprefixer'); +const parseArguments = require('minimist'); + +const cleanCssOptions = require('../../../themebuilder-scss/src/data/clean-css-options.json'); +const functions = require('../gulp-data-uri').sassFunctions; +const starLicense = require('../header-pipes').starLicense; + +const cssArtifactsPath = join(process.cwd(), 'artifacts', 'css'); + +const DEFAULT_DEV_BUNDLE_NAMES = [ + 'light', + 'dark', + 'contrast', + 'material.blue.light', +]; + +const getBundleSourcePath = name => `scss/bundles/dx.${name}.scss`; + +const compileBundles = (bundles) => { + return src(bundles) + .pipe(plumber(e => { + console.log(e); + this.emit('end'); + })) + .on('data', (chunk) => console.log('Build: ', chunk.path)) + .pipe(sass({ + functions + })) + .pipe(autoPrefix()) + .pipe(through.obj((file, enc, callback) => { + const content = file.contents.toString(); + new CleanCss(cleanCssOptions).minify(content, (_, css) => { + file.contents = new Buffer.from(css.styles); + callback(null, file); + }); + })) + .pipe(starLicense()) + .pipe(replace(/([\s\S]*)(@charset.*?;\s)/, '$2$1')) + .pipe(dest(cssArtifactsPath)); +}; + +function createBundles(callback) { + const sizes = ['default', 'compact']; + const materialColors = ['blue', 'lime', 'orange', 'purple', 'teal']; + const materialModes = ['light', 'dark']; + const defaultColors = ['carmine', 'contrast', 'dark', 'darkmoon', 'darkviolet', 'greenmist', 'light', 'softblue']; + + const saveBundleFile = (fileName, content) => { + const bundlesFolder = join(process.cwd(), 'scss', 'bundles'); + const bundlePath = join(bundlesFolder, fileName); + if(!existsSync(bundlesFolder)) mkdirSync(bundlesFolder); + writeFileSync(bundlePath, content); + }; + + const readTemplate = (theme) => readFileSync(join(__dirname, `bundle-template.${theme}.scss`), 'utf8'); + + const saveBundle = (theme, size, color, mode) => { + const bundleTemplate = readTemplate(theme); + const bundleContent = bundleTemplate + .replace('$COLOR', color) + .replace('$SIZE', size) + .replace('$MODE', mode); + + const bundleName = + 'dx' + + (theme === 'material' ? '.material' : '') + + `.${color}` + + (mode ? `.${mode}` : '') + + (size === 'default' ? '' : '.compact') + + '.scss'; + + saveBundleFile(bundleName, bundleContent); + }; + + sizes.forEach(size => { + materialModes.forEach(mode => { + materialColors.forEach(color => saveBundle('material', size, color, mode)); + }); + + defaultColors.forEach(color => saveBundle('default', size, color)); + }); + + saveBundleFile('dx.common.scss', readTemplate('common')); + + if(callback) callback(); +} + +task('create-scss-bundles', createBundles); + +task('copy-fonts-and-icons', () => { + return src(['fonts/**/*', 'icons/**/*'], { base: '.' }) + .pipe(dest(cssArtifactsPath)); +}); + +task('compile-themes-all', () => compileBundles(getBundleSourcePath('*'))); +task('compile-themes-dev', () => compileBundles(DEFAULT_DEV_BUNDLE_NAMES.map(getBundleSourcePath))); + +task('style-compiler-themes', series( + 'create-scss-bundles', + parallel( + 'compile-themes-all', + 'copy-fonts-and-icons' + ) +)); + +task('style-compiler-themes-ci', series( + 'create-scss-bundles', + parallel( + 'compile-themes-dev', + 'copy-fonts-and-icons' + ) +)); + +task('style-compiler-themes-watch', () => { + const args = parseArguments(process.argv); + const bundlesArg = args['bundles']; + + const bundles = ( + bundlesArg + ? bundlesArg.split(',') + : DEFAULT_DEV_BUNDLE_NAMES) + .map((bundle) => { + const sourcePath = getBundleSourcePath(bundle); + if(existsSync(sourcePath)) { + return sourcePath; + } + console.log(`${sourcePath} file does not exists`); + return null; + }); + + watch('scss/**/*', parallel(() => compileBundles(bundles), 'copy-fonts-and-icons')) + .on('ready', () => console.log('style-compiler-themes task is watching for changes...')); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/themebuilder-npm.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/themebuilder-npm.js new file mode 100644 index 0000000000000000000000000000000000000000..fa8b425158e6aed783a070880ec0278c4959662d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/styles/themebuilder-npm.js @@ -0,0 +1,19 @@ +'use strict'; + +const gulp = require('gulp'); +const exec = require('child_process').exec; +const context = require('../context.js'); +const packagePath = context.RESULT_NPM_PATH + '/devextreme-themebuilder'; + +gulp.task('themebuilder-npm', gulp.series( + (callback) => { + exec('cd themebuilder-scss && npm i && npm run build', (e, out, err) => { + console.log(out, err); + callback(e); + }); + }, + () => { + return gulp.src('themebuilder-scss/dist/**/*.*') + .pipe(gulp.dest(packagePath)); + } +)); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-application.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-application.jst new file mode 100644 index 0000000000000000000000000000000000000000..b6d3da741e385caa67b67921bf9bd8d5d44e6a58 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-application.jst @@ -0,0 +1,29 @@ +import 'core-js/proposals/reflect-metadata'; +import 'zone.js/dist/zone'; + +import { NgModule, Component } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { DxAppModule } from '<%= componentModule %>'; + +import template from './app.component.html'; + +@Component({ + providers: [], + selector: '#app', + styleUrls: [], + template, +}) +export class AppComponent { } + +@NgModule({ + imports: [ + BrowserModule, + DxAppModule, + ], + declarations: [AppComponent], + bootstrap: [AppComponent], +}) +class AppModule {} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-template.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-template.jst new file mode 100644 index 0000000000000000000000000000000000000000..07915d6554392344a9faffef24c65e37aa2dc929 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-angular-declaration-template.jst @@ -0,0 +1 @@ + diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-html-bootstrap.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-html-bootstrap.jst new file mode 100644 index 0000000000000000000000000000000000000000..9a512ef9655139fc17e96724c5c022075a7c70bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-html-bootstrap.jst @@ -0,0 +1,14 @@ + + + + <%= entryPointJS %> + + + + + +
+ + + + \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-react-declaration-application.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-react-declaration-application.jst new file mode 100644 index 0000000000000000000000000000000000000000..1ede2fa23c8898fab19e7f12e46efb8f2d1173bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-react-declaration-application.jst @@ -0,0 +1,8 @@ +import { App } from '<%= componentModule %>'; + +/* eslint-env browser*/ +import React from 'react'; +import ReactDOM from 'react-dom'; + +ReactDOM.render(, document.getElementById('app')); + diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-application.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-application.jst new file mode 100644 index 0000000000000000000000000000000000000000..40655f09c87e757a358eb0d0d32b94178122cb8f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-application.jst @@ -0,0 +1,8 @@ +import Vue from 'vue'; +import App from '<%= appComponentModule %>'; + +new Vue({ + el: '#app', + components: { App }, + render: (h) => h(App), +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-declaration-application.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-declaration-application.jst new file mode 100644 index 0000000000000000000000000000000000000000..bcec0a6e644a7ce2ddc80f43abcf65b771a678fb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/templates/playground-vue-declaration-application.jst @@ -0,0 +1,12 @@ + + diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/test_timezones_data.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/test_timezones_data.js new file mode 100644 index 0000000000000000000000000000000000000000..0fc680037b438eb1cda98f1b49dfc1e89a7b382d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/test_timezones_data.js @@ -0,0 +1,103 @@ +'use strict'; +const gulp = require('gulp'); +const through = require('through2'); +const remoteSrc = require('gulp-remote-src'); +let tzData = []; +const momentTimezonesRawUrl = 'https://raw.githubusercontent.com/moment/moment-timezone/develop/data/unpacked/'; +const tzDataUrl = '../../artifacts/transpiled/ui/scheduler/timezones/timezones_data'; + +try { + tzData = require(tzDataUrl).zones; // eslint-disable-line node/no-missing-require +} catch(e) { + if(e instanceof Error && e.code === 'MODULE_NOT_FOUND') { + console.log('Can not load ui.scheduler.timezones_data'); + } else { + throw e; + } +} + +gulp.task('test-timezones-data', () => { + return remoteSrc(['latest.json'], { + base: momentTimezonesRawUrl + }).pipe( + through.obj((file, enc, callBack) => { + const rawJSON = file.contents.toString(); + const parsed = JSON.parse(rawJSON); + checkTimeZonesParsing(parsed); + callBack(); + })); +}); + +function checkTimeZonesParsing(input) { + Object.keys(input).forEach(key => { + if(key === 'zones') { + const items = input[key]; + items.forEach((timeZone, index) => { + checkTimeZoneParsing(tzData[index], timeZone); + }); + } + }); +} + +function checkTimeZoneParsing(parsedTimeZone, rawTimeZone) { + if(rawTimeZone.name !== parsedTimeZone.id || + !isUntilsCorrect(rawTimeZone.untils, parsedTimeZone.untils) || + !isOffsetsCorrect(rawTimeZone.offsets, parsedTimeZone.offsets, parsedTimeZone.offsetIndices)) { + console.log(`Error while parsing timezone ${rawTimeZone.name}`); + } +} + + +function isUntilsCorrect(rawUntils, parsedUntils) { + const revertedUntils = revertUntils(parsedUntils); + return isArraysMatch(revertedUntils, rawUntils); +} + +function isOffsetsCorrect(rawOffsets, parsedOffsets, parsedOffsetIndices) { + const revertedOffsets = revertOffsets(parsedOffsets, parsedOffsetIndices); + return isArraysMatch(revertedOffsets, rawOffsets); +} + +function revertUntils(untilsString) { + const untils = untilsString.split('|'); + const result = []; + let prevUntil = 0; + + untils.forEach((until, index) => { + if(until === 'Infinity') { + result.push(null); + } else { + if(index === 0) { + prevUntil = parseInt(until, 36) * 1000; + result.push(prevUntil); + } + if(until !== 'Infinity' && index !== 0) { + prevUntil = parseInt(until, 36) * 1000 + prevUntil; + result.push(prevUntil); + } + } + }); + return result; +} + +function revertOffsets(offsets, offsetIndices) { + const result = []; + offsets = offsets.split('|'); + offsetIndices = offsetIndices.split(''); + offsetIndices.forEach((offsetIndex) => { + result.push(parseFloat(offsets[offsetIndex])); + }); + return result; +} + +function isArraysMatch(first, second) { + let result = first.length === second.length; + + result && first.forEach((el, index) => { + if(el !== second[index]) { + result = false; + } + }); + + return result; +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile-config.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile-config.js new file mode 100644 index 0000000000000000000000000000000000000000..982f53f5622517099a79999f14f2b8cd67918262 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile-config.js @@ -0,0 +1,35 @@ +'use strict'; + +const common = { + plugins: [ + '@babel/plugin-proposal-nullish-coalescing-operator', + '@babel/plugin-proposal-optional-chaining', + ['babel-plugin-inferno', { 'imports': true }], + 'transform-object-assign', + ['@babel/plugin-proposal-object-rest-spread', { material: true }], + ], + ignore: ['**/*.json'], +}; + +module.exports = { + cjs: Object.assign({}, common, { + presets: ['@babel/preset-env'], + plugins: common.plugins.concat([ + ['add-module-exports', { addDefaultProperty: true }], + ['@babel/plugin-transform-modules-commonjs', { strict: true }], + ['@babel/plugin-transform-classes', { material: true }], + '@babel/plugin-transform-property-mutators' + ]) + }), + + esm: Object.assign({}, common, { + // eslint-disable-next-line spellcheck/spell-checker + presets: [['@babel/preset-env', { modules: false, targets: { esmodules: true } }]], + plugins: common.plugins.concat( + [['@babel/plugin-transform-runtime', { + useESModules: true, + version: '7.5.0' // https://github.com/babel/babel/issues/10261#issuecomment-514687857 + }]] + ) + }) +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile.js new file mode 100644 index 0000000000000000000000000000000000000000..65bb33fa2aa929d6eeb67bd33cb319157ed25c73 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/transpile.js @@ -0,0 +1,243 @@ +'use strict'; + +const babel = require('gulp-babel'); +const flatMap = require('gulp-flatmap'); +const fs = require('fs'); +const gulp = require('gulp'); + +const normalize = require('normalize-path'); +const notify = require('gulp-notify'); +const path = require('path'); +const plumber = require('gulp-plumber'); +const rename = require('gulp-rename'); +const replace = require('gulp-replace'); +const watch = require('gulp-watch'); +const cache = require('gulp-cache'); +const through2 = require('through2'); + +const removeDebug = require('./compression-pipes.js').removeDebug; +const ctx = require('./context.js'); +const { replaceWidgets, reloadConfig, renovatedComponentsPath } = require('./renovation-pipes'); +const { ifEsmPackage } = require('./utils'); +const testsConfig = require('../../testing/tests.babelrc.json'); +const transpileConfig = require('./transpile-config'); + +require('./generator/gulpfile'); + +const src = [ + 'js/**/*.*', + '!js/**/*.d.ts', + '!js/**/*.{tsx,ts}', + '!js/renovation/code_coverage/**/*.*' +]; + +const esmTranspileSrc = src.concat([ + '!js/bundles/**/*', + '!js/viz/docs/**/*', + '!js/renovation/**/*', + '!**/*.json' +]); + + +const srcDir = path.join(process.cwd(), './js'); +const generatedTs = [ + 'events/click.d.ts', + 'events/contextmenu.d.ts', + 'events/dblclick.d.ts', + 'events/drag.d.ts', + 'events/hold.d.ts', + 'events/hover.d.ts', + 'events/pointer.d.ts', + 'events/swipe.d.ts', + 'events/transform.d.ts', + 'integration/jquery.d.ts' +]; + +const bundlesSrc = ['js/bundles/**/*.js']; + +const createModuleConfig = (name, dir, filePath) => { + const isIndex = name === 'index.js'; + const relative = path.join('./', dir.replace(srcDir, ''), name); + const currentPath = isIndex ? path.join(relative, '../') : relative; + const esmFile = path.relative(currentPath, path.join('./esm', relative)); + const cjsFile = path.relative(currentPath, path.join('./cjs', relative)); + const hasRealDTS = fs.existsSync(filePath.replace(/\.js$/, '.d.ts')); + const hasGeneratedDTS = generatedTs.indexOf(relative.replace(/\.js$/, '.d.ts')) !== -1; + const hasDTS = hasRealDTS || hasGeneratedDTS; + + const result = { + sideEffects: false, + main: normalize(cjsFile), + module: normalize(esmFile) + }; + + if(hasDTS) { + const typingFile = name.replace(/\.js$/, '.d.ts'); + + result['typings'] = `${isIndex ? './' : '../'}${typingFile}`; + } + + return JSON.stringify(result, null, 2); +}; + + +function transpile(src, dist, pipes = []) { + const task = () => { + let result = gulp.src(src); + + pipes.forEach(pipe => { + result = result.pipe(pipe); + }); + + return result.pipe(gulp.dest(dist)); + }; + task.displayName = 'transpile:' + dist; + return task; +} + +function babelCjs() { + return cache(babel(transpileConfig.cjs), { name: 'babel-cjs' }); +} + +function babelEsm() { + return babel(transpileConfig.esm); +} + +const transpileDefault = () => transpile(src, ctx.TRANSPILED_PATH, [ + babelCjs() +]); + +const touch = () => through2.obj(function(file, enc, cb) { + if(file.stat) { + // eslint-disable-next-line spellcheck/spell-checker + file.stat.atime = file.stat.mtime = file.stat.ctime = new Date(); + } + cb(null, file); +}); + +const transpileRenovation = (watch) => transpile(src, ctx.TRANSPILED_RENOVATION_PATH, [ + replaceWidgets(true), + babelCjs(), + touch() +], watch); + +const transpileProd = (dist, isEsm, watch) => transpile(src, dist, [ + removeDebug(), + replaceWidgets(false), + isEsm ? babelEsm() : babelCjs(), +], watch); + +const transpileRenovationProd = (watch) => transpileProd(ctx.TRANSPILED_PROD_RENOVATION_PATH, false, watch); + +const transpileEsm = (dist) => gulp.series.apply(gulp, [ + transpileProd(path.join(dist, './cjs'), false), + transpileProd(path.join(dist, './esm'), true), + transpile(bundlesSrc, path.join(dist, './bundles'), [ + removeDebug(), + babelCjs(), + ]), + + () => gulp + .src(esmTranspileSrc) + .pipe(flatMap((stream, file) => { + const filePath = file.path; + const parsedPath = path.parse(filePath); + const fileName = parsedPath.base; + const fileDir = parsedPath.dir; + + // NOTE: flatmap thinks that the 'js/viz/vector_map.utils' folder is a file. + if(file.extname === '.utils') return stream; + + return stream + .pipe(replace(/[\s\S]*/, createModuleConfig(fileName, fileDir, filePath))) + .pipe(rename(fPath => { + const isIndexFile = parsedPath.base === 'index.js'; + const shouldBePlacedInSeparateDir = !isIndexFile; + + if(shouldBePlacedInSeparateDir) { + fPath.dirname = path.join(fPath.dirname, fPath.basename); + } + + fPath.basename = 'package'; + fPath.extname = '.json'; + })); + })) + .pipe(gulp.dest(dist)) +]); + +gulp.task('transpile-esm', transpileEsm(ctx.TRANSPILED_PROD_ESM_PATH)); + +gulp.task('transpile', gulp.series( + 'bundler-config', + transpileDefault(), + transpileRenovation(), + transpileRenovationProd(), + ifEsmPackage('transpile-esm'), +)); + +const replaceTask = (sourcePath) => { + const task = () => gulp + .src(path.join(sourcePath, 'core/version.js'), { base: './' }) + .pipe(replace('%VERSION%', ctx.version.script)) + .pipe(gulp.dest('./')); + task.displayName = `replace-version:${sourcePath}`; + return task; +}; + +const replaceVersion = () => gulp.parallel([ + replaceTask(ctx.TRANSPILED_PATH), + replaceTask(ctx.TRANSPILED_RENOVATION_PATH), + replaceTask(ctx.TRANSPILED_PROD_RENOVATION_PATH), + ifEsmPackage(() => replaceTask(path.join(ctx.TRANSPILED_PROD_ESM_PATH, './esm')))(), + ifEsmPackage(() => replaceTask(path.join(ctx.TRANSPILED_PROD_ESM_PATH, './cjs')))(), +]); + +gulp.task('version-replace', replaceVersion()); + +gulp.task('renovated-components-watch', () => { + return gulp + .watch( + [renovatedComponentsPath + '.js'], + function transpileRenovatedComponents(done) { + gulp.series( + reloadConfig, + transpileRenovation(), + transpileRenovationProd() + )(done); + } + ) + .on('ready', () => console.log('renovated-components task is watching for changes...')); + +}); + +gulp.task('transpile-watch', gulp.series( + () => { + const watchTask = watch(src) + .on('ready', () => console.log('transpile task is watching for changes...')) + .pipe(plumber({ + errorHandler: notify + .onError('Error: <%= error.message %>') + .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation + })); + watchTask + .pipe(babel(transpileConfig.cjs)) + .pipe(gulp.dest(ctx.TRANSPILED_PATH)); + watchTask + .pipe(replaceWidgets(true)) + .pipe(babel(transpileConfig.cjs)) + .pipe(gulp.dest(ctx.TRANSPILED_RENOVATION_PATH)); + watchTask + .pipe(removeDebug()) + .pipe(replaceWidgets(true)) + .pipe(babel(transpileConfig.cjs)) + .pipe(gulp.dest(ctx.TRANSPILED_PROD_RENOVATION_PATH)); + return watchTask; + } +)); + +gulp.task('transpile-tests', gulp.series('bundler-config', () => + gulp + .src(['testing/**/*.js']) + .pipe(babel(testsConfig)) + .pipe(gulp.dest('testing')) +)); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/ts.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/ts.js new file mode 100644 index 0000000000000000000000000000000000000000..d0ac21f6cf9ad4949a8a337af792c0ffc84fc525 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/ts.js @@ -0,0 +1,180 @@ +'use strict'; + +const gulp = require('gulp'); +const file = require('gulp-file'); +const footer = require('gulp-footer'); +const concat = require('gulp-concat'); +const path = require('path'); +const replace = require('gulp-replace'); +const ts = require('gulp-typescript'); +const context = require('./context.js'); +const headerPipes = require('./header-pipes.js'); +const MODULES = require('./modules_metadata.json'); +const { packageDir } = require('./utils'); + +const OUTPUT_ARTIFACTS_DIR = 'artifacts/ts'; + +const TS_BUNDLE_FILE = './ts/dx.all.d.ts'; +const TS_BUNDLE_SOURCES = [TS_BUNDLE_FILE, './ts/aliases.d.ts']; +const src = ['./js/**/*.d.ts', '!./js/renovation/**/*']; + +function compileTS(settings) { + return ts.createProject({ + typescript: require('typescript-min'), + types: ['jquery'], + noEmitOnError: true, + ...settings + })(ts.reporter.fullReporter()); +} + +const packagePath = `${context.RESULT_NPM_PATH}/${packageDir}`; +const packageBundlesPath = path.join(packagePath, 'bundles'); + + +gulp.task('ts-copy-vendor', function() { + return gulp.src('./ts/vendor/*') + .pipe(gulp.dest(OUTPUT_ARTIFACTS_DIR)); +}); + +function bundleTS() { + return gulp.src(TS_BUNDLE_SOURCES) + .pipe(concat('dx.all.d.ts')) + .pipe(headerPipes.bangLicense()); +} + +gulp.task('ts-copy-bundle', gulp.series( + function writeTsBundle() { + return bundleTS() + .pipe(replace(/^declare global\s*{([\s\S]*?)^}/gm, '$1')) + .pipe(gulp.dest(OUTPUT_ARTIFACTS_DIR)); // will be copied to the npm's /dist folder by another task + }, + + function writeTsBundleForNPM() { + return bundleTS() + .pipe(footer('\nexport default DevExpress;')) + .pipe(replace('/*!', '/**')) + .pipe(replace(/(interface JQuery\b[\s\S]*?{)[\s\S]+?(})/gm, '$1$2')) + .pipe(gulp.dest(packageBundlesPath)); + }, + + function writeAngularHack() { + return file('dx.all.js', '// This file is required to compile devextreme-angular', { src: true }) + .pipe(headerPipes.starLicense()) + .pipe(gulp.dest(packageBundlesPath)); + } +)); + +gulp.task('ts-check-jquery', function() { + let content = `/// \n`; + content += 'import * as $ from \'jquery\';'; + + content += MODULES + .map(function(moduleMeta) { + return Object.keys(moduleMeta.exports || []).map(function(name) { + + if(moduleMeta.isInternal) { return ''; } + + const exportEntry = moduleMeta.exports[name]; + if(!exportEntry.isWidget) { return ''; } + + const globalPath = exportEntry.path; + const widgetName = widgetNameByPath(globalPath); + if(!widgetName) { return ''; } + + return `$().${widgetName}();\n` + + `$().${widgetName}('instance');\n`; + }).join(''); + }).join('\n'); + + return file('artifacts/globals.ts', content, { src: true }) + .pipe(compileTS()); +}); + +gulp.task('ts-check-bundle', function() { + + return gulp.src(path.join(OUTPUT_ARTIFACTS_DIR, 'dx.all.d.ts')) + .pipe(compileTS()); +}); + +gulp.task('ts-check-modules', function() { + return gulp.src(src) + .pipe(compileTS()); +}); + +gulp.task('ts-copy-modules', function() { + const BUNDLE_IMPORT = 'import DevExpress from \'../bundles/dx.all\';'; + + return gulp.src(src) + /* legacy modules */ + .pipe(file('events/click.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/contextmenu.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/dblclick.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/drag.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/hold.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/hover.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/pointer.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/swipe.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/transform.d.ts', BUNDLE_IMPORT)) + .pipe(file('integration/jquery.d.ts', 'import \'jquery\';')) + + .pipe(headerPipes.starLicense()) + .pipe(gulp.dest(packagePath)); +}); + +gulp.task('ts-sources', gulp.series('ts-copy-modules', 'ts-copy-bundle')); + +gulp.task('ts-check-public-modules', gulp.series('ts-copy-modules', function() { + let content = 'import $ from \'jquery\';\n'; + + content += MODULES.map(function(moduleMeta) { + const modulePath = `'./npm/${packageDir}/${moduleMeta.name}'`; + if(!moduleMeta.exports) { + return `import ${modulePath};`; + } + + return Object.keys(moduleMeta.exports).map(function(name) { + const exportEntry = moduleMeta.exports[name]; + + const uniqueIdentifier = moduleMeta.name + .replace(/\./g, '_') + .split('/') + .concat([name]) + .join('__'); + + const importIdentifier = name === 'default' ? uniqueIdentifier : `{ ${name} as ${uniqueIdentifier} }`; + + const importStatement = `import ${importIdentifier} from ${modulePath};`; + const widgetName = widgetNameByPath(exportEntry.path); + if(exportEntry.isWidget && widgetName) { + return `$('
').${widgetName}();\n${importStatement}`; + } + + return importStatement; + }).join('\n'); + }).join('\n'); + + return file('artifacts/modules.ts', content, { src: true }) + .pipe(compileTS({ allowSyntheticDefaultImports: true })); +})); + +gulp.task('validate-ts', gulp.series( + 'ts-check-modules', + 'ts-copy-bundle', + 'ts-check-bundle', + 'ts-check-jquery', + 'ts-check-public-modules' +)); + +gulp.task('ts', gulp.series( + 'ts-copy-vendor', + 'ts-copy-bundle', + 'ts-check-jquery', + 'ts-check-bundle' +)); + +function widgetNameByPath(widgetPath) { + if(widgetPath.startsWith('ui.dx') || widgetPath.startsWith('viz.dx')) { + const parts = widgetPath.split('.'); + return parts.length === 2 ? parts[1] : ''; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/tsconfig.json b/packages/f-theme-editor/farris-theme-editor/build/gulp/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..9f756e497164d61105967bc1176047c2380640c3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "typeRoots": ["node_modules/@types"], + "noEmitOnError": true + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/utils.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..d0dcd2420c2abf8e45166f3f47b9414e9ee44f10 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/utils.js @@ -0,0 +1,24 @@ +'use strict'; + +const gulp = require('gulp'); +const env = require('./env-variables'); + +gulp.task('skippedTask', done => done()); + +const runTaskByCondition = (condition, task) => { + if(condition) { + return task; + } + return (done) => done ? done() : gulp.series('skippedTask'); +}; + +const isEsmPackage = env.BUILD_ESM_PACKAGE; + +const packageDir = 'devextreme'; + +module.exports = { + packageDir, + isEsmPackage, + runTaskByCondition, + ifEsmPackage: (task) => runTaskByCondition(isEsmPackage, task), +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormap.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormap.js new file mode 100644 index 0000000000000000000000000000000000000000..85740d171cb5b8f94210cfc0ec274bce4402015f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormap.js @@ -0,0 +1,86 @@ +'use strict'; + +const gulp = require('gulp'); +const path = require('path'); +const fs = require('fs'); +const rename = require('gulp-rename'); +const concat = require('gulp-concat'); +const tap = require('gulp-tap'); +const gulpIf = require('gulp-if'); +const merge = require('merge-stream'); +const template = require('gulp-template'); + +const context = require('./context.js'); +const headerPipes = require('./header-pipes.js'); +const compressionPipes = require('./compression-pipes.js'); + +const VECTORMAP_UTILS_PATH = 'js/viz/vector_map.utils'; +const VECTORMAP_UTILS_RESULT_PATH = path.join(context.RESULT_JS_PATH, 'vectormap-utils'); +const VECTORMAP_DATA_RESULT_PATH = path.join(context.RESULT_JS_PATH, 'vectormap-data'); + +function transformFileName(fileName) { + return path.join(VECTORMAP_UTILS_PATH, fileName) + '.js'; +} + +gulp.task('vectormap-utils', function() { + return merge( + createVectorMapUtilsStream('browser', '.debug', false), + createVectorMapUtilsStream('browser', '', true), + createVectorMapUtilsStream('node', '', false) + ); +}); + +gulp.task('vectormap-data', gulp.series('vectormap-utils', function() { + const stream = merge(); + const processFiles = require(path.join('../..', VECTORMAP_UTILS_RESULT_PATH, 'dx.vectormaputils.node.js')).processFiles; + + if(!fs.existsSync(VECTORMAP_DATA_RESULT_PATH)) { + fs.mkdirSync(VECTORMAP_DATA_RESULT_PATH); + } + + processFiles('build/vectormap-sources', { + output: VECTORMAP_DATA_RESULT_PATH, + settings: 'build/vectormap-sources/_settings.js' + }, function() { + const files = fs.readdirSync(VECTORMAP_DATA_RESULT_PATH); + + files.forEach(file => { + const data = fs.readFileSync(path.join(VECTORMAP_DATA_RESULT_PATH, file), 'utf8'); + + stream.add( + gulp.src('build/gulp/vectormapdata-template.jst') + .pipe(template({ data: data })) + .pipe(rename(file)) + .pipe(headerPipes.useStrict()) + .pipe(gulp.dest(VECTORMAP_DATA_RESULT_PATH)) + ); + }); + }); + return stream; +})); + +function patchVectorMapUtilsStream(stream, isMinify) { + return stream.pipe(headerPipes.useStrict()) + .pipe(headerPipes.bangLicense()) + .pipe(gulpIf(isMinify, compressionPipes.minify())) + .pipe(gulpIf(!isMinify, compressionPipes.beautify())) + .pipe(gulp.dest(VECTORMAP_UTILS_RESULT_PATH)); +} + +function createVectorMapUtilsStream(name, suffix, isMinify) { + const settings = require(path.join('../..', VECTORMAP_UTILS_PATH, '_settings.json')); + const part = settings[name]; + const stream = gulp.src(settings.commonFiles.concat(part.files).map(transformFileName)) + .pipe(concat(part.fileName + suffix + '.js')); + + if(name === 'browser') { + return stream.pipe(tap(file => { + patchVectorMapUtilsStream(gulp.src('build/gulp/vectormaputils-template.jst') + .pipe(template({ data: file.contents })) + .pipe(rename(path.basename(file.path))), isMinify); + })); + } + return patchVectorMapUtilsStream(stream, isMinify); +} + +gulp.task('vectormap', gulp.series('vectormap-utils', 'vectormap-data')); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormapdata-template.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormapdata-template.jst new file mode 100644 index 0000000000000000000000000000000000000000..243a01a923f41f007deae602527acf3a01564830 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormapdata-template.jst @@ -0,0 +1,13 @@ +(function(root, factory) { + if(typeof define === "function" && define.amd) { + define(function(require, exports, module) { + factory(exports); + }); + } else if(typeof module === "object" && module.exports) { + factory(exports); + } else { + factory(DevExpress.viz.map.sources); + } +}(this, function(sources) { + sources.<%= data %> +})); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormaputils-template.jst b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormaputils-template.jst new file mode 100644 index 0000000000000000000000000000000000000000..efe184e20eaa3a8857c5d11a3a4a6fae5600c89e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/vectormaputils-template.jst @@ -0,0 +1,16 @@ +(function(root, factory) { + if(typeof define === "function" && define.amd) { + define(function(require, exports, module) { + factory(exports); + }); + } else if(typeof module === "object" && module.exports) { + factory(exports); + } else { + var exports = root.DevExpress = root.DevExpress || {}; + exports = exports.viz = exports.viz || {}; + exports = exports.vectormaputils = {}; + factory(exports); + } +}(this, function(exports) { +<%= data %> +})); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/vendor.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/vendor.js new file mode 100644 index 0000000000000000000000000000000000000000..04bb35eb22a436ba7315363e4a4c277e2079e449 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/vendor.js @@ -0,0 +1,92 @@ +'use strict'; + +const gulp = require('gulp'); +const rename = require('gulp-rename'); +const merge = require('merge-stream'); +const compressionPipes = require('./compression-pipes.js'); +const context = require('./context'); + +const PACKAGES_SOURCE = './node_modules'; +const DESTINATION_JS_PATH = './' + context.RESULT_JS_PATH; +const DESTINATION_CSS_PATH = './artifacts/css'; + +const JS_VENDORS = [ + { + path: '/angular/angular.js' + }, + { + path: '/jquery/dist/jquery.js' + }, + { + path: '/jszip/dist/jszip.js' + }, + { + path: '/knockout/build/output/knockout-latest.js', + suffix: 'debug' + }, + { + path: '/cldrjs/dist/cldr.js', + noUglyFile: true + }, + { + path: '/globalize/dist/globalize.js', + noUglyFile: true + }, + { + path: '/cldrjs/dist/cldr/@(event|supplemental|unresolved).js', + noUglyFile: true, + base: '/cldrjs/dist/' + }, + { + path: '/globalize/dist/globalize/@(number|currency|date|message).js', + noUglyFile: true, + base: '/globalize/dist/' + }, + { + path: '/devexpress-diagram/dist/dx-@(diagram|diagram.min).js' + }, + { + path: '/devexpress-gantt/dist/dx-@(gantt|gantt.min).js' + }, + { + path: '/devextreme-quill/dist/dx-@(quill|quill.min).js' + } +]; + +const CSS_VENDORS = [ + { + path: '/devexpress-diagram/dist/dx-@(diagram|diagram.min).css' + }, + { + path: '/devexpress-gantt/dist/dx-@(gantt|gantt.min).css' + } +]; + +gulp.task('vendor-js', function() { + return merge.apply(this, JS_VENDORS.map(function(vendor) { + const sourceConfig = vendor.base ? { base: PACKAGES_SOURCE + vendor.base } : null; + const stream = gulp.src(PACKAGES_SOURCE + vendor.path, sourceConfig) + .pipe(gulp.dest(DESTINATION_JS_PATH)); + + if(vendor.noUglyFile) { + return stream + .pipe(compressionPipes.minify()) + .pipe(rename({ suffix: '.min' })) + .pipe(gulp.dest(DESTINATION_JS_PATH)); + } + + const path = PACKAGES_SOURCE + vendor.path.replace(/js$/, `${vendor.suffix || 'min'}.js`); + + return merge(stream, gulp.src(path, sourceConfig) + .pipe(gulp.dest(DESTINATION_JS_PATH)) + ); + })); +}); + +gulp.task('vendor-css', function() { + return merge.apply(this, CSS_VENDORS.map(function(vendor) { + return gulp.src(PACKAGES_SOURCE + vendor.path).pipe(gulp.dest(DESTINATION_CSS_PATH)); + })); +}); + +gulp.task('vendor', gulp.parallel('vendor-js', 'vendor-css')); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/version-spec.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/version-spec.js new file mode 100644 index 0000000000000000000000000000000000000000..c36b6df93f843045cc36270bf16426d607881604 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/version-spec.js @@ -0,0 +1,31 @@ +// Tests for the version.js module +// Note: label and revision can't be set at the same time + +'use strict'; + +const versionFunc = require('./version'); + +const cases = [ + // revision + { version: '1.1.0', label: '', flavor: '', revision: '10000', expected: '1.1.1-alpha-10000-0000' }, + { version: '1.1.0', label: '', flavor: 'build', revision: '10000', expected: '1.1.1-build-10000-0000' }, + { version: '1.1.1', label: '', flavor: '', revision: '10000', expected: '1.1.2-alpha-10000-0000' }, + { version: '1.1.2', label: '', flavor: '', revision: '10000', expected: '1.1.3-build-10000-0000' }, + { version: '1.1.2', label: '', flavor: 'pre', revision: '10000', expected: '1.1.3-pre-10000-0000' }, + + // label + { version: '1.1.0', label: '1_1_0', flavor: '', revision: '', expected: '1.1.0-beta' }, + { version: '1.1.0', label: '1_1_0', flavor: 'beta2', revision: '', expected: '1.1.0-beta2' }, + { version: '1.1.1', label: '1_1_1', flavor: '', revision: '', expected: '1.1.1-beta' }, + { version: '1.1.2', label: '1_1_2', flavor: '', revision: '', expected: '1.1.2-beta' }, + { version: '1.1.3', label: '1_1_3', flavor: '', revision: '', expected: '1.1.3' } +]; + +cases.forEach(testCase => { + let actual = versionFunc(testCase.version, testCase.label, testCase.flavor, testCase.revision).package; + actual = actual.replace(/-\d{4}$/, '-0000'); + + if(actual !== testCase.expected) { + throw new Error(`Version mismatch for ${JSON.stringify(testCase)}: get ${actual}`); + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/gulp/version.js b/packages/f-theme-editor/farris-theme-editor/build/gulp/version.js new file mode 100644 index 0000000000000000000000000000000000000000..b41b6926330bafcbadeab1e76efbe16bf9842e5a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/gulp/version.js @@ -0,0 +1,59 @@ +'use strict'; + +const envTail = 'DEVEXTREME_TMP_TAIL'; + +if(!process.env[envTail]) { + const date = new Date(); + const padStart = (number) => ('0' + number).slice(-2); + const hours = padStart(date.getHours()); + const minutes = padStart(date.getMinutes()); + + // We need to write the tail to the env because 'gulp-multi-process' will create multiple node processes + // which require this file multiple times + process.env[envTail] = hours + minutes; +} + +const getDefaultFlavor = (label, minor, revision) => { + return label + ? (minor <= 2 ? 'beta' : '') + : revision + ? (minor <= 1 ? 'alpha' : 'build') + : 'dev'; +}; + +const getPackageVersion = (version, flavor, revision) => { + if(revision) { + version = version.replace(/\d+$/, m => 1 + Number(m)); + } + + return [version, flavor, revision] + .filter(v => v) + .join('-'); +}; + +const getProductVersion = (version, revision) => { + return revision + ? version + ' (build ' + revision + ')' + : version; +}; + +const getRevision = (revision) => { + if(!revision) return ''; + return revision + '-' + process.env[envTail]; +}; + +module.exports = (baseVersion, dxBuildLabel, dxBuildFlavor, dxBuildRevision) => { + if(dxBuildLabel && String(dxBuildLabel).replace(/_/g, '.') !== baseVersion) { + throw 'DXBuild label does not match version in package.json'; + } + + const minor = Number(baseVersion.split('.')[2]); + const revision = getRevision(dxBuildRevision); + const flavor = dxBuildFlavor || getDefaultFlavor(dxBuildLabel, minor, revision); + + return { + product: getProductVersion(baseVersion, revision), + package: getPackageVersion(baseVersion, flavor, revision), + script: baseVersion + }; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler-init.js b/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler-init.js new file mode 100644 index 0000000000000000000000000000000000000000..db334efa6a2fe9a61561b990e99dcf9f8bfe2515 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler-init.js @@ -0,0 +1,12 @@ +#!/usr/bin/env node +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const bundle = process.argv.length > 2 ? process.argv[2] : 'dx.custom'; +const configPath = path.join(process.cwd(), bundle + '.config.js'); + +fs.createReadStream(path.join(__dirname, '../bundles', 'dx.custom.config.js')).pipe(fs.createWriteStream(configPath)); + +console.log(configPath + ' successfully created'); diff --git a/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler.js b/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler.js new file mode 100644 index 0000000000000000000000000000000000000000..d2a20e023181372e498f2d9b6e9b40534db8f61e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/npm-bin/bundler.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node +'use strict'; + +const path = require('path'); +const webpack = require('webpack'); + +const outputDir = process.cwd(); +const sourcesDir = path.join(__dirname, '..'); +let bundle = process.argv.length > 2 ? process.argv[2] : 'dx.custom'; + +bundle = bundle.replace(/.config.js$/, ''); + +const baseConfig = require('./webpack.config.js'); // eslint-disable-line node/no-missing-require +const createConfig = function(outputFile, mode) { + const config = Object.assign({}, baseConfig); + + config.mode = mode; + config.context = process.cwd(); + config.entry = './' + bundle + '.config.js'; + config.output = { + path: outputDir, + filename: outputFile + }; + + config.resolve = { + alias: { + 'devextreme': sourcesDir + }, + mainFields: ['main'] + }; + + return config; +}; + +console.log('bundling using \'' + bundle + '.config.js\'...'); +webpack([ + createConfig(bundle + '.debug.js', 'development'), + createConfig(bundle + '.js', 'production') +], function(err, stats) { + if(err) { + throw err; + } + + const jsonStats = stats.toJson(); + if(jsonStats.errors.length) { + console.log('\'' + bundle + '\' bundles creation failed!\n\n' + jsonStats.errors.join('\n\n')); + } else { + console.log('\'' + bundle + '\' bundles created!'); + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/pre-commit/chalks.js b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/chalks.js new file mode 100644 index 0000000000000000000000000000000000000000..a6d4692f531a65a782fc60f11cd5a87a9beb3df1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/chalks.js @@ -0,0 +1,25 @@ +module.exports = { + reset: "\x1b[0m", + bright: "\x1b[1m", + dim: "\x1b[2m", + underscore: "\x1b[4m", + blink: "\x1b[5m", + reverse: "\x1b[7m", + hidden: "\x1b[8m", + black: "\x1b[30m", + red: "\x1b[31m", + green: "\x1b[32m", + yellow: "\x1b[33m", + blue: "\x1b[34m", + magenta: "\x1b[35m", + cyan: "\x1b[36m", + white: "\x1b[37m", + BGblack: "\x1b[40m", + BGred: "\x1b[41m", + BGgreen: "\x1b[42m", + BGyellow: "\x1b[43m", + BGblue: "\x1b[44m", + BGmagenta: "\x1b[45m", + BGcyan: "\x1b[46m", + BGwhite: "\x1b[47m", +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/pre-commit/index.js b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0b90b9a5f6ff8ba2144bd5b0cb24cd4cdd0ffe8c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/index.js @@ -0,0 +1,26 @@ +'use strict'; + +const stagedFiles = require('staged-git-files'); +const validateMaxPath = require('./validate-max-path'); +const validateWorkflows = require('./validate-workflows'); + +const fileStatuses = { + Added: true, + Copied: true, + Deleted: false, + Modified: true, + Renamed: true, + 'Type-Change': false, + Unmerged: false, + Unknown: false +}; + +stagedFiles((err, results) => { + let result = 0; + const staged = results.filter(x => fileStatuses[x.status]); + + result = result | validateMaxPath(staged); + result = result | validateWorkflows(staged); + + process.exit(result); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-max-path.js b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-max-path.js new file mode 100644 index 0000000000000000000000000000000000000000..ff0ac68467ad3d6b593177f16fde9e709d5c14a8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-max-path.js @@ -0,0 +1,20 @@ +'use strict'; + +const MAX_LENGTH = 150; +const chalks = require('./chalks'); + +module.exports = (results) => { + const longFiles = results + .filter((x) => x.filename.length > MAX_LENGTH) + .map((x) => ({ name: x.filename, length: x.filename.length })); + if (longFiles.length) { + longFiles.forEach((x) => { + x.name = `${chalks.green}${x.name.slice(0, MAX_LENGTH)}${chalks.red}${x.name.slice(MAX_LENGTH)}${chalks.reset}`; + }); + const stringified = JSON.stringify(longFiles, null, 2).replace(/\\u001b/g, '\x1b'); + const line = `${chalks.red}The following file names exceed ${MAX_LENGTH} symbols length:${chalks.reset} \r\n${stringified}`; + console.error(line); + return 1; + } + return 0; +} diff --git a/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-workflows.js b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-workflows.js new file mode 100644 index 0000000000000000000000000000000000000000..22d9fd715ffac3df8937b60613895c2e8509fa60 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/pre-commit/validate-workflows.js @@ -0,0 +1,48 @@ +'use strict'; + +const yaml = require('yaml'); +const { readFileSync } = require('fs'); +const chalks = require('./chalks'); + +const exceptions = [ + +] + +module.exports = (results) => { + const workflowList = results + .filter(x => x.filename.match(/^.github\/workflows.*\.ya?ml$/i)) + .map(x => x.filename); + if (workflowList.length) { + const invalidWorkflows = []; + workflowList.forEach((workflowPath) => { + if (exceptions.includes(workflowPath)) + return; + const workflow = yaml.parse(readFileSync(workflowPath).toString()); + const notificationJob = workflow.jobs.notify; + if (!notificationJob) { + console.error(`${chalks.red}ERROR:${chalks.reset} ${chalks.bright}notify${chalks.reset} job missing (${workflowPath})`); + invalidWorkflows.push(workflowPath); + return; + } + delete workflow.jobs.notify; + const jobsSet = new Set(notificationJob.needs); + const missing = []; + Object.keys(workflow.jobs).forEach(job => { + if (!jobsSet.delete(job)) + missing.push(job); + }); + const extra = Array.from(jobsSet); + + if (missing.length) { + console.error(`${chalks.red}ERROR:${chalks.reset} Add the following entries to the ${chalks.bright}notify.needs${chalks.reset} field: ${chalks.green}[${missing}]${chalks.reset} (${workflowPath})`); + invalidWorkflows.push(workflowPath); + } + if (extra.length) { + console.error(`${chalks.red}ERROR:${chalks.reset} Remove the following entries from the ${chalks.bright}notify.needs${chalks.reset} field: ${chalks.red}[${extra}]${chalks.reset} (${workflowPath})`); + invalidWorkflows.push(workflowPath); + } + }); + return invalidWorkflows.length; + } + return 0; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/_settings.js b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/_settings.js new file mode 100644 index 0000000000000000000000000000000000000000..a4feeef748205763c7cb22315260ecb27e3e0efe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/_settings.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + isQuiet: true +}; diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d78c7a55aa64ec2bb838cc86dbb4a8ce834d9d34 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shp new file mode 100644 index 0000000000000000000000000000000000000000..4fb8977de1ced329a100b8bae8058172714f78ec Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shx new file mode 100644 index 0000000000000000000000000000000000000000..dd3a4d56a6e8dab6ebbc66666434af9ee2d47d9b Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/africa.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.dbf new file mode 100644 index 0000000000000000000000000000000000000000..144ada9731402149a2d4fcde46438d0ab8e8ecbd Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shp new file mode 100644 index 0000000000000000000000000000000000000000..2034451d771193824aeeb3db3f196681d5ee19bf Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shx new file mode 100644 index 0000000000000000000000000000000000000000..ae9a9b9500266de6b90e064134cf25ba81042e6d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/canada.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.dbf new file mode 100644 index 0000000000000000000000000000000000000000..0ea9c3918608b93b29e21386f96839aa4a7aeda0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shp new file mode 100644 index 0000000000000000000000000000000000000000..a34af7fe760cc5304b4649081790a4a7c1b3d9c0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shx new file mode 100644 index 0000000000000000000000000000000000000000..55f9ed2544b0592441d970b4fcab7e704aef7983 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/eurasia.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.dbf new file mode 100644 index 0000000000000000000000000000000000000000..d7cf5788d00c8efe2aa6c565ea435b52ab0b6b32 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shp new file mode 100644 index 0000000000000000000000000000000000000000..e261630d3ae1172d1f5b12941a0482e013276a44 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shx new file mode 100644 index 0000000000000000000000000000000000000000..aced8ef538a5c4d97bf0bc1cc8ad7f2f926e102b Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/europe.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.dbf new file mode 100644 index 0000000000000000000000000000000000000000..e4a57b7be5fe2d553d328f242595047a4a24cddc Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shp new file mode 100644 index 0000000000000000000000000000000000000000..1aa1a29137b7005d4d5d485d638caeb09b031c88 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shx new file mode 100644 index 0000000000000000000000000000000000000000..ef5a828793112a7b0207f8668cd6374eb46a3581 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/usa.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.dbf b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.dbf new file mode 100644 index 0000000000000000000000000000000000000000..e87f818770d994e9b5906f2e440897ba9b31d3a2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.dbf differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shp b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shp new file mode 100644 index 0000000000000000000000000000000000000000..32a78cd2d267c4fb4b31a68cf6bed05c7f6c3370 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shp differ diff --git a/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shx b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shx new file mode 100644 index 0000000000000000000000000000000000000000..507f2c2ffdb36c8d36bcb4b1b653d4cdba6cc2d6 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/build/vectormap-sources/world.shx differ diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/clover.xml b/packages/f-theme-editor/farris-theme-editor/coverage/clover.xml new file mode 100644 index 0000000000000000000000000000000000000000..50045ba662dc6aaffd67e10ad5d4f152e09b2f0d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/coverage-final.json b/packages/f-theme-editor/farris-theme-editor/coverage/coverage-final.json new file mode 100644 index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/base.css b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/base.css new file mode 100644 index 0000000000000000000000000000000000000000..f418035b469aff23689a74c912849662f442aed4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/block-navigation.js b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000000000000000000000000000000000000..c7ff5a5cac80f4e9509e7afceb84004b3a44e6c8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/block-navigation.js @@ -0,0 +1,79 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/index.html b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/index.html new file mode 100644 index 0000000000000000000000000000000000000000..733086f97a35b76446dd11de8c97a4adc24f8906 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/index.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for All files + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.css b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.css new file mode 100644 index 0000000000000000000000000000000000000000..b317a7cda31a440fbd47540297ee3c68d51f343e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.js b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.js new file mode 100644 index 0000000000000000000000000000000000000000..b3225238f26e3ab49a5e41e9cb287a73c82740b7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sort-arrow-sprite.png b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sorter.js b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sorter.js new file mode 100644 index 0000000000000000000000000000000000000000..16de10c4349e427164041e85133d97f68f8d3a29 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/coverage/lcov-report/sorter.js @@ -0,0 +1,170 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/packages/f-theme-editor/farris-theme-editor/coverage/lcov.info b/packages/f-theme-editor/farris-theme-editor/coverage/lcov.info new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/f-theme-editor/farris-theme-editor/farris-ui/bundles/farris.all.js b/packages/f-theme-editor/farris-theme-editor/farris-ui/bundles/farris.all.js new file mode 100755 index 0000000000000000000000000000000000000000..872c52174d7c75c5ac0f9f3a8ebec1834dd7190c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/farris-ui/bundles/farris.all.js @@ -0,0 +1,5 @@ +// STYLE button + +export default class Button { + +} diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/Indeterminate.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/Indeterminate.svg new file mode 100644 index 0000000000000000000000000000000000000000..f221a3ad9806f7ddd70de67c6d416f3de72cbcfc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/Indeterminate.svg @@ -0,0 +1,5 @@ + + +Indeterminate + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-header.svg new file mode 100644 index 0000000000000000000000000000000000000000..3fc5bed34d2c24cbf7e9284131c31945654a2efe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-header.svg @@ -0,0 +1,6 @@ + + +add-header + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-table.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-table.svg new file mode 100644 index 0000000000000000000000000000000000000000..8fa516b85b2b8ba327f3a0f24d18a4ee43db7bf0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add-table.svg @@ -0,0 +1,6 @@ + + +add-table + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add.svg new file mode 100644 index 0000000000000000000000000000000000000000..0694a3b1e296690107c3a9c802c0d58acd884a10 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/add.svg @@ -0,0 +1,5 @@ + + +add + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/airplane.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/airplane.svg new file mode 100644 index 0000000000000000000000000000000000000000..7457c41ecba1a7bfbcd339d523d706761c9eeb02 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/airplane.svg @@ -0,0 +1,5 @@ + + +airplane + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/aligncenter.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/aligncenter.svg new file mode 100644 index 0000000000000000000000000000000000000000..a27dedc9feb8fdb0d8323ddc6882ce42af939556 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/aligncenter.svg @@ -0,0 +1,9 @@ + + +aligncenter + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignjustify.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignjustify.svg new file mode 100644 index 0000000000000000000000000000000000000000..e271f6a817dfe98b0d714ebb4902baeffefbb5c5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignjustify.svg @@ -0,0 +1,9 @@ + + +alignjustify + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..7c90a866a1211abac04f9d015788a58e39284d77 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignleft.svg @@ -0,0 +1,9 @@ + + +alignleft + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignright.svg new file mode 100644 index 0000000000000000000000000000000000000000..1a1533efd20383bf202d6d9cb5cc3dccf70f1bb2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/alignright.svg @@ -0,0 +1,9 @@ + + +alignright + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowdown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowdown.svg new file mode 100644 index 0000000000000000000000000000000000000000..4255518592ec50578450408f634b3fdc131143fb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowdown.svg @@ -0,0 +1,5 @@ + + +arrowdown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..04b30c5fd78e724812a3d2f63f4a9f451b3b6165 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowleft.svg @@ -0,0 +1,5 @@ + + +arrowleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowright.svg new file mode 100644 index 0000000000000000000000000000000000000000..39ca7510fafa3177987fe7ca7cf299f5212bb92d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowright.svg @@ -0,0 +1,5 @@ + + +arrowright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowup.svg new file mode 100644 index 0000000000000000000000000000000000000000..ba54ab03cfa46ddd636a95c97f39783d7fe843ba --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/arrowup.svg @@ -0,0 +1,5 @@ + + +arrowup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/attach.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/attach.svg new file mode 100644 index 0000000000000000000000000000000000000000..2f16d2c220aa9207f04bc980297bae47cf7b5b9d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/attach.svg @@ -0,0 +1,5 @@ + + +attach + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/background.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/background.svg new file mode 100644 index 0000000000000000000000000000000000000000..33a0f14010c16efcc297d5a2cd3750e9af72fa14 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/background.svg @@ -0,0 +1,7 @@ + + +background + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/blockquote.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/blockquote.svg new file mode 100644 index 0000000000000000000000000000000000000000..c894dde07018344fffac47a5e56bc5c0ed1abf69 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/blockquote.svg @@ -0,0 +1,6 @@ + + +blockquote + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bmp.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bmp.svg new file mode 100644 index 0000000000000000000000000000000000000000..9cfabb44a413b9cd145d34f4f99e4cde2a0d5087 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bmp.svg @@ -0,0 +1,9 @@ + + +bmp + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bold.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bold.svg new file mode 100644 index 0000000000000000000000000000000000000000..ac85e6b0a45975081723be27941e7b5bdc156da6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bold.svg @@ -0,0 +1,5 @@ + + +bold + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bookmark.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bookmark.svg new file mode 100644 index 0000000000000000000000000000000000000000..af85720284995e8de01fc01193657da120614b7a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bookmark.svg @@ -0,0 +1,5 @@ + + +bookmark + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/box.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/box.svg new file mode 100644 index 0000000000000000000000000000000000000000..4f1db9ea6cc722f3e3f4aaf0d623cd43debb824f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/box.svg @@ -0,0 +1,5 @@ + + +box + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bulletlist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bulletlist.svg new file mode 100644 index 0000000000000000000000000000000000000000..7842a12df090c9e25dd545a71fa64ed2e9c25cf5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/bulletlist.svg @@ -0,0 +1,10 @@ + + +bulletlist + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/car.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/car.svg new file mode 100644 index 0000000000000000000000000000000000000000..e004c3cf57d066c09473652dc10a198bc2e8bbc2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/car.svg @@ -0,0 +1,5 @@ + + +car + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/card.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/card.svg new file mode 100644 index 0000000000000000000000000000000000000000..1676217f181b6b2438dccbe6ae31177e68c3a339 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/card.svg @@ -0,0 +1,5 @@ + + +card + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cart.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cart.svg new file mode 100644 index 0000000000000000000000000000000000000000..e9209abfde5c54d4ce4b9caf44281da7da4d2c51 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cart.svg @@ -0,0 +1,7 @@ + + +cart + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chart.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chart.svg new file mode 100644 index 0000000000000000000000000000000000000000..e249adfafa027fb7088d679eeb0f4da082155a92 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chart.svg @@ -0,0 +1,7 @@ + + +chart + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/check.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/check.svg new file mode 100644 index 0000000000000000000000000000000000000000..314df31453b2f792b50fac7a2278f0307ab9bae9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/check.svg @@ -0,0 +1,5 @@ + + +check + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/checklist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/checklist.svg new file mode 100644 index 0000000000000000000000000000000000000000..42966e781f355e2ea77271820c0c036642189a87 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/checklist.svg @@ -0,0 +1,8 @@ + + +checklist + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..44c0aed8d03cd82319fde011f81e822e17676a4b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleleft.svg @@ -0,0 +1,6 @@ + + +chevrondoubleleft + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleright.svg new file mode 100644 index 0000000000000000000000000000000000000000..094a8bb02152ecd9b37b3897a2f14608384e58e9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondoubleright.svg @@ -0,0 +1,6 @@ + + +chevrondoubleright + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondown.svg new file mode 100644 index 0000000000000000000000000000000000000000..2c63f3e65c45d45182b2f3afbd8701410b712f4a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevrondown.svg @@ -0,0 +1,5 @@ + + +chevrondown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..f9f75bca041220aa9135b8b55470d3414b7349d1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronleft.svg @@ -0,0 +1,5 @@ + + +chevronleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronright.svg new file mode 100644 index 0000000000000000000000000000000000000000..6b8f3d1cfcecd2f02bb75b8318b151aa9a1a50e6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronright.svg @@ -0,0 +1,5 @@ + + +chevronright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronup.svg new file mode 100644 index 0000000000000000000000000000000000000000..517d1eade5d536021b2fa2d79e66ea0bb5a189b2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/chevronup.svg @@ -0,0 +1,5 @@ + + +chevronup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clear.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clear.svg new file mode 100644 index 0000000000000000000000000000000000000000..e91516b309128a36680f6736ec67c1569211551b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clear.svg @@ -0,0 +1,5 @@ + + +clear + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearformat.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearformat.svg new file mode 100644 index 0000000000000000000000000000000000000000..02b2dd0f162762f98621aa57781afa42be628541 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearformat.svg @@ -0,0 +1,6 @@ + + +clearformat + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearsquare.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearsquare.svg new file mode 100644 index 0000000000000000000000000000000000000000..9c4e63f2e1e5db21dc9e2e982391efcf9336dd93 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clearsquare.svg @@ -0,0 +1,5 @@ + + +clearsquare + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clock.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clock.svg new file mode 100644 index 0000000000000000000000000000000000000000..86225b7d274ac2eb5a276476346f175dd161e9e0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/clock.svg @@ -0,0 +1,6 @@ + + +clock + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/close.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/close.svg new file mode 100644 index 0000000000000000000000000000000000000000..244087fe12b307c5b970e3800af59ac681b3dcdb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/close.svg @@ -0,0 +1,5 @@ + + +close + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/codeblock.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/codeblock.svg new file mode 100644 index 0000000000000000000000000000000000000000..b3ef2b3f5ebe5bb1bda63be8174d907295f38992 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/codeblock.svg @@ -0,0 +1,6 @@ + + +codeblock + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/coffee.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/coffee.svg new file mode 100644 index 0000000000000000000000000000000000000000..ddc620a2e3f7df70886d9a10738fff289025d32d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/coffee.svg @@ -0,0 +1,6 @@ + + +coffee + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/collapse.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/collapse.svg new file mode 100644 index 0000000000000000000000000000000000000000..a3fbe77a5d94df46ddd3a6c414025f664450ab5a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/collapse.svg @@ -0,0 +1,6 @@ + + +collapse + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/color.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/color.svg new file mode 100644 index 0000000000000000000000000000000000000000..c54b2509753f7a5097cd727562f13cbf3d886943 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/color.svg @@ -0,0 +1,6 @@ + + +color + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnchooser.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnchooser.svg new file mode 100644 index 0000000000000000000000000000000000000000..cd141c7ed5948ea6e5d1a54a84a22225533a3363 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnchooser.svg @@ -0,0 +1,5 @@ + + +columnchooser + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnfield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnfield.svg new file mode 100644 index 0000000000000000000000000000000000000000..42069d8230d696deaafc362aa45725e4c4fb1475 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/columnfield.svg @@ -0,0 +1,11 @@ + + +columnfield + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/comment.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/comment.svg new file mode 100644 index 0000000000000000000000000000000000000000..5aa1f0770cfc3c69f9145ab4bf5143721224958f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/comment.svg @@ -0,0 +1,5 @@ + + +comment + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/contains.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/contains.svg new file mode 100644 index 0000000000000000000000000000000000000000..65bd74a9c9a5a9e84d046f507dee8bfc0836defe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/contains.svg @@ -0,0 +1,8 @@ + + +contains + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/copy.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/copy.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d2293d2dcb9f36d653d85ad16f6567659be5bf2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/copy.svg @@ -0,0 +1,6 @@ + + +copy + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cut.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cut.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f0acf937b8cb87510be16fe1a959815bab03add --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/cut.svg @@ -0,0 +1,6 @@ + + +cut + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/datafield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/datafield.svg new file mode 100644 index 0000000000000000000000000000000000000000..46e66467e105eb5ba4bb035347d431f1f8975a46 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/datafield.svg @@ -0,0 +1,7 @@ + + +datafield + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/decreaseindent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/decreaseindent.svg new file mode 100644 index 0000000000000000000000000000000000000000..352e3b7e44a6eb84fe5f3d214255a223e9bc0030 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/decreaseindent.svg @@ -0,0 +1,10 @@ + + +decreaseindent + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/details_view.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/details_view.svg new file mode 100644 index 0000000000000000000000000000000000000000..0b53b70321a2b87e7a192b79a65427cc2aa15476 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/details_view.svg @@ -0,0 +1,12 @@ + + +details_view + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc-1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc-1.svg new file mode 100644 index 0000000000000000000000000000000000000000..90b16994da026bde78e156dbb45ad7a643355c24 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc-1.svg @@ -0,0 +1,8 @@ + + +doc-1 + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc.svg new file mode 100644 index 0000000000000000000000000000000000000000..3aa6aca3d23f4d48e7714bce5685860fafb287fd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc.svg @@ -0,0 +1,5 @@ + + +doc + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc_1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc_1.svg new file mode 100644 index 0000000000000000000000000000000000000000..16e08a3cafc5f6e2ba7f0961cd80f6ffc9e91f95 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doc_1.svg @@ -0,0 +1,8 @@ + + +doc_1 + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/docx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/docx.svg new file mode 100644 index 0000000000000000000000000000000000000000..54e5dec86ca315824af565dac7343eb066722c1e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/docx.svg @@ -0,0 +1,10 @@ + + +docx + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doesnotcontain.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doesnotcontain.svg new file mode 100644 index 0000000000000000000000000000000000000000..8ff9e978a86b51ed99f151f4391fdc0c726553dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/doesnotcontain.svg @@ -0,0 +1,9 @@ + + +doesnotcontain + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/download.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/download.svg new file mode 100644 index 0000000000000000000000000000000000000000..58377e23fc7cb6aec9870b282cd84f656b78bbe8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/download.svg @@ -0,0 +1,6 @@ + + +download + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drag.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drag.svg new file mode 100644 index 0000000000000000000000000000000000000000..519ded11cbd6836b2c9355fe474e55eec0f57e47 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drag.svg @@ -0,0 +1,10 @@ + + +drag + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-left.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-left.svg new file mode 100644 index 0000000000000000000000000000000000000000..37b0465bc785f0f623c072ff46c4a1c21ab42a1e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-left.svg @@ -0,0 +1,7 @@ + + +drawer-left + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-right.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-right.svg new file mode 100644 index 0000000000000000000000000000000000000000..e78cddfcabe37f08e6df719c0b1304a43f7cde31 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/drawer-right.svg @@ -0,0 +1,7 @@ + + +drawer-right + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit-header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit-header.svg new file mode 100644 index 0000000000000000000000000000000000000000..a2c15773fed9e0d6b73880140a47bca0c59521c5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit-header.svg @@ -0,0 +1,7 @@ + + +edit-header + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit.svg new file mode 100644 index 0000000000000000000000000000000000000000..2cc9e7c2f66e8aac74d30dd4c97bc015498cc36a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/edit.svg @@ -0,0 +1,6 @@ + + +edit + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/email.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/email.svg new file mode 100644 index 0000000000000000000000000000000000000000..43146faa97c16430dfee3a360db960d2147ec531 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/email.svg @@ -0,0 +1,5 @@ + + +email + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/endswith.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/endswith.svg new file mode 100644 index 0000000000000000000000000000000000000000..83122589bf81c5546fedd05ebe0b928da2476bfb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/endswith.svg @@ -0,0 +1,7 @@ + + +endswith + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/equal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/equal.svg new file mode 100644 index 0000000000000000000000000000000000000000..16c59846617e68684d32486ebba7c26a88e7c338 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/equal.svg @@ -0,0 +1,6 @@ + + +equal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/event.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/event.svg new file mode 100644 index 0000000000000000000000000000000000000000..4e3d5c911ff52b703a7fe2f63d97f5bd7c85b73d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/event.svg @@ -0,0 +1,8 @@ + + +event + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/expand.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/expand.svg new file mode 100644 index 0000000000000000000000000000000000000000..dd70e07f400cc0c3cace8f49475849878fa3a0e0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/expand.svg @@ -0,0 +1,6 @@ + + +expand + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/export.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/export.svg new file mode 100644 index 0000000000000000000000000000000000000000..073fd5d638c119a17f139ca3425d063033cd58ee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/export.svg @@ -0,0 +1,6 @@ + + +export + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportpdf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportpdf.svg new file mode 100644 index 0000000000000000000000000000000000000000..7e17b580e34e3d945d07836e397b8df7671fed8d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportpdf.svg @@ -0,0 +1,6 @@ + + +exportpdf + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportselected.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportselected.svg new file mode 100644 index 0000000000000000000000000000000000000000..dd2a0cc966d918b023fa76d22a14574589706b72 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportselected.svg @@ -0,0 +1,7 @@ + + +exportselected + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportxlsx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportxlsx.svg new file mode 100644 index 0000000000000000000000000000000000000000..06de5b1b2306e9c24c7456705d969dcfa4fe3fc4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/exportxlsx.svg @@ -0,0 +1,8 @@ + + +exportxlsx + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/favorites.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/favorites.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f7699fa06f9601b545e80175cedd6e831ad42f2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/favorites.svg @@ -0,0 +1,5 @@ + + +favorites + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fieldchooser.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fieldchooser.svg new file mode 100644 index 0000000000000000000000000000000000000000..51770ef8cae1ecfa123faa87ae80de68fb5adbc7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fieldchooser.svg @@ -0,0 +1,7 @@ + + +fieldchooser + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fields.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fields.svg new file mode 100644 index 0000000000000000000000000000000000000000..420451f05671968a482832d59b3272d78721e22f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fields.svg @@ -0,0 +1,6 @@ + + +fields + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fill.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fill.svg new file mode 100644 index 0000000000000000000000000000000000000000..47ad41878813b68b49f7dd9b1258264d650be065 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fill.svg @@ -0,0 +1,6 @@ + + +fill + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/filter.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/filter.svg new file mode 100644 index 0000000000000000000000000000000000000000..f70d06654babef2b204cb375376a0de56c880cc7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/filter.svg @@ -0,0 +1,5 @@ + + +filter + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/find.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/find.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ec959d14c7230a149479f23c2122d15b423ad31 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/find.svg @@ -0,0 +1,5 @@ + + +find + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/floppy.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/floppy.svg new file mode 100644 index 0000000000000000000000000000000000000000..a7d1a3875a88f8733c04a3391aae6a1df55f8f3b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/floppy.svg @@ -0,0 +1,5 @@ + + +floppy + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder-close.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder-close.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d8bb8af8d22a9c292fbf5231c0eac951460d0b8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder-close.svg @@ -0,0 +1,5 @@ + + +folder-close + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder.svg new file mode 100644 index 0000000000000000000000000000000000000000..42a2fe94aa147ad6f67f61f148ce8cfba4f90ba1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/folder.svg @@ -0,0 +1,5 @@ + + +folder + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/font.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/font.svg new file mode 100644 index 0000000000000000000000000000000000000000..0427db5b44268b6a167ef6b536e8ccfdb6073016 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/font.svg @@ -0,0 +1,6 @@ + + +font + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fontsize.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fontsize.svg new file mode 100644 index 0000000000000000000000000000000000000000..6f0107b2aebbab3e8637e15236e809d9e73717c8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fontsize.svg @@ -0,0 +1,7 @@ + + +fontsize + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/food.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/food.svg new file mode 100644 index 0000000000000000000000000000000000000000..09f10f13069bfcd22c9f96ac6f6cb117f59037fc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/food.svg @@ -0,0 +1,9 @@ + + +food + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/formula.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/formula.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa392d5f7c3feea40da4ecd74b69343813ccbcdb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/formula.svg @@ -0,0 +1,5 @@ + + +formula + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fullscreen.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fullscreen.svg new file mode 100644 index 0000000000000000000000000000000000000000..f432b0da6d56cbac4a481d3249128b84d1ccaca7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/fullscreen.svg @@ -0,0 +1,8 @@ + + +fullscreen + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/gift.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/gift.svg new file mode 100644 index 0000000000000000000000000000000000000000..ee3076984b35609cfd932965d86c56e9a43134fe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/gift.svg @@ -0,0 +1,7 @@ + + +gift + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/globe.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/globe.svg new file mode 100644 index 0000000000000000000000000000000000000000..04709dcb929763e43631b6a08a98248ab8e6b107 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/globe.svg @@ -0,0 +1,5 @@ + + +globe + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greater.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greater.svg new file mode 100644 index 0000000000000000000000000000000000000000..e310f8280788dd1ffb940a9c2240fd2696ac11a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greater.svg @@ -0,0 +1,5 @@ + + +greater + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greaterorequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greaterorequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..75520779c445d9fc2a04f6ecc7c292da9174cb6d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/greaterorequal.svg @@ -0,0 +1,6 @@ + + +greaterorequal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/group.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/group.svg new file mode 100644 index 0000000000000000000000000000000000000000..9bc9bf9f278a692be52a8cf84c92ff8ce864fa95 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/group.svg @@ -0,0 +1,8 @@ + + +group + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/grouped.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/grouped.svg new file mode 100644 index 0000000000000000000000000000000000000000..076e13ff944e19fcaa57aeff3e8d1094e368fc79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/grouped.svg @@ -0,0 +1,7 @@ + + +grouped + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/growfont.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/growfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..4389f6157aad777efb40b4520d80f55b985b1e57 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/growfont.svg @@ -0,0 +1,6 @@ + + +growfont + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/header.svg new file mode 100644 index 0000000000000000000000000000000000000000..ea5ca02e4dccbd4bd68c864ae142c5d50284cd15 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/header.svg @@ -0,0 +1,5 @@ + + +header + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/help.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/help.svg new file mode 100644 index 0000000000000000000000000000000000000000..36d5ddc5d68b086144d1193108a6b6b9c8ae0a79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/help.svg @@ -0,0 +1,6 @@ + + +help + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/home.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/home.svg new file mode 100644 index 0000000000000000000000000000000000000000..c3cf5f5f096e39c4de632c9298f51bfddc919049 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/home.svg @@ -0,0 +1,5 @@ + + +home + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/image.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/image.svg new file mode 100644 index 0000000000000000000000000000000000000000..07a652697e83ec90feb6733480b274b11b364a26 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/image.svg @@ -0,0 +1,5 @@ + + +image + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import-selected.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import-selected.svg new file mode 100644 index 0000000000000000000000000000000000000000..728052896b3c7c12a60447cc6b278bad8ea71dde --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import-selected.svg @@ -0,0 +1,8 @@ + + +import-selected + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import.svg new file mode 100644 index 0000000000000000000000000000000000000000..c460c44c3ff8b41a4ffa48ea1d82bad909d8d5b6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/import.svg @@ -0,0 +1,6 @@ + + +import + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/increaseindent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/increaseindent.svg new file mode 100644 index 0000000000000000000000000000000000000000..5fb856657502eeba642dfefa262c232e720574c2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/increaseindent.svg @@ -0,0 +1,10 @@ + + +increaseindent + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent.svg new file mode 100644 index 0000000000000000000000000000000000000000..59d5ce3ae117537e0d08b80cfe5da5c8a7430b5c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent.svg @@ -0,0 +1,11 @@ + + +indent + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent1.svg new file mode 100644 index 0000000000000000000000000000000000000000..aea8f39c43fc3556d1218c2691488119430d270c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/indent1.svg @@ -0,0 +1,11 @@ + + +indent1 + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/info.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/info.svg new file mode 100644 index 0000000000000000000000000000000000000000..4057f4bbb48be925bea01e1c46ad904ea5fabfc7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/info.svg @@ -0,0 +1,7 @@ + + +info + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isblank.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isblank.svg new file mode 100644 index 0000000000000000000000000000000000000000..911b49d493c845bd6dd0a3fe60e413ec5eb96dab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isblank.svg @@ -0,0 +1,5 @@ + + +isblank + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isnotblank.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isnotblank.svg new file mode 100644 index 0000000000000000000000000000000000000000..08ab0a7b34a814e6478ac17738418bf53be274e9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/isnotblank.svg @@ -0,0 +1,5 @@ + + +isnotblank + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/italic.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/italic.svg new file mode 100644 index 0000000000000000000000000000000000000000..4ff2530688d052e2dbb177113bdc621fdc34db3e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/italic.svg @@ -0,0 +1,5 @@ + + +italic + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/jpg.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/jpg.svg new file mode 100644 index 0000000000000000000000000000000000000000..f2f81c3312e1d820e18e4e2d7bdce5d447a19ff8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/jpg.svg @@ -0,0 +1,8 @@ + + +jpg + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/key.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/key.svg new file mode 100644 index 0000000000000000000000000000000000000000..4ca1a718a4345cdb369c0640869d3e0802397323 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/key.svg @@ -0,0 +1,5 @@ + + +key + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/keyboard_return.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/keyboard_return.svg new file mode 100644 index 0000000000000000000000000000000000000000..c6d79f4a2c20e35c345a1e64fec4bbfa42882c87 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/keyboard_return.svg @@ -0,0 +1,5 @@ + + +keyboard_return + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/less.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/less.svg new file mode 100644 index 0000000000000000000000000000000000000000..d4ee7c641b00f05a60ff9d30b1950b0460a18b7b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/less.svg @@ -0,0 +1,5 @@ + + +less + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/lessorequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/lessorequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..3658044eda3349e9b169c8da7410d7ed578a15a4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/lessorequal.svg @@ -0,0 +1,6 @@ + + +lessorequal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/like.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/like.svg new file mode 100644 index 0000000000000000000000000000000000000000..7ceb711740690b2fd3cafb5e049b2a1d707a6f96 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/like.svg @@ -0,0 +1,5 @@ + + +like + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/link.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/link.svg new file mode 100644 index 0000000000000000000000000000000000000000..b4999bd8afb818e39e29b7c705410121b85ce83f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/link.svg @@ -0,0 +1,6 @@ + + +link + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/map.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/map.svg new file mode 100644 index 0000000000000000000000000000000000000000..edcec4e297dba5b3bcd3c83877c85d88a349c23d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/map.svg @@ -0,0 +1,6 @@ + + +map + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/mention.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/mention.svg new file mode 100644 index 0000000000000000000000000000000000000000..cf4fc390cb9bd8b81c28afe6f009e0124a5c42f7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/mention.svg @@ -0,0 +1,5 @@ + + +mention + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/menu.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/menu.svg new file mode 100644 index 0000000000000000000000000000000000000000..ad8b7a1c96caa474d0d4b390d3c3b82c0bc04838 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/menu.svg @@ -0,0 +1,7 @@ + + +menu + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/minus.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/minus.svg new file mode 100644 index 0000000000000000000000000000000000000000..73364547cd7abfe446a210a6778385ef42c59d7e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/minus.svg @@ -0,0 +1,5 @@ + + +minus + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/money.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/money.svg new file mode 100644 index 0000000000000000000000000000000000000000..a62bf6e31297826a574a3ed71de6e225c7fd549d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/money.svg @@ -0,0 +1,6 @@ + + +money + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/more.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/more.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf5a57fde9befe059e1fe4d47e18abb8e6ec581b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/more.svg @@ -0,0 +1,7 @@ + + +more + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/move.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/move.svg new file mode 100644 index 0000000000000000000000000000000000000000..f08c95dda9cc5c594eb23320c341183f73fdb8e2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/move.svg @@ -0,0 +1,6 @@ + + +move + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/music.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/music.svg new file mode 100644 index 0000000000000000000000000000000000000000..e63632853ebbeeb726cbcab39fd369bfb3ef5dc3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/music.svg @@ -0,0 +1,5 @@ + + +music + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/new-folder.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/new-folder.svg new file mode 100644 index 0000000000000000000000000000000000000000..6812fa6c1de845d467d1c3e25009d5cc93c48a8a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/new-folder.svg @@ -0,0 +1,6 @@ + + +new-folder + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/notequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/notequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..596080ad93941d056ac113db414b4096553177af --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/notequal.svg @@ -0,0 +1,5 @@ + + +notequal + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/orderedlist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/orderedlist.svg new file mode 100644 index 0000000000000000000000000000000000000000..c86803b4f941bef33e37cf75578bef3bab69c7ec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/orderedlist.svg @@ -0,0 +1,10 @@ + + +orderedlist + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/overflow.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/overflow.svg new file mode 100644 index 0000000000000000000000000000000000000000..4e65e0c9b6d272a109d0868c633db49cf5ee21ca --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/overflow.svg @@ -0,0 +1,7 @@ + + +overflow + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/palette.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/palette.svg new file mode 100644 index 0000000000000000000000000000000000000000..800e25102c399d47ff279cb5990b999e398df0ab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/palette.svg @@ -0,0 +1,5 @@ + + +palette + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past-free.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past-free.svg new file mode 100644 index 0000000000000000000000000000000000000000..82d3d059f4cb29e8d2547d25a18c268a10562af3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past-free.svg @@ -0,0 +1,6 @@ + + +past-free + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past.svg new file mode 100644 index 0000000000000000000000000000000000000000..f513f4ee7dd29eb6fc887285be6ad07a6ca14164 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/past.svg @@ -0,0 +1,5 @@ + + +past + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pdf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pdf.svg new file mode 100644 index 0000000000000000000000000000000000000000..7829fdac0990f260a5c4ef9ca0c2e563b4171cf9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pdf.svg @@ -0,0 +1,8 @@ + + +pdf + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/percent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/percent.svg new file mode 100644 index 0000000000000000000000000000000000000000..384d5ce249c9b60160296972e9f383daa1cfb0b1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/percent.svg @@ -0,0 +1,7 @@ + + +percent + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/photo.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/photo.svg new file mode 100644 index 0000000000000000000000000000000000000000..f08d3827bb56c0706b9c3f3d62343d4e2429df94 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/photo.svg @@ -0,0 +1,6 @@ + + +photo + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pin.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pin.svg new file mode 100644 index 0000000000000000000000000000000000000000..773f376cdbaa8f0048df7fff0030504401b8e77e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pin.svg @@ -0,0 +1,5 @@ + + +pin + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..b8a5d8d641521120b449480702271e34b756cfa5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinleft.svg @@ -0,0 +1,6 @@ + + +pinleft + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinright.svg new file mode 100644 index 0000000000000000000000000000000000000000..836d9ef819723dbf546352fe4ca8d98479235323 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pinright.svg @@ -0,0 +1,6 @@ + + +pinright + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/ppt.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/ppt.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c6de8c1e37e50fafaa8fddf400248f4964628a5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/ppt.svg @@ -0,0 +1,8 @@ + + +ppt + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pptx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pptx.svg new file mode 100644 index 0000000000000000000000000000000000000000..97fbb73c4d9e4c1ca2e86380c67e3ede9718eed8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pptx.svg @@ -0,0 +1,10 @@ + + +pptx + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/preferences.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/preferences.svg new file mode 100644 index 0000000000000000000000000000000000000000..dcd28c3342f32dfcdb7b23206223043fa6eed720 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/preferences.svg @@ -0,0 +1,5 @@ + + +preferences + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/print.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/print.svg new file mode 100644 index 0000000000000000000000000000000000000000..bc18d6611d2639f474ce8ee01396a4bd74184048 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/print.svg @@ -0,0 +1,6 @@ + + +print + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/product.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/product.svg new file mode 100644 index 0000000000000000000000000000000000000000..619ea3cda484789deec4d120d31d393490fa76ba --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/product.svg @@ -0,0 +1,6 @@ + + +product + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pulldown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pulldown.svg new file mode 100644 index 0000000000000000000000000000000000000000..c71eb41a8dc904c9acb034246c4134890a7d26e1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/pulldown.svg @@ -0,0 +1,5 @@ + + +pulldown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/range.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/range.svg new file mode 100644 index 0000000000000000000000000000000000000000..7c5a1520358b80f384fa218a299fc5e3a542aace --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/range.svg @@ -0,0 +1,5 @@ + + +range + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/redo.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/redo.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c8375deaa48065bf18cc1d1ee6bd4f8af3e0ec6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/redo.svg @@ -0,0 +1,5 @@ + + +redo + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/refresh.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/refresh.svg new file mode 100644 index 0000000000000000000000000000000000000000..a49db3062458077da6f2a3714524f57af9ef10a9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/refresh.svg @@ -0,0 +1,6 @@ + + +refresh + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/remove-table.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/remove-table.svg new file mode 100644 index 0000000000000000000000000000000000000000..95314e66bd72d743eb6e7fe29753ea1ac15856d4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/remove-table.svg @@ -0,0 +1,6 @@ + + +remove-table + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rename.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rename.svg new file mode 100644 index 0000000000000000000000000000000000000000..cefb22adc18f3f4a02c5bb33ca84ab33e7dda6ef --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rename.svg @@ -0,0 +1,7 @@ + + +rename + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/repeat.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/repeat.svg new file mode 100644 index 0000000000000000000000000000000000000000..d28fc344b68c72dae4837e7452a57be3ed4f1386 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/repeat.svg @@ -0,0 +1,5 @@ + + +repeat + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/revert.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/revert.svg new file mode 100644 index 0000000000000000000000000000000000000000..926522ee1b35d40fa19ed770cb7e2f0a89e590fe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/revert.svg @@ -0,0 +1,5 @@ + + +revert + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rowfield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rowfield.svg new file mode 100644 index 0000000000000000000000000000000000000000..1e190311019fbf7e59b16319b4c14e14ce002345 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rowfield.svg @@ -0,0 +1,11 @@ + + +rowfield + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rtf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rtf.svg new file mode 100644 index 0000000000000000000000000000000000000000..1c3f4abe398676fd5abf0517aa8c7c61511ff4f5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/rtf.svg @@ -0,0 +1,8 @@ + + +rtf + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/runner.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/runner.svg new file mode 100644 index 0000000000000000000000000000000000000000..49bde235d213fe889d55c4dc7fa24ccd7c783493 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/runner.svg @@ -0,0 +1,5 @@ + + +runner + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/save.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/save.svg new file mode 100644 index 0000000000000000000000000000000000000000..d688f8c6a37c6a81bf56c50dcee1b1ddfe3c2652 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/save.svg @@ -0,0 +1,5 @@ + + +save + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/selectall.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/selectall.svg new file mode 100644 index 0000000000000000000000000000000000000000..629b0d7fc34454c9e4baf4513f1e6e208a230108 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/selectall.svg @@ -0,0 +1,6 @@ + + +selectall + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/share.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/share.svg new file mode 100644 index 0000000000000000000000000000000000000000..03f595a2fee9a5c0ecf502d64f00ef181f514a56 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/share.svg @@ -0,0 +1,5 @@ + + +share + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/shrinkfont.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/shrinkfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..a5e7d8aaaf993d60cbe7e06229f2ca296eccc399 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/shrinkfont.svg @@ -0,0 +1,6 @@ + + +shrinkfont + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdown.svg new file mode 100644 index 0000000000000000000000000000000000000000..2e84a13638dd76b332e9fb6307365badd9a6d5bb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdown.svg @@ -0,0 +1,5 @@ + + +sortdown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdowntext.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdowntext.svg new file mode 100644 index 0000000000000000000000000000000000000000..9dc11eee5ca401ffb88618abe3e358ce8e46ede9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortdowntext.svg @@ -0,0 +1,7 @@ + + +sortdowntext + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sorted.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sorted.svg new file mode 100644 index 0000000000000000000000000000000000000000..3c20c5a54e24555cef9e70d21a03613fc2344edf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sorted.svg @@ -0,0 +1,6 @@ + + +sorted + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortup.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f7e850fc2767ed3c1863be36f8b5eaa35fc3211 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortup.svg @@ -0,0 +1,5 @@ + + +sortup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortuptext.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortuptext.svg new file mode 100644 index 0000000000000000000000000000000000000000..93d3789bf7c8698db270acdc7ac4f8c7b4595422 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/sortuptext.svg @@ -0,0 +1,7 @@ + + +sortuptext + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spindown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spindown.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a792b6616febaf73270afb3d689650e3b4eba6b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spindown.svg @@ -0,0 +1,5 @@ + + +spindown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..3f5983e70b390aa470e10d2bb7b8a274e46f36c8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinleft.svg @@ -0,0 +1,5 @@ + + +spinleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinright.svg new file mode 100644 index 0000000000000000000000000000000000000000..85b57bd5afd962adafeb779289693c77deadddde --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinright.svg @@ -0,0 +1,5 @@ + + +spinright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinup.svg new file mode 100644 index 0000000000000000000000000000000000000000..ca8fc4b86505fbf2fceeaa5703454eb8dbef1cec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/spinup.svg @@ -0,0 +1,5 @@ + + +spinup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/square.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/square.svg new file mode 100644 index 0000000000000000000000000000000000000000..a7f443b1c770732b0fdae9784d7ec882898b4f8d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/square.svg @@ -0,0 +1,5 @@ + + +square + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/startswith.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/startswith.svg new file mode 100644 index 0000000000000000000000000000000000000000..1e7f294adc1057d552bc4dad681008b598ebe95b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/startswith.svg @@ -0,0 +1,8 @@ + + +startswith + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/strike.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/strike.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f87c9345211c44eff5a2a45125082867ec9d41b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/strike.svg @@ -0,0 +1,5 @@ + + +strike + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu-list.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu-list.svg new file mode 100644 index 0000000000000000000000000000000000000000..494fc1c851b7d6dce50ad06d79a75cf3005aaba0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu-list.svg @@ -0,0 +1,7 @@ + + +submenu-list + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2bff924a8400d8b3a07532d0e3dbe557c4b353c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/submenu.svg @@ -0,0 +1,13 @@ + + +submenu + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/subscript.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/subscript.svg new file mode 100644 index 0000000000000000000000000000000000000000..2db4cc714928a698c1a5e8e39f4b384e699947a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/subscript.svg @@ -0,0 +1,6 @@ + + +subscript + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/superscript.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/superscript.svg new file mode 100644 index 0000000000000000000000000000000000000000..c74835f74417d4a869c151fff11be249f60ad3ff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/superscript.svg @@ -0,0 +1,6 @@ + + +superscript + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/svg.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/svg.svg new file mode 100644 index 0000000000000000000000000000000000000000..0c7831df72be6c704c19606f8f00baa2d7ed51bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/svg.svg @@ -0,0 +1,8 @@ + + +svg + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-after.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-after.svg new file mode 100644 index 0000000000000000000000000000000000000000..b0de0cf92c9ea844b634c0d5e7a43688154a606d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-after.svg @@ -0,0 +1,6 @@ + + +table-add-column-after + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-before.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-before.svg new file mode 100644 index 0000000000000000000000000000000000000000..2cf36ac3473588988e71e2d1af98a896aaa0a041 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-column-before.svg @@ -0,0 +1,6 @@ + + +table-add-column-before + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-after.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-after.svg new file mode 100644 index 0000000000000000000000000000000000000000..bd27d28d3fb2082c909f41f37118cbca27d2c875 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-after.svg @@ -0,0 +1,6 @@ + + +table-add-row-after + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-before.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-before.svg new file mode 100644 index 0000000000000000000000000000000000000000..2ec873d3c82f7005b4bba45f573ecea3341e562f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-add-row-before.svg @@ -0,0 +1,6 @@ + + +table-add-row-before + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-cell-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-cell-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..ff3bdf8d1a55fe422517cff3c642e88db85560fa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-cell-properties.svg @@ -0,0 +1,7 @@ + + +table-cell-properties + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-column-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-column-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..3fa308d4db05b666b269ed964239d7a08be1d3ab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-column-properties.svg @@ -0,0 +1,7 @@ + + +table-column-properties + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-merge-cells.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-merge-cells.svg new file mode 100644 index 0000000000000000000000000000000000000000..1524ca0ca0b65cb5a1180a756e5b29a3218081e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-merge-cells.svg @@ -0,0 +1,5 @@ + + +table-merge-cells + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..5d041c8c62a27896b4cce0358c13c3108a3506bc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-properties.svg @@ -0,0 +1,7 @@ + + +table-properties + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-column.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-column.svg new file mode 100644 index 0000000000000000000000000000000000000000..679a7531700fa8627bea1c7b08295a61bd7b9e3f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-column.svg @@ -0,0 +1,9 @@ + + +table-remove-column + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-row.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-row.svg new file mode 100644 index 0000000000000000000000000000000000000000..439d98bd17a3bc22024ee571d0991aad8b535e2d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-remove-row.svg @@ -0,0 +1,9 @@ + + +table-remove-row + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-row-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-row-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..a9522c77ece8487895f993f8458f80499f3eef5d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-row-properties.svg @@ -0,0 +1,7 @@ + + +table-row-properties + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-split-cells.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-split-cells.svg new file mode 100644 index 0000000000000000000000000000000000000000..07b0be81eed9bc2927134e888a11cc9b3ba9ef0e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/table-split-cells.svg @@ -0,0 +1,5 @@ + + +table-split-cells + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tag.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tag.svg new file mode 100644 index 0000000000000000000000000000000000000000..a06b138abc5d898c7471dfd8d27ef73051e21371 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tag.svg @@ -0,0 +1,5 @@ + + +tag + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tel.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tel.svg new file mode 100644 index 0000000000000000000000000000000000000000..cea27b6dc4350342a6f2dfd2f0eaafbad8ded883 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tel.svg @@ -0,0 +1,5 @@ + + +tel + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/thumbnails_view.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/thumbnails_view.svg new file mode 100644 index 0000000000000000000000000000000000000000..8ae3eb7268712ac12011642bcbf559798a947a3b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/thumbnails_view.svg @@ -0,0 +1,8 @@ + + +thumbnails_view + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tips.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tips.svg new file mode 100644 index 0000000000000000000000000000000000000000..6831da863534c0a5298414179e2b46bc1d279504 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/tips.svg @@ -0,0 +1,6 @@ + + +tips + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/toolbox.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/toolbox.svg new file mode 100644 index 0000000000000000000000000000000000000000..bee6cd99c6625e3ccd362378db1c97e60e7b9c60 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/toolbox.svg @@ -0,0 +1,7 @@ + + +toolbox + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/trash.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/trash.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ec8c089f06d0a0558f12e4c289098d7c64a0336 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/trash.svg @@ -0,0 +1,6 @@ + + +trash + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/txt.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/txt.svg new file mode 100644 index 0000000000000000000000000000000000000000..35cc026a2ba2ae75567ece9dec62e7bc1369ecf4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/txt.svg @@ -0,0 +1,8 @@ + + +txt + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/underline.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/underline.svg new file mode 100644 index 0000000000000000000000000000000000000000..a111635a2cf5b9fad1f9a207e46e93cf47c9ed50 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/underline.svg @@ -0,0 +1,6 @@ + + +underline + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unpin.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unpin.svg new file mode 100644 index 0000000000000000000000000000000000000000..58846bc1b2b7a7e10ff82e0462c86c134ea8265a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unpin.svg @@ -0,0 +1,5 @@ + + +unpin + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unselectall.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unselectall.svg new file mode 100644 index 0000000000000000000000000000000000000000..97dda1e2d364bdf0346dca0d195486fb90892b45 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/unselectall.svg @@ -0,0 +1,6 @@ + + +unselectall + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/up-to.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/up-to.svg new file mode 100644 index 0000000000000000000000000000000000000000..6ad02870626b969a611b4083dec46ad142b41877 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/up-to.svg @@ -0,0 +1,6 @@ + + +up-to + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/upload.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/upload.svg new file mode 100644 index 0000000000000000000000000000000000000000..1861ddc48357b9190b0b8a79930dd6a8b2815f50 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/upload.svg @@ -0,0 +1,6 @@ + + +upload + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/user.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/user.svg new file mode 100644 index 0000000000000000000000000000000000000000..5d3b7b3c63523b2d379e02d22bae0b8037b87731 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/user.svg @@ -0,0 +1,6 @@ + + +user + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/variable.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/variable.svg new file mode 100644 index 0000000000000000000000000000000000000000..44d401a290c0e206ae39dcb00a3544979b8f3754 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/variable.svg @@ -0,0 +1,7 @@ + + +variable + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-bottom.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-bottom.svg new file mode 100644 index 0000000000000000000000000000000000000000..f300525be51f189d52a2ac9230168e8d7c5c76aa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-bottom.svg @@ -0,0 +1,7 @@ + + +vert-align-bottom + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-center.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-center.svg new file mode 100644 index 0000000000000000000000000000000000000000..365ffb46b6c8e701d17b3d74fc8b4fbc99f86128 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-center.svg @@ -0,0 +1,7 @@ + + +vert-align-center + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-top.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-top.svg new file mode 100644 index 0000000000000000000000000000000000000000..d5938d911eef7b16ead9e40c75ee1e2433955167 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/vert-align-top.svg @@ -0,0 +1,7 @@ + + +vert-align-top + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/video.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/video.svg new file mode 100644 index 0000000000000000000000000000000000000000..b54565bc73da87a1f185cafcbc7ed72c1611ff4c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/video.svg @@ -0,0 +1,5 @@ + + +video + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/warning.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/warning.svg new file mode 100644 index 0000000000000000000000000000000000000000..1af5536d0c013e2a0f3f7020fa87e59bf0509562 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/warning.svg @@ -0,0 +1,5 @@ + + +warning + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xls.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xls.svg new file mode 100644 index 0000000000000000000000000000000000000000..0227b514584c406830b421f7402f645f6e9f8ea5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xls.svg @@ -0,0 +1,8 @@ + + +xls + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xlsx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xlsx.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa6a27cba2e32e2afc7740e4c9c5d7e169da8eee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/generic/xlsx.svg @@ -0,0 +1,10 @@ + + +xlsx + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/Indeterminate.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/Indeterminate.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ac3e2e9e5895bea8d8c45ac1b9a4f8a6b2120e5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/Indeterminate.svg @@ -0,0 +1,5 @@ + + +Indeterminate + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-header.svg new file mode 100644 index 0000000000000000000000000000000000000000..bdaaca6cb00906532fe54e7ea3c05c05e6319d50 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-header.svg @@ -0,0 +1,7 @@ + + +add-header + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-table.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-table.svg new file mode 100644 index 0000000000000000000000000000000000000000..25cf5b30b116ba5d6a5419895c17ad65277cf38e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add-table.svg @@ -0,0 +1,6 @@ + + +add-table + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/add.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add.svg new file mode 100644 index 0000000000000000000000000000000000000000..ed6e17a43a2fcb6e065274e595ff994eb4b27ed7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/add.svg @@ -0,0 +1,5 @@ + + +add + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/airplane.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/airplane.svg new file mode 100644 index 0000000000000000000000000000000000000000..8714d5338031526e2009e7baf01deae11df77a0b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/airplane.svg @@ -0,0 +1,5 @@ + + +airplane + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/aligncenter.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/aligncenter.svg new file mode 100644 index 0000000000000000000000000000000000000000..1e8ac1902680257e10510ce98fcf60b9dda80004 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/aligncenter.svg @@ -0,0 +1,5 @@ + + +aligncenter + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignjustify.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignjustify.svg new file mode 100644 index 0000000000000000000000000000000000000000..e7c15842ecedf9c423f9f8753b66490901191025 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignjustify.svg @@ -0,0 +1,5 @@ + + +alignjustify + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..adb6fb854857e7b4ffac540e7a65fddcde1a5c84 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignleft.svg @@ -0,0 +1,5 @@ + + +alignleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignright.svg new file mode 100644 index 0000000000000000000000000000000000000000..4e2bdcbf8dd4b632d3845f9bcf1ee56ad7c296b6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/alignright.svg @@ -0,0 +1,5 @@ + + +alignright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowdown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowdown.svg new file mode 100644 index 0000000000000000000000000000000000000000..7ebec2fa15ee0a786850fc949c6ccafb859635ee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowdown.svg @@ -0,0 +1,5 @@ + + +arrowdown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..51dbcba602a453439a8e96791c03ccd3d5ba9f46 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowleft.svg @@ -0,0 +1,5 @@ + + +arrowleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowright.svg new file mode 100644 index 0000000000000000000000000000000000000000..3e18a66542598daaa3988b1bfcebc19d3ef07e27 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowright.svg @@ -0,0 +1,5 @@ + + +arrowright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowup.svg new file mode 100644 index 0000000000000000000000000000000000000000..904aafd0f207e882b199594f8b879e8568fa37fd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/arrowup.svg @@ -0,0 +1,5 @@ + + +arrowup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/attach.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/attach.svg new file mode 100644 index 0000000000000000000000000000000000000000..d6e4a01b21fb78298ed60e05461c4b45c773a235 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/attach.svg @@ -0,0 +1,5 @@ + + +attach + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/background.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/background.svg new file mode 100644 index 0000000000000000000000000000000000000000..b69c252d97c18eba185591ef79b013d060eef942 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/background.svg @@ -0,0 +1,7 @@ + + +background + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/blockquote.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/blockquote.svg new file mode 100644 index 0000000000000000000000000000000000000000..08e1b3ffc6e9bd9c59c6d21d49fb054c4725a46a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/blockquote.svg @@ -0,0 +1,5 @@ + + +blockquote + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/bmp.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bmp.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ea953b3378a7a1b6b8830499b75d1a5163360fa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bmp.svg @@ -0,0 +1,8 @@ + + +bmp + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/bold.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bold.svg new file mode 100644 index 0000000000000000000000000000000000000000..fbeae82a70cef93bb1798a36f2874863fdb7113b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bold.svg @@ -0,0 +1,5 @@ + + +bold + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/bookmark.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bookmark.svg new file mode 100644 index 0000000000000000000000000000000000000000..9a72ac8efddc7f3a25afb8a1c416fcb1a3b1be92 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bookmark.svg @@ -0,0 +1,5 @@ + + +bookmark + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/box.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/box.svg new file mode 100644 index 0000000000000000000000000000000000000000..d852129aac5c233f652eee39e733b765f37ad136 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/box.svg @@ -0,0 +1,5 @@ + + +box + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/bulletlist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bulletlist.svg new file mode 100644 index 0000000000000000000000000000000000000000..944f74eee8494735a73546c3d9b6377e4c58a053 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/bulletlist.svg @@ -0,0 +1,5 @@ + + +bulletlist + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/car.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/car.svg new file mode 100644 index 0000000000000000000000000000000000000000..e9aa59f3e8ce79b34871ae3ceabad3a36949128b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/car.svg @@ -0,0 +1,5 @@ + + +car + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/card.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/card.svg new file mode 100644 index 0000000000000000000000000000000000000000..4f36c1cd4f5bf95624a1b6cc90a6386db0ea7e46 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/card.svg @@ -0,0 +1,5 @@ + + +card + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/cart.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/cart.svg new file mode 100644 index 0000000000000000000000000000000000000000..1a50a61506f6141fc838edea6126c0b88fafab0c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/cart.svg @@ -0,0 +1,5 @@ + + +cart + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chart.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chart.svg new file mode 100644 index 0000000000000000000000000000000000000000..ddad5fa36c4070264ce3171b155f39817bf13884 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chart.svg @@ -0,0 +1,5 @@ + + +chart + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/check.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/check.svg new file mode 100644 index 0000000000000000000000000000000000000000..7b043d2f9370abafaec5ebe879468c57f900ccee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/check.svg @@ -0,0 +1,5 @@ + + +check + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/checklist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/checklist.svg new file mode 100644 index 0000000000000000000000000000000000000000..07a7abc81d1861034cf491a455721c6d7b19ff23 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/checklist.svg @@ -0,0 +1,8 @@ + + +checklist + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..f6c4eff7641e709bde6b481e8b5c340629c874c1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleleft.svg @@ -0,0 +1,6 @@ + + +chevrondoubleleft + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleright.svg new file mode 100644 index 0000000000000000000000000000000000000000..cbf5e5c8301ec073de67d1c400fa1aac16a7a1e2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondoubleright.svg @@ -0,0 +1,6 @@ + + +chevrondoubleright + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondown.svg new file mode 100644 index 0000000000000000000000000000000000000000..d98dccf269679a07563c32075fb25e36d9bc8c5c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevrondown.svg @@ -0,0 +1,5 @@ + + +chevrondown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..91eae11b459060ae080a8b92c4760f7433becd6f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronleft.svg @@ -0,0 +1,5 @@ + + +chevronleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronright.svg new file mode 100644 index 0000000000000000000000000000000000000000..a9d14cb60f2295f99e742a788f659b65f4c91a26 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronright.svg @@ -0,0 +1,5 @@ + + +chevronright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronup.svg new file mode 100644 index 0000000000000000000000000000000000000000..b4886172c9094020b235e79fdf469ec0d40d22b5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/chevronup.svg @@ -0,0 +1,5 @@ + + +chevronup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/clear.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clear.svg new file mode 100644 index 0000000000000000000000000000000000000000..896f50f4392525c2b460e00fe7881a0c51597e56 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clear.svg @@ -0,0 +1,5 @@ + + +clear + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearformat.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearformat.svg new file mode 100644 index 0000000000000000000000000000000000000000..2ec24ab89a9083c245b7d2a34a60e2f1dc7d2879 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearformat.svg @@ -0,0 +1,6 @@ + + +clearformat + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearsquare.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearsquare.svg new file mode 100644 index 0000000000000000000000000000000000000000..dbfa371590304d671860fe8c71f739253c572778 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clearsquare.svg @@ -0,0 +1,5 @@ + + +clearsquare + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/clock.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clock.svg new file mode 100644 index 0000000000000000000000000000000000000000..ae3e1a180866bb5987317247375d42bc74ab557a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/clock.svg @@ -0,0 +1,6 @@ + + +clock + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/close.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/close.svg new file mode 100644 index 0000000000000000000000000000000000000000..e57c445ceae45275f65a66dac70021577bfe3d05 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/close.svg @@ -0,0 +1,5 @@ + + +close + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/codeblock.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/codeblock.svg new file mode 100644 index 0000000000000000000000000000000000000000..aead163bdaade71164a076cfe16141c636143bfd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/codeblock.svg @@ -0,0 +1,6 @@ + + +codeblock + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/coffee.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/coffee.svg new file mode 100644 index 0000000000000000000000000000000000000000..0bed6c9169c12baac8fda2ac17248ac9a6f16274 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/coffee.svg @@ -0,0 +1,5 @@ + + +coffee + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/collapse.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/collapse.svg new file mode 100644 index 0000000000000000000000000000000000000000..b9128af05dc6c55702f2bcdc5521d8d2851a8c1b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/collapse.svg @@ -0,0 +1,5 @@ + + +collapse + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/color.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/color.svg new file mode 100644 index 0000000000000000000000000000000000000000..85fd33a4f8a11abb4215f420ef746c4b82d09093 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/color.svg @@ -0,0 +1,6 @@ + + +color + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnchooser.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnchooser.svg new file mode 100644 index 0000000000000000000000000000000000000000..a30a493d5a1b3468382e5eaa2e53da4447d95a3e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnchooser.svg @@ -0,0 +1,6 @@ + + +columnchooser + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnfield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnfield.svg new file mode 100644 index 0000000000000000000000000000000000000000..9198da1545d4c0061ff394400bb873afb9cbf1e5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/columnfield.svg @@ -0,0 +1,11 @@ + + +columnfield + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/comment.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/comment.svg new file mode 100644 index 0000000000000000000000000000000000000000..971852978010cca67d87a1ca3bb63a558387048a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/comment.svg @@ -0,0 +1,5 @@ + + +comment + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/contains.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/contains.svg new file mode 100644 index 0000000000000000000000000000000000000000..f46d17f383d66d1b04f8d33b2155050b1d9585b3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/contains.svg @@ -0,0 +1,8 @@ + + +contains + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/copy.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/copy.svg new file mode 100644 index 0000000000000000000000000000000000000000..ce6e3e90fb550a7fe2862b3e91cb80edda8f19ec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/copy.svg @@ -0,0 +1,5 @@ + + +copy + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/cut.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/cut.svg new file mode 100644 index 0000000000000000000000000000000000000000..f9511699ee2f8546d4005e92970e1f2b83cd12ac --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/cut.svg @@ -0,0 +1,5 @@ + + +cut + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/datafield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/datafield.svg new file mode 100644 index 0000000000000000000000000000000000000000..8e367eeb7c6c2fb8c3a5af4c51a6047553345388 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/datafield.svg @@ -0,0 +1,7 @@ + + +datafield + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/decreaseindent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/decreaseindent.svg new file mode 100644 index 0000000000000000000000000000000000000000..01106321edcddf5bf0f6507087acb97fc020a5ba --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/decreaseindent.svg @@ -0,0 +1,5 @@ + + +decreaseindent + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/details_view.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/details_view.svg new file mode 100644 index 0000000000000000000000000000000000000000..9de0e0137205d7203dbe6423e1711e321935d13b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/details_view.svg @@ -0,0 +1,5 @@ + + +details_view + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc-1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc-1.svg new file mode 100644 index 0000000000000000000000000000000000000000..fd64fa2b9d9dfb94be5a9963e7bdd92cc3b284f0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc-1.svg @@ -0,0 +1,7 @@ + + +doc-1 + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc.svg new file mode 100644 index 0000000000000000000000000000000000000000..d613c33d7327ad69c86ef6c8d605f45b2a1e6eff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc.svg @@ -0,0 +1,5 @@ + + +doc + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc_1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc_1.svg new file mode 100644 index 0000000000000000000000000000000000000000..cded994c83e10f8860eba13180687a9c1147a077 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doc_1.svg @@ -0,0 +1,7 @@ + + +doc_1 + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/docx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/docx.svg new file mode 100644 index 0000000000000000000000000000000000000000..f7d5e5e2aa5922347e68343072ac39707d2a17e1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/docx.svg @@ -0,0 +1,7 @@ + + +docx + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/doesnotcontain.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doesnotcontain.svg new file mode 100644 index 0000000000000000000000000000000000000000..47cccbd22e34869dca376d1f3b34ee127d3e87e2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/doesnotcontain.svg @@ -0,0 +1,9 @@ + + +doesnotcontain + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/download.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/download.svg new file mode 100644 index 0000000000000000000000000000000000000000..b701eeb7b5a64ac7a08c72ad61804f4f3c5c7990 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/download.svg @@ -0,0 +1,5 @@ + + +download + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/drag.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drag.svg new file mode 100644 index 0000000000000000000000000000000000000000..12d10751e71fe7a0eaade09536f4c877562e4885 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drag.svg @@ -0,0 +1,5 @@ + + +drag + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-left.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-left.svg new file mode 100644 index 0000000000000000000000000000000000000000..3f4952ab3549408290c4eecda822bd98dbb33e43 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-left.svg @@ -0,0 +1,7 @@ + + +drawer-left + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-right.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-right.svg new file mode 100644 index 0000000000000000000000000000000000000000..2dfb02680585102210e34ff07ad0da4d4a6a8481 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/drawer-right.svg @@ -0,0 +1,7 @@ + + +drawer-right + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit-header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit-header.svg new file mode 100644 index 0000000000000000000000000000000000000000..ebdb28b635421daaccdbd8659c0887d272d3cc75 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit-header.svg @@ -0,0 +1,7 @@ + + +edit-header + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit.svg new file mode 100644 index 0000000000000000000000000000000000000000..9b2de55d25286eeea8e7f0553c45dda0405ef1ee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/edit.svg @@ -0,0 +1,5 @@ + + +edit + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/email.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/email.svg new file mode 100644 index 0000000000000000000000000000000000000000..6efeda2cb6a6b22243a7898bb302363a6b51d8f2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/email.svg @@ -0,0 +1,5 @@ + + +email + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/endswith.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/endswith.svg new file mode 100644 index 0000000000000000000000000000000000000000..346b5c5b7783f26d5c7904d6984a4781445e7a59 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/endswith.svg @@ -0,0 +1,7 @@ + + +endswith + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/equal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/equal.svg new file mode 100644 index 0000000000000000000000000000000000000000..3cd7bf803d2d8612149fd177e603fd3d9fc6e617 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/equal.svg @@ -0,0 +1,6 @@ + + +equal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/event.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/event.svg new file mode 100644 index 0000000000000000000000000000000000000000..0d3b319f16a4ff8cb67d87af1434691bc8049053 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/event.svg @@ -0,0 +1,5 @@ + + +event + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/expand.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/expand.svg new file mode 100644 index 0000000000000000000000000000000000000000..4321ff3fbdda553ff9e6e20133e6fc6c5aad0fa6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/expand.svg @@ -0,0 +1,5 @@ + + +expand + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/export.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/export.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f25570a90e50bcbe675bb3f05159c5e693598b2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/export.svg @@ -0,0 +1,6 @@ + + +export + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportpdf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportpdf.svg new file mode 100644 index 0000000000000000000000000000000000000000..ea960f72c4f8cac1be558cdfef7df3a01b1804fc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportpdf.svg @@ -0,0 +1,6 @@ + + +exportpdf + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportselected.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportselected.svg new file mode 100644 index 0000000000000000000000000000000000000000..1574d1cd180a9473da07e8f2da200627b2ecfdaf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportselected.svg @@ -0,0 +1,8 @@ + + +exportselected + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportxlsx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportxlsx.svg new file mode 100644 index 0000000000000000000000000000000000000000..cf13438c3ce33ebba321ca8877540c23568d3585 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/exportxlsx.svg @@ -0,0 +1,8 @@ + + +exportxlsx + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/favorites.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/favorites.svg new file mode 100644 index 0000000000000000000000000000000000000000..beee445abf0238fd6a22b0b1d729f9ee5937d73f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/favorites.svg @@ -0,0 +1,5 @@ + + +favorites + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/fieldchooser.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fieldchooser.svg new file mode 100644 index 0000000000000000000000000000000000000000..9cf36202e7e3eeed541ba374b970d943bee7d0a7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fieldchooser.svg @@ -0,0 +1,7 @@ + + +fieldchooser + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/fields.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fields.svg new file mode 100644 index 0000000000000000000000000000000000000000..f81f4ddd3958df8c9cd924cad3857bd7a121b9f6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fields.svg @@ -0,0 +1,6 @@ + + +fields + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/fill.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fill.svg new file mode 100644 index 0000000000000000000000000000000000000000..5a7a20c56001a0a44aa76d3f2163708fe8f2b006 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fill.svg @@ -0,0 +1,5 @@ + + +fill + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/filter.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/filter.svg new file mode 100644 index 0000000000000000000000000000000000000000..cbaf122ff4bca8a3ca1a40f4c25330b3e64f62a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/filter.svg @@ -0,0 +1,5 @@ + + +filter + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/find.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/find.svg new file mode 100644 index 0000000000000000000000000000000000000000..2e90a48289fc65ec17abee1b1b9d06ff31287cf4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/find.svg @@ -0,0 +1,5 @@ + + +find + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/floppy.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/floppy.svg new file mode 100644 index 0000000000000000000000000000000000000000..09b8b587f87497449dd41b199f9859a363c411c1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/floppy.svg @@ -0,0 +1,5 @@ + + +floppy + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder-close.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder-close.svg new file mode 100644 index 0000000000000000000000000000000000000000..f1e88769484470bedac28b0f8e33e2ef174092ff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder-close.svg @@ -0,0 +1,5 @@ + + +folder-close + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder.svg new file mode 100644 index 0000000000000000000000000000000000000000..ec8238481454e2f3c738de5e2e5f1d8e09f642ec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/folder.svg @@ -0,0 +1,5 @@ + + +folder + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/font.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/font.svg new file mode 100644 index 0000000000000000000000000000000000000000..e7f7a80aaf950aa97311b72819d49a86957ca89c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/font.svg @@ -0,0 +1,5 @@ + + +font + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/fontsize.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fontsize.svg new file mode 100644 index 0000000000000000000000000000000000000000..616e1b2a0c3ed34c37d554f20bf4ca059f93aaeb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fontsize.svg @@ -0,0 +1,7 @@ + + +fontsize + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/food.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/food.svg new file mode 100644 index 0000000000000000000000000000000000000000..2df57c8f755b4bbea97195a263e4e4d8b5030657 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/food.svg @@ -0,0 +1,5 @@ + + +food + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/formula.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/formula.svg new file mode 100644 index 0000000000000000000000000000000000000000..77b81aaf95221a03396d9f622071c72ebb6b8f8e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/formula.svg @@ -0,0 +1,5 @@ + + +formula + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/fullscreen.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fullscreen.svg new file mode 100644 index 0000000000000000000000000000000000000000..7001e2e35f4724477c0fbbafbac70f8dba468f90 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/fullscreen.svg @@ -0,0 +1,5 @@ + + +fullscreen + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/gift.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/gift.svg new file mode 100644 index 0000000000000000000000000000000000000000..f9c986f8be9523f37d35b3036764b11022f3ffd7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/gift.svg @@ -0,0 +1,5 @@ + + +gift + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/globe.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/globe.svg new file mode 100644 index 0000000000000000000000000000000000000000..50fe82b0523eaa2e66f92d56e79a7721dc3c3587 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/globe.svg @@ -0,0 +1,5 @@ + + +globe + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/greater.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/greater.svg new file mode 100644 index 0000000000000000000000000000000000000000..259e0104213083d57f201b02e8d936d6c661870e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/greater.svg @@ -0,0 +1,5 @@ + + +greater + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/greaterorequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/greaterorequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..6b31c696bb66defe898359d965fe19c302f247c0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/greaterorequal.svg @@ -0,0 +1,6 @@ + + +greaterorequal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/group.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/group.svg new file mode 100644 index 0000000000000000000000000000000000000000..98923121a1a677dd1c4b0ad51a7bd175e0df4ae9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/group.svg @@ -0,0 +1,5 @@ + + +group + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/grouped.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/grouped.svg new file mode 100644 index 0000000000000000000000000000000000000000..fb902df2fb1bf688a15952fb343f41d6d16dfcab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/grouped.svg @@ -0,0 +1,7 @@ + + +grouped + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/growfont.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/growfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..e83a7bc2f6ab0405b2c386b8d846b7400a12232f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/growfont.svg @@ -0,0 +1,6 @@ + + +growfont + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/header.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/header.svg new file mode 100644 index 0000000000000000000000000000000000000000..6066830e0a6777602d0c081ec5346dbe50c08307 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/header.svg @@ -0,0 +1,5 @@ + + +header + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/help.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/help.svg new file mode 100644 index 0000000000000000000000000000000000000000..58f127d0ed2d68302c1155f4739e5230168f2232 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/help.svg @@ -0,0 +1,5 @@ + + +help + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/home.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/home.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa52629e8d797508bb1fd39e0ef925400f232a03 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/home.svg @@ -0,0 +1,5 @@ + + +home + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/image.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/image.svg new file mode 100644 index 0000000000000000000000000000000000000000..79318b263919763d4bac5a7cba973a25f45aefd4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/image.svg @@ -0,0 +1,5 @@ + + +image + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/import-selected.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/import-selected.svg new file mode 100644 index 0000000000000000000000000000000000000000..79a17e8cc11fe0773f9d628147983ba35f1c5dbc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/import-selected.svg @@ -0,0 +1,8 @@ + + +import-selected + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/import.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/import.svg new file mode 100644 index 0000000000000000000000000000000000000000..e5abb5f0d8680a9d55da9b005db54906337c3d7e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/import.svg @@ -0,0 +1,6 @@ + + +import + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/increaseindent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/increaseindent.svg new file mode 100644 index 0000000000000000000000000000000000000000..b71f617604e038395b3d5f9c7f757c3e249d85f9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/increaseindent.svg @@ -0,0 +1,5 @@ + + +increaseindent + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent.svg new file mode 100644 index 0000000000000000000000000000000000000000..f6d333aaf3edfba76dfed143ecb1c8df6ad4660d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent.svg @@ -0,0 +1,5 @@ + + +indent + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent1.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent1.svg new file mode 100644 index 0000000000000000000000000000000000000000..af6ca1d5c4fe20fae090d379259ffdf780ceea72 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/indent1.svg @@ -0,0 +1,9 @@ + + +indent1 + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/info.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/info.svg new file mode 100644 index 0000000000000000000000000000000000000000..fd8e853a4541811ca5a57d95a86b8cd4748e9c4f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/info.svg @@ -0,0 +1,5 @@ + + +info + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/isblank.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/isblank.svg new file mode 100644 index 0000000000000000000000000000000000000000..c1149af827becb0db0575965e04fde503e2515f6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/isblank.svg @@ -0,0 +1,5 @@ + + +isblank + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/isnotblank.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/isnotblank.svg new file mode 100644 index 0000000000000000000000000000000000000000..71aa260223a6edb898f6560fe066689060deadb5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/isnotblank.svg @@ -0,0 +1,5 @@ + + +isnotblank + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/italic.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/italic.svg new file mode 100644 index 0000000000000000000000000000000000000000..4fb54f9085f64f8351de849b197534bbe7cb8242 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/italic.svg @@ -0,0 +1,5 @@ + + +italic + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/jpg.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/jpg.svg new file mode 100644 index 0000000000000000000000000000000000000000..b7018626cd80670852116a76609a358edcb3de39 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/jpg.svg @@ -0,0 +1,6 @@ + + +jpg + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/key.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/key.svg new file mode 100644 index 0000000000000000000000000000000000000000..ea09c0ae8a5248a7406ea3bab7d3debfb5cd400a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/key.svg @@ -0,0 +1,5 @@ + + +key + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/keyboard-return.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/keyboard-return.svg new file mode 100644 index 0000000000000000000000000000000000000000..604ee408e97b750cda8bdaeeba0a6ccaaa6006ea --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/keyboard-return.svg @@ -0,0 +1,5 @@ + + +keyboard-return + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/less.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/less.svg new file mode 100644 index 0000000000000000000000000000000000000000..d4ee7c641b00f05a60ff9d30b1950b0460a18b7b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/less.svg @@ -0,0 +1,5 @@ + + +less + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/lessorequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/lessorequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..3658044eda3349e9b169c8da7410d7ed578a15a4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/lessorequal.svg @@ -0,0 +1,6 @@ + + +lessorequal + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/like.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/like.svg new file mode 100644 index 0000000000000000000000000000000000000000..2e413670510f01ec5c06a66aa8cc0699d676f85c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/like.svg @@ -0,0 +1,5 @@ + + +like + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/link.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/link.svg new file mode 100644 index 0000000000000000000000000000000000000000..b7be9c889bc88648a7d367ec2c9f87636cea5b39 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/link.svg @@ -0,0 +1,5 @@ + + +link + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/map.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/map.svg new file mode 100644 index 0000000000000000000000000000000000000000..95648f8b9b6ab743e68ea797207922873a3dcafc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/map.svg @@ -0,0 +1,5 @@ + + +map + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/mention.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/mention.svg new file mode 100644 index 0000000000000000000000000000000000000000..85b86243be77fd8d8983e8f7ce1c86ffd70937a8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/mention.svg @@ -0,0 +1,5 @@ + + +mention + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/menu.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/menu.svg new file mode 100644 index 0000000000000000000000000000000000000000..990aefc35a867fd3714ee24c24208be7a4b40a6c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/menu.svg @@ -0,0 +1,5 @@ + + +menu + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/minus.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/minus.svg new file mode 100644 index 0000000000000000000000000000000000000000..e4873587742c5237fb432a6f580caee4872399ed --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/minus.svg @@ -0,0 +1,5 @@ + + +minus + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/money.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/money.svg new file mode 100644 index 0000000000000000000000000000000000000000..eee63bb600018893d98dc9abbe1b28b39e2c80e0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/money.svg @@ -0,0 +1,5 @@ + + +money + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/more.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/more.svg new file mode 100644 index 0000000000000000000000000000000000000000..5f71a15c987aef50d36876fb576690222cb82519 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/more.svg @@ -0,0 +1,5 @@ + + +more + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/move.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/move.svg new file mode 100644 index 0000000000000000000000000000000000000000..1641ce16050f7b649d30d6e792f7a5d2a45dc2e2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/move.svg @@ -0,0 +1,6 @@ + + +move + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/music.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/music.svg new file mode 100644 index 0000000000000000000000000000000000000000..214e7176fa46a765d12c41844bbd93546e206723 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/music.svg @@ -0,0 +1,5 @@ + + +music + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/new-folder.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/new-folder.svg new file mode 100644 index 0000000000000000000000000000000000000000..9140772e66169ae71376b07f49e13bdd05b485bb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/new-folder.svg @@ -0,0 +1,6 @@ + + +new-folder + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/notequal.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/notequal.svg new file mode 100644 index 0000000000000000000000000000000000000000..813a3bb96425abe6b1b1ac274ba0541e40f0d778 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/notequal.svg @@ -0,0 +1,5 @@ + + +notequal + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/orderedlist.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/orderedlist.svg new file mode 100644 index 0000000000000000000000000000000000000000..79b4c61cf286efcdfc36a8cd98eb7348bb348dc7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/orderedlist.svg @@ -0,0 +1,5 @@ + + +orderedlist + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/overflow.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/overflow.svg new file mode 100644 index 0000000000000000000000000000000000000000..49942ef370ff1c3383257b3879050ed247752d09 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/overflow.svg @@ -0,0 +1,5 @@ + + +overflow + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pallette.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pallette.svg new file mode 100644 index 0000000000000000000000000000000000000000..b027876dd411ce62409d854866692244a795890f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pallette.svg @@ -0,0 +1,5 @@ + + +pallette + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/past-free.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/past-free.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa83215dba688438bff018b2f133d51fbc6d3a9c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/past-free.svg @@ -0,0 +1,6 @@ + + +past-free + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/past.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/past.svg new file mode 100644 index 0000000000000000000000000000000000000000..5a5ac3f2481be45a9d12a75c8aa4e68dddf39f66 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/past.svg @@ -0,0 +1,5 @@ + + +past + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pdf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pdf.svg new file mode 100644 index 0000000000000000000000000000000000000000..62c74da18ea2f60daad5a00e8a6a82eb02411c96 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pdf.svg @@ -0,0 +1,7 @@ + + +pdf + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/percent.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/percent.svg new file mode 100644 index 0000000000000000000000000000000000000000..9c9fe4962aae8c7cd3fd84b4c2a72a83a3cc83ab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/percent.svg @@ -0,0 +1,7 @@ + + +percent + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/photo.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/photo.svg new file mode 100644 index 0000000000000000000000000000000000000000..4ebfeb0780fa4849a36a9b1942415e806615ce09 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/photo.svg @@ -0,0 +1,6 @@ + + +photo + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pin.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pin.svg new file mode 100644 index 0000000000000000000000000000000000000000..4d87e14ad1420da26823c8b6828fee9853e5581f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pin.svg @@ -0,0 +1,5 @@ + + +pin + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..d634689a9ac8b8a5aae09e30bce79762e3334c62 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinleft.svg @@ -0,0 +1,6 @@ + + +pinleft + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinright.svg new file mode 100644 index 0000000000000000000000000000000000000000..344a4e52fd74835c7e694941e84b1622ec1756b4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pinright.svg @@ -0,0 +1,6 @@ + + +pinright + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/ppt.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/ppt.svg new file mode 100644 index 0000000000000000000000000000000000000000..78953c4b397454ba2ab768921ed53e15f6bf1135 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/ppt.svg @@ -0,0 +1,7 @@ + + +ppt + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pptx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pptx.svg new file mode 100644 index 0000000000000000000000000000000000000000..69358a7d998eb930fc037bb9fd219b345b070ecf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pptx.svg @@ -0,0 +1,7 @@ + + +pptx + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/preferences.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/preferences.svg new file mode 100644 index 0000000000000000000000000000000000000000..8b430eba7873f3cf3c414057c8c78db078dbbb27 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/preferences.svg @@ -0,0 +1,5 @@ + + +preferences + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/print.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/print.svg new file mode 100644 index 0000000000000000000000000000000000000000..d01839d2186891e773c9aeefbbee233556e589d6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/print.svg @@ -0,0 +1,5 @@ + + +print + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/product.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/product.svg new file mode 100644 index 0000000000000000000000000000000000000000..44f79ec276599f8428bf45dda11ac49c86c63c5b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/product.svg @@ -0,0 +1,6 @@ + + +product + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/pulldown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pulldown.svg new file mode 100644 index 0000000000000000000000000000000000000000..f59f58bedebbd10511ae614e922fa9d1e55c47d4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/pulldown.svg @@ -0,0 +1,5 @@ + + +pulldown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/range.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/range.svg new file mode 100644 index 0000000000000000000000000000000000000000..402a8b7c5c467c90490e3567ab5c98f3f5b33dc0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/range.svg @@ -0,0 +1,5 @@ + + +range + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/redo.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/redo.svg new file mode 100644 index 0000000000000000000000000000000000000000..d210cff160f941204beb4fb10aa0d9427dc5e827 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/redo.svg @@ -0,0 +1,5 @@ + + +redo + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/refresh.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/refresh.svg new file mode 100644 index 0000000000000000000000000000000000000000..5460ed70c886f57bf8e174240b34b8444abf924b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/refresh.svg @@ -0,0 +1,5 @@ + + +refresh + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/remove-table.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/remove-table.svg new file mode 100644 index 0000000000000000000000000000000000000000..4168dbf256d6bb8a1f5f2f4e65e872c19cdbf6ec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/remove-table.svg @@ -0,0 +1,6 @@ + + +remove-table + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/rename.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rename.svg new file mode 100644 index 0000000000000000000000000000000000000000..c9409a95d38aef320c5dcffb9c87baa7ecef5e44 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rename.svg @@ -0,0 +1,7 @@ + + +rename + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/repeat.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/repeat.svg new file mode 100644 index 0000000000000000000000000000000000000000..31e358798eb150a4d74304ceb38edbc3b9c4f6d7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/repeat.svg @@ -0,0 +1,5 @@ + + +repeat + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/revert.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/revert.svg new file mode 100644 index 0000000000000000000000000000000000000000..0ab8ef5c8cf5c785dbab44b463ab897aea03dad1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/revert.svg @@ -0,0 +1,5 @@ + + +revert + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/rowfield.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rowfield.svg new file mode 100644 index 0000000000000000000000000000000000000000..a83d15c8e67d4c7fea3c8a304fc6685fe43e6136 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rowfield.svg @@ -0,0 +1,11 @@ + + +rowfield + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/rtf.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rtf.svg new file mode 100644 index 0000000000000000000000000000000000000000..b064e3751e40ba103f05aa81c291afcf5a5d7c36 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/rtf.svg @@ -0,0 +1,6 @@ + + +rtf + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/runner.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/runner.svg new file mode 100644 index 0000000000000000000000000000000000000000..8db9db4644c5d8d64af7e75055459cc26569da4f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/runner.svg @@ -0,0 +1,5 @@ + + +runner + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/save.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/save.svg new file mode 100644 index 0000000000000000000000000000000000000000..1d63346886dce3342f68948aef1419a84f76292f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/save.svg @@ -0,0 +1,5 @@ + + +save + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/selectall.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/selectall.svg new file mode 100644 index 0000000000000000000000000000000000000000..846c1348bb1a197b2f7effc7d56e4d97dfdb6863 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/selectall.svg @@ -0,0 +1,6 @@ + + +selectall + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/share.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/share.svg new file mode 100644 index 0000000000000000000000000000000000000000..7df90cfd9441953ddd1289f6972816a79ce072a6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/share.svg @@ -0,0 +1,5 @@ + + +share + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/shrinkfont.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/shrinkfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..2c18f6b8a8e7d010e2acffba0d710af0757f5c35 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/shrinkfont.svg @@ -0,0 +1,6 @@ + + +shrinkfont + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdown.svg new file mode 100644 index 0000000000000000000000000000000000000000..a2608c0d4afcc67ccdf345ddaad1ccc723f124ff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdown.svg @@ -0,0 +1,5 @@ + + +sortdown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdowntext.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdowntext.svg new file mode 100644 index 0000000000000000000000000000000000000000..238cacce8d50d5d74914a5895e9ad66133621586 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortdowntext.svg @@ -0,0 +1,7 @@ + + +sortdowntext + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/sorted.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sorted.svg new file mode 100644 index 0000000000000000000000000000000000000000..535efb61f73b71f75322f30199f1b6e702999d2f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sorted.svg @@ -0,0 +1,6 @@ + + +sorted + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortup.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f18f03ff2f389681e509838f299033cfedf8a0b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortup.svg @@ -0,0 +1,5 @@ + + +sortup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortuptext.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortuptext.svg new file mode 100644 index 0000000000000000000000000000000000000000..3ad4d7514f50e9b829fe42d8c8d5da2c1ed3f464 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/sortuptext.svg @@ -0,0 +1,7 @@ + + +sortuptext + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/spindown.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spindown.svg new file mode 100644 index 0000000000000000000000000000000000000000..4d40ac599cb3e39fdcd6eec8e44a516c1e4aaa78 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spindown.svg @@ -0,0 +1,5 @@ + + +spindown + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinleft.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinleft.svg new file mode 100644 index 0000000000000000000000000000000000000000..f633890a79328dc3f6d40d328d9edbde26f4425d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinleft.svg @@ -0,0 +1,5 @@ + + +spinleft + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinright.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinright.svg new file mode 100644 index 0000000000000000000000000000000000000000..dcf009b52fbf7f3504a26f700690ca4f076d5d20 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinright.svg @@ -0,0 +1,5 @@ + + +spinright + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinup.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinup.svg new file mode 100644 index 0000000000000000000000000000000000000000..a233c62d9298ef7d054ffa013ba38655dc13a7a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/spinup.svg @@ -0,0 +1,5 @@ + + +spinup + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/square.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/square.svg new file mode 100644 index 0000000000000000000000000000000000000000..02f468a836765a2c12b89ab3361fcefc6c1ccb56 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/square.svg @@ -0,0 +1,5 @@ + + +square + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/startswith.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/startswith.svg new file mode 100644 index 0000000000000000000000000000000000000000..099867e8ab985d11a8aa04fa81a77ec759f068fe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/startswith.svg @@ -0,0 +1,8 @@ + + +startswith + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/strike.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/strike.svg new file mode 100644 index 0000000000000000000000000000000000000000..b7d0c4896af4fb8d109bfa65627d0f6698d5f1ae --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/strike.svg @@ -0,0 +1,5 @@ + + +strike + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu-list.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu-list.svg new file mode 100644 index 0000000000000000000000000000000000000000..f64096c0c58dae735075b42d186660ada441d902 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu-list.svg @@ -0,0 +1,7 @@ + + +submenu-list + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu.svg new file mode 100644 index 0000000000000000000000000000000000000000..7761a03e3d612b31a98f9cf08802e75451ded701 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/submenu.svg @@ -0,0 +1,5 @@ + + +submenu + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/subscript.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/subscript.svg new file mode 100644 index 0000000000000000000000000000000000000000..9fd431bfa38bbdf783b75f52116a1c640bdde216 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/subscript.svg @@ -0,0 +1,6 @@ + + +subscript + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/superscript.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/superscript.svg new file mode 100644 index 0000000000000000000000000000000000000000..a9ec74c6ba75268c76317b9630540349a4138038 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/superscript.svg @@ -0,0 +1,6 @@ + + +superscript + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/svg.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/svg.svg new file mode 100644 index 0000000000000000000000000000000000000000..182f0a0994a0be4e9d2aaf7e2a6067d941c5897c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/svg.svg @@ -0,0 +1,5 @@ + + +svg + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-after.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-after.svg new file mode 100644 index 0000000000000000000000000000000000000000..b0578a4b3eb63e2a24d9db1a372c5be017ae686f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-after.svg @@ -0,0 +1,6 @@ + + +table-add-column-after + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-before.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-before.svg new file mode 100644 index 0000000000000000000000000000000000000000..151e68033e883f1a1b87c30adfe0c0aad295cce8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-column-before.svg @@ -0,0 +1,6 @@ + + +table-add-column-before + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-after.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-after.svg new file mode 100644 index 0000000000000000000000000000000000000000..0ac74e86dfd86eac651945ba0d3fc8dd51137c4f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-after.svg @@ -0,0 +1,6 @@ + + +table-add-row-after + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-before.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-before.svg new file mode 100644 index 0000000000000000000000000000000000000000..6dbd2ef034f2d122bed9ba5aada047a9ffbb264f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-add-row-before.svg @@ -0,0 +1,6 @@ + + +table-add-row-before + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-cell-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-cell-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..858440dd21abac3cac5768202adf7d587b6e16a3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-cell-properties.svg @@ -0,0 +1,7 @@ + + +table-cell-properties + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-column-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-column-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..8f4ed96f132f26b0c23c1d4219618819e830c9cb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-column-properties.svg @@ -0,0 +1,8 @@ + + +table-column-properties + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-merge-cells.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-merge-cells.svg new file mode 100644 index 0000000000000000000000000000000000000000..63f7ba01cbd63acc5cdf9c7ee17f5efaf83b697f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-merge-cells.svg @@ -0,0 +1,6 @@ + + +table-merge-cells + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..e390243a3ca432dafea044f973d7eaba1ff51ad6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-properties.svg @@ -0,0 +1,6 @@ + + +table-properties + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-column.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-column.svg new file mode 100644 index 0000000000000000000000000000000000000000..54b803bd3013156b27441b455aa0122a0923f4e5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-column.svg @@ -0,0 +1,9 @@ + + +table-remove-column + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-row.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-row.svg new file mode 100644 index 0000000000000000000000000000000000000000..644d4226e83c1e0e1284c60dda6477b224c2e5fb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-remove-row.svg @@ -0,0 +1,9 @@ + + +table-remove-row + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-row-properties.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-row-properties.svg new file mode 100644 index 0000000000000000000000000000000000000000..621e080ec484efc1ff21cfe116b54f8e4b507232 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-row-properties.svg @@ -0,0 +1,8 @@ + + +table-row-properties + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-split-cells.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-split-cells.svg new file mode 100644 index 0000000000000000000000000000000000000000..323acb17ef8d365399d26f6e10f46181ff7b3fbd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/table-split-cells.svg @@ -0,0 +1,6 @@ + + +table-split-cells + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/tag.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tag.svg new file mode 100644 index 0000000000000000000000000000000000000000..c0e22ceb68a5d66c85256c6df729c6644204f678 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tag.svg @@ -0,0 +1,5 @@ + + +tag + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/tel.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tel.svg new file mode 100644 index 0000000000000000000000000000000000000000..fd1ef684ede99a028ddd2852b053f504e5fe2e03 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tel.svg @@ -0,0 +1,5 @@ + + +tel + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/thumbnails_view.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/thumbnails_view.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e6abf7b81cceba85b2402d10575afb4f1b8758c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/thumbnails_view.svg @@ -0,0 +1,8 @@ + + +thumbnails_view + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/tips.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tips.svg new file mode 100644 index 0000000000000000000000000000000000000000..f6e5f0aa9ac9c31a3b9f2bcef187784a4d9eef0b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/tips.svg @@ -0,0 +1,5 @@ + + +tips + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/toolbox.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/toolbox.svg new file mode 100644 index 0000000000000000000000000000000000000000..1de5f8a49b1e16af95e0d54261071ea1d769463e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/toolbox.svg @@ -0,0 +1,5 @@ + + +toolbox + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/trash.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/trash.svg new file mode 100644 index 0000000000000000000000000000000000000000..60ce39229d621bb4b1e14ed830f8532536a154aa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/trash.svg @@ -0,0 +1,5 @@ + + +trash + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/txt.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/txt.svg new file mode 100644 index 0000000000000000000000000000000000000000..2847ee4897766c0472e2a2da5a09d44c7b42f8ef --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/txt.svg @@ -0,0 +1,5 @@ + + +txt + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/underline.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/underline.svg new file mode 100644 index 0000000000000000000000000000000000000000..6fa7e7b329dac1a708112bdd2f5a4dddce2ed218 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/underline.svg @@ -0,0 +1,5 @@ + + +underline + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/unpin.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/unpin.svg new file mode 100644 index 0000000000000000000000000000000000000000..17c2ff965f4f2edcb7f442904333a8bab4fc4f35 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/unpin.svg @@ -0,0 +1,5 @@ + + +unpin + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/unselectall.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/unselectall.svg new file mode 100644 index 0000000000000000000000000000000000000000..fa1e6242425925db8d91dc6dc0bf42313716b679 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/unselectall.svg @@ -0,0 +1,6 @@ + + +unselectall + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/up-to.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/up-to.svg new file mode 100644 index 0000000000000000000000000000000000000000..02bccf1fb7b18bbdc9695876aa293d68051326e1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/up-to.svg @@ -0,0 +1,6 @@ + + +up-to + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/upload.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/upload.svg new file mode 100644 index 0000000000000000000000000000000000000000..93ee617cbf50403aafa2c06f2c7f1c604a44d6f2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/upload.svg @@ -0,0 +1,5 @@ + + +upload + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/user.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/user.svg new file mode 100644 index 0000000000000000000000000000000000000000..69f721a43f5d041db0e544ec949de60717bc42a2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/user.svg @@ -0,0 +1,5 @@ + + +user + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/variable.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/variable.svg new file mode 100644 index 0000000000000000000000000000000000000000..6da677b12e8f694dd0ef2c56917116228f9fcf39 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/variable.svg @@ -0,0 +1,7 @@ + + +variable + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-bottom.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-bottom.svg new file mode 100644 index 0000000000000000000000000000000000000000..8ab752119c9193d44a5db87c09814cd9e87b0f24 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-bottom.svg @@ -0,0 +1,7 @@ + + +vert-align-bottom + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-center.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-center.svg new file mode 100644 index 0000000000000000000000000000000000000000..c34fcc50e2b532ef202b9025ac8c0f844a7c50ce --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-center.svg @@ -0,0 +1,7 @@ + + +vert-align-center + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-top.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-top.svg new file mode 100644 index 0000000000000000000000000000000000000000..75d7c71ac112bbf63cb61191dd72aa9cb97b0fa7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/vert-align-top.svg @@ -0,0 +1,7 @@ + + +vert-align-top + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/video.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/video.svg new file mode 100644 index 0000000000000000000000000000000000000000..6d164926f71038de242f5a59a194258aba3d8693 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/video.svg @@ -0,0 +1,5 @@ + + +video + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/warning.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/warning.svg new file mode 100644 index 0000000000000000000000000000000000000000..0eb127851e822044e37edbee665e9186e8477daf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/warning.svg @@ -0,0 +1,5 @@ + + +warning + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/xls.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/xls.svg new file mode 100644 index 0000000000000000000000000000000000000000..f18f544bc1384d0bb5996ad4db0aa2ac08f57e88 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/xls.svg @@ -0,0 +1,5 @@ + + +xls + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/icons/material/xlsx.svg b/packages/f-theme-editor/farris-theme-editor/images/icons/material/xlsx.svg new file mode 100644 index 0000000000000000000000000000000000000000..bd781f17b27c423d7dc773642831d13c8dfad063 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/icons/material/xlsx.svg @@ -0,0 +1,5 @@ + + +xlsx + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/bring-to-front.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/bring-to-front.svg new file mode 100644 index 0000000000000000000000000000000000000000..c10742d6083476b78d4e61b5cff583033a9ed579 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/bring-to-front.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/button-fill.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/button-fill.svg new file mode 100644 index 0000000000000000000000000000000000000000..e66c63c2f361750cdc7e346d48662804204c067a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/button-fill.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-arrow.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..c62bd296da8be25d42a3d28eb0e5d384a53c4deb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-arrow.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-filled-triangle.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-filled-triangle.svg new file mode 100644 index 0000000000000000000000000000000000000000..d2e929734c9fa8f492bdddcb5a74919eeeb1233b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-filled-triangle.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-none.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-none.svg new file mode 100644 index 0000000000000000000000000000000000000000..29578749288b009d67e660c7f4c8fc4d40652da9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-none.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-outlined-triangle.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-outlined-triangle.svg new file mode 100644 index 0000000000000000000000000000000000000000..446aa38da730b12d692b62033dd91e3a1717deb7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-begin-outlined-triangle.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-arrow.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..8639c7d27276e0f23914c587f4caa56c0b2d6ebf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-arrow.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-filled-triangle.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-filled-triangle.svg new file mode 100644 index 0000000000000000000000000000000000000000..c85bbf13362176c11667489e66f9cfd1d6343761 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-filled-triangle.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-none.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-none.svg new file mode 100644 index 0000000000000000000000000000000000000000..b01634d59774779ce16cf2bfde5bf8eb33a2e278 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-none.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-outlined-triangle.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-outlined-triangle.svg new file mode 100644 index 0000000000000000000000000000000000000000..58f87d2e14b707c143f80c27536b6bfcd1fc475f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-end-outlined-triangle.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-orthogonal.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-orthogonal.svg new file mode 100644 index 0000000000000000000000000000000000000000..3552f6528d8f080e2aebdadc6959f03f4bfb0dae --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-orthogonal.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-straight.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-straight.svg new file mode 100644 index 0000000000000000000000000000000000000000..cdc64e6ce2a506cbd14e1715a382e9af02529fbe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/connector-straight.svg @@ -0,0 +1,5 @@ + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/fullscreen.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/fullscreen.svg new file mode 100644 index 0000000000000000000000000000000000000000..91d2b45df68d068b3aa8e33e6e2d26a5d58f17cf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/fullscreen.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-delete.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-delete.svg new file mode 100644 index 0000000000000000000000000000000000000000..915cc72f3cb481d0612c7172b75178c5c72d03c4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-delete.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-edit.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-edit.svg new file mode 100644 index 0000000000000000000000000000000000000000..615d96215dc9e0377c89ee4240628fd9559723f4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-edit.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-insert.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-insert.svg new file mode 100644 index 0000000000000000000000000000000000000000..e084bbffb6c11ed2ae26ab9b18b42fb52ed0eac7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/image-insert.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-bt.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-bt.svg new file mode 100644 index 0000000000000000000000000000000000000000..106be481cf168ae628225532aeb9a13da7009c30 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-bt.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-lr.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-lr.svg new file mode 100644 index 0000000000000000000000000000000000000000..f378bb0416489398971a73c4f78a641872742a14 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-lr.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-rl.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-rl.svg new file mode 100644 index 0000000000000000000000000000000000000000..292fc52fc0726dfc7148c528ec78a268b757cdfb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-rl.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-tb.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-tb.svg new file mode 100644 index 0000000000000000000000000000000000000000..3824b7e7147694e70b1f65da7bff7a5e42abce29 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-layered-tb.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-bt.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-bt.svg new file mode 100644 index 0000000000000000000000000000000000000000..bb4e3e15be79d5eaa4769af2606aee28af04ea6f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-bt.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-lr.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-lr.svg new file mode 100644 index 0000000000000000000000000000000000000000..65abb78f3d3524758c874d2172365affd4a91d4d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-lr.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-rl.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-rl.svg new file mode 100644 index 0000000000000000000000000000000000000000..edcda1dce6f64a86391230a5c9083c991b9a11bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-rl.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-tb.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-tb.svg new file mode 100644 index 0000000000000000000000000000000000000000..23c219494e980e328a4351fb34599885bd2e064a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/layout-tree-tb.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dashed.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dashed.svg new file mode 100644 index 0000000000000000000000000000000000000000..558ad3a0532f27a3203876e88501c238cca9ce37 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dashed.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dotted.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dotted.svg new file mode 100644 index 0000000000000000000000000000000000000000..1f4e6fb36ff6261b4bf9aa907e6d535b5ba32002 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-dotted.svg @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-solid.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-solid.svg new file mode 100644 index 0000000000000000000000000000000000000000..17cf4a82966a17c42290b466fd82d2e665ba1a38 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/line-solid.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/lock.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/lock.svg new file mode 100644 index 0000000000000000000000000000000000000000..48c92467c92a92d6ab61bef7130b6f1aaf833ec2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/lock.svg @@ -0,0 +1,7 @@ + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/properties-panel-open.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/properties-panel-open.svg new file mode 100644 index 0000000000000000000000000000000000000000..244fc589e12fa069cf57d44d2a8b16168aad246c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/properties-panel-open.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/select-all.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/select-all.svg new file mode 100644 index 0000000000000000000000000000000000000000..472d8255664861d4acf8333926cd311913470d8f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/select-all.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/selectbox-null-icon.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/selectbox-null-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..5fb96299fb9f5794328bc032af9b81d60da2564d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/selectbox-null-icon.svg @@ -0,0 +1,4 @@ + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/send-to-back.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/send-to-back.svg new file mode 100644 index 0000000000000000000000000000000000000000..7d3b818f6d3b96d1181033a0bd20b192f6d26e47 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/send-to-back.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-close.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-close.svg new file mode 100644 index 0000000000000000000000000000000000000000..887978c85fbf700d1438f0e91e38c1831a2caf74 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-close.svg @@ -0,0 +1,10 @@ + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-drag.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-drag.svg new file mode 100644 index 0000000000000000000000000000000000000000..c7e3113b174755c2bf065d379d4ce1a25747d70d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-drag.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-open.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-open.svg new file mode 100644 index 0000000000000000000000000000000000000000..5c027b2aad1ca7758220ced231bf0ac5a19f0c29 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/toolbox-open.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/unlock.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/unlock.svg new file mode 100644 index 0000000000000000000000000000000000000000..bca40db4e5512a05066db68dd53672f497d99ff4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/diagram/unlock.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/cancel.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/cancel.svg new file mode 100644 index 0000000000000000000000000000000000000000..f852c90b28fc690c080ac8198dbe9d313ceb12e1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/cancel.svg @@ -0,0 +1,6 @@ + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/danger.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/danger.svg new file mode 100644 index 0000000000000000000000000000000000000000..25d40902d69fd7bfb1c2da9de9c1da989145206b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/danger.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/done.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/done.svg new file mode 100644 index 0000000000000000000000000000000000000000..cba68cfabb13f7ff54c645a50f8930b55f9c617c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/done.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/refresh.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/refresh.svg new file mode 100644 index 0000000000000000000000000000000000000000..0f69731cd77e551acf0f76a0f863cc1df6372251 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/fileManager/refresh.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-sub-task.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-sub-task.svg new file mode 100644 index 0000000000000000000000000000000000000000..050fd3dfe2895c3284afd3d4d4cd330fcd70ff5e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-sub-task.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-task.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-task.svg new file mode 100644 index 0000000000000000000000000000000000000000..5984accb5fc439a2df660dae1b278c8ae8cc2824 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add-task.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e6de6b0a77a4851d5b3a16737e660f0fb8283d6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/add.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/collapse.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/collapse.svg new file mode 100644 index 0000000000000000000000000000000000000000..4b7b750e7845da3811d6480fd97509ff2793a3e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/collapse.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete-dependency.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete-dependency.svg new file mode 100644 index 0000000000000000000000000000000000000000..788cfddb79611be7c4500df2efd796d9a5eae1d0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete-dependency.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete.svg new file mode 100644 index 0000000000000000000000000000000000000000..37ae306e04e74db50c8a9716136df4eeced6631d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/delete.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/expand.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/expand.svg new file mode 100644 index 0000000000000000000000000000000000000000..d0639cccb34d4234d86898940c47be09a016c8ea --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/expand.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/full-screen.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/full-screen.svg new file mode 100644 index 0000000000000000000000000000000000000000..664d741c6b82abad3989453e25a6c2ad3b3b4572 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/full-screen.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/redo.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/redo.svg new file mode 100644 index 0000000000000000000000000000000000000000..ecf2311e14c687303b3b76e2352fad3b90a0bd5a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/redo.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/resource-manager.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/resource-manager.svg new file mode 100644 index 0000000000000000000000000000000000000000..5e86cdb1ae2473faf7b0b490ccb9b6dfb376a2d7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/resource-manager.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/task-details.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/task-details.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4d1526b23e72bd70b79489ae9258e7111f8175e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/task-details.svg @@ -0,0 +1,10 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-dependencies.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-dependencies.svg new file mode 100644 index 0000000000000000000000000000000000000000..6c1ba6645426ae6ec33c014f18521f8f4d1ef49f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-dependencies.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-resources.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-resources.svg new file mode 100644 index 0000000000000000000000000000000000000000..c0382093f0fe1dfe499c5dbede8a2b90f7d193f5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/toggle-resources.svg @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/undo.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/undo.svg new file mode 100644 index 0000000000000000000000000000000000000000..3469dc4c676c6307dcc2a2cb5e1e7a4504bce07c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/undo.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-in.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-in.svg new file mode 100644 index 0000000000000000000000000000000000000000..128cb79e11052e96bf295deccdecd571a06b1c48 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-in.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-out.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-out.svg new file mode 100644 index 0000000000000000000000000000000000000000..2e86666c58585bbe6ea838134897f732a38df68f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/gantt/zoom-out.svg @@ -0,0 +1,9 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/list/toggle-delete.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/list/toggle-delete.svg new file mode 100644 index 0000000000000000000000000000000000000000..3eac6b179abb11e12d20968b25ea650a7ea4f32f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/list/toggle-delete.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/clock-bg.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/clock-bg.svg new file mode 100644 index 0000000000000000000000000000000000000000..24535b0f81f3208998c6de150dff04ae7a9deae8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/clock-bg.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/hour-arrow.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/hour-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..df1a47bb27fc25cd17069febab405a9d7efc63dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/hour-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/min-arrow.svg b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/min-arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..81554463aff4d53d9d851d1097aa381d287d7ce5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/images/widgets/common/timeView/min-arrow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..20e11e8e96b2a195555b31aa174f01709028bbfd Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/carmine/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/calendar/empty-cell.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/calendar/empty-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..ea088bf781ed2c67714f81cb571a0e0227732745 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/calendar/empty-cell.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/colorbox/nocolor.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/colorbox/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..323150d4e46f0b8ffe03724161f772a92e376ddb Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/colorbox/nocolor.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-all.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-all.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d584c41e556a35a9c4cb664df9ef90398d43b2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-all.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-column.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-column.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f9951fc4285cc9ab78b8146c6c528450340855 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-column.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-data.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-data.png new file mode 100644 index 0000000000000000000000000000000000000000..168120a1873957e9c8fd4704aba3721e19b003f4 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-data.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-filter.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..6436831c7980be3e6ae3ab14656eaf5d0e0ef0ce Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-filter.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-row.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-row.png new file mode 100644 index 0000000000000000000000000000000000000000..50c21868431f986c107d95ea631c0bc31a8ff741 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/area-row.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/dimension.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..b3aba92a4182e147d0996da348796873e91685f1 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/dimension.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/hierarchy.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d301207c15779e6c03fd423b71eae1c1ba1180 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/hierarchy.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..dd9545431611335608cea4f88a671e5959c90756 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..20367a0056d891d8ec93ee90746a46407a2d1bf9 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/contrast/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/calendar/empty-cell.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/calendar/empty-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ddd0c0cc4000e7b6479b3552d14ff998c02414 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/calendar/empty-cell.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/colorbox/nocolor.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/colorbox/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..937807aaea112595bdf7611ea2a01ad7f7c2509f Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/colorbox/nocolor.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-all.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-all.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d584c41e556a35a9c4cb664df9ef90398d43b2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-all.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-column.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-column.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f9951fc4285cc9ab78b8146c6c528450340855 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-column.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-data.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-data.png new file mode 100644 index 0000000000000000000000000000000000000000..168120a1873957e9c8fd4704aba3721e19b003f4 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-data.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-filter.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..6436831c7980be3e6ae3ab14656eaf5d0e0ef0ce Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-filter.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-row.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-row.png new file mode 100644 index 0000000000000000000000000000000000000000..50c21868431f986c107d95ea631c0bc31a8ff741 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/area-row.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/dimension.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..3e09507b9d83183ccefb9cfb807266659491ea86 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/dimension.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/hierarchy.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..165ed7f916826fbf370d2516391af7a52e6f0ca0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/hierarchy.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..769004dd4a193f6f3a4b64e61911817c204eaacf Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3b6b3f0b8857dcbc8565ca8a79e301143f81a0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/error.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/error.png new file mode 100644 index 0000000000000000000000000000000000000000..0babe32c2b649fbad4e335fa1ebf2788f98f3ae8 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/error.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/info.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/info.png new file mode 100644 index 0000000000000000000000000000000000000000..eda61e4358f37b780506db3136c28b71fc416d0c Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/info.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/success.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/success.png new file mode 100644 index 0000000000000000000000000000000000000000..200ca204c58a568cd898ab8250514a6ad310679d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/success.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/warning.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7324d22ea49ba714538dcfb9c7db1893558b58d2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/dark/toast/warning.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..66dde404586f9792782216ab5a963c46f57ed103 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3b6b3f0b8857dcbc8565ca8a79e301143f81a0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkmoon/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..455aa643f5fa26e068eb22670f0f719a0bdbd13d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3b6b3f0b8857dcbc8565ca8a79e301143f81a0 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/darkviolet/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..48cdcc238c08e2e8a08c02f25e72aff47ec5f992 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/greenmist/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/calendar/empty-cell.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/calendar/empty-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..3c93bca82d302d57c716914958a4e2fabe3effe4 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/calendar/empty-cell.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/colorbox/nocolor.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/colorbox/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..086f50057cb8b16f35dc81cf6bf289d1c87cffda Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/colorbox/nocolor.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-all.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-all.png new file mode 100644 index 0000000000000000000000000000000000000000..20646cf4a154c7821ab75ec96c6a875a8af41da8 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-all.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-column.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-column.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1833a4d5c103a6e11308b3bb93d38c1aeba6f3 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-column.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-data.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-data.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe8a2775fb083d4e75b225f6b08d43c5add86b2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-data.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-filter.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..ef936c5d812df8af1fe7fbad0e628f0ef62773cf Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-filter.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-row.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-row.png new file mode 100644 index 0000000000000000000000000000000000000000..9234f9c36a530095724b77745943727a547dd793 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/area-row.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/dimension.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..b3aba92a4182e147d0996da348796873e91685f1 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/dimension.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/hierarchy.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d301207c15779e6c03fd423b71eae1c1ba1180 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/hierarchy.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..170c21abde981206b675b5533b088d3af252c579 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/error.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/error.png new file mode 100644 index 0000000000000000000000000000000000000000..0babe32c2b649fbad4e335fa1ebf2788f98f3ae8 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/error.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/info.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/info.png new file mode 100644 index 0000000000000000000000000000000000000000..eda61e4358f37b780506db3136c28b71fc416d0c Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/info.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/success.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/success.png new file mode 100644 index 0000000000000000000000000000000000000000..200ca204c58a568cd898ab8250514a6ad310679d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/success.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/warning.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7324d22ea49ba714538dcfb9c7db1893558b58d2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/light/toast/warning.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2c417ce41a727da3fa92e3a8f964be9e35c159 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/default/color-schemes/softblue/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/colorbox/nocolor.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/colorbox/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..086f50057cb8b16f35dc81cf6bf289d1c87cffda Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/colorbox/nocolor.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-all.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-all.png new file mode 100644 index 0000000000000000000000000000000000000000..20646cf4a154c7821ab75ec96c6a875a8af41da8 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-all.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-column.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-column.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1833a4d5c103a6e11308b3bb93d38c1aeba6f3 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-column.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-data.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-data.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe8a2775fb083d4e75b225f6b08d43c5add86b2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-data.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-filter.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..ef936c5d812df8af1fe7fbad0e628f0ef62773cf Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-filter.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-row.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-row.png new file mode 100644 index 0000000000000000000000000000000000000000..9234f9c36a530095724b77745943727a547dd793 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/area-row.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/dimension.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..b3aba92a4182e147d0996da348796873e91685f1 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/dimension.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/hierarchy.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d301207c15779e6c03fd423b71eae1c1ba1180 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/hierarchy.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..77bf05a6864773b085005a5376d4d4f73ed5887a Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/dark/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/colorbox/nocolor.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/colorbox/nocolor.png new file mode 100644 index 0000000000000000000000000000000000000000..086f50057cb8b16f35dc81cf6bf289d1c87cffda Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/colorbox/nocolor.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-all.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-all.png new file mode 100644 index 0000000000000000000000000000000000000000..20646cf4a154c7821ab75ec96c6a875a8af41da8 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-all.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-column.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-column.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1833a4d5c103a6e11308b3bb93d38c1aeba6f3 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-column.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-data.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-data.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe8a2775fb083d4e75b225f6b08d43c5add86b2 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-data.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-filter.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..ef936c5d812df8af1fe7fbad0e628f0ef62773cf Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-filter.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-row.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-row.png new file mode 100644 index 0000000000000000000000000000000000000000..9234f9c36a530095724b77745943727a547dd793 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/area-row.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/dimension.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..b3aba92a4182e147d0996da348796873e91685f1 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/dimension.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/hierarchy.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d301207c15779e6c03fd423b71eae1c1ba1180 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/hierarchy.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/text-stub.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/text-stub.png new file mode 100644 index 0000000000000000000000000000000000000000..77bf05a6864773b085005a5376d4d4f73ed5887a Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/grid/text-stub.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..28664acd733df73c6dacba53cf267701a78493ac Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader20.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader20.gif new file mode 100644 index 0000000000000000000000000000000000000000..179004bd2f60a6c61f0f758731d9f4891ed094ea Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader20.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader64.gif b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader64.gif new file mode 100644 index 0000000000000000000000000000000000000000..13474903d2e04ebccae2e0b2ccdb979481007347 Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/loader64.gif differ diff --git a/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/pulldown.png b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/pulldown.png new file mode 100644 index 0000000000000000000000000000000000000000..436cc90d966632a84d6e0640dc624b2536fb8e4d Binary files /dev/null and b/packages/f-theme-editor/farris-theme-editor/images/widgets/material/color-schemes/light/pulldown.png differ diff --git a/packages/f-theme-editor/farris-theme-editor/js/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/js/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..55b53a48d7e5fe9b90fbed5aaed28e4f400f2343 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "env": { + "es6": true, + "node": false + }, + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-restricted-modules": [ + "error", + { + "patterns": ["*.js"] + } + ], + "no-restricted-imports": [ "error", { + "paths": [ + { "name": "jquery"}, + { "name": "angular"}, + { "name": "knockout"}, + { "name": "globalize"} + ], + "patterns": ["jquery/*", "angular/*", "knockout/*", "globalize/*"] + }] + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/easing.js b/packages/f-theme-editor/farris-theme-editor/js/animation/easing.js new file mode 100644 index 0000000000000000000000000000000000000000..a44fbd7655365eb25ed85d417cc6819758eaa76d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/easing.js @@ -0,0 +1,92 @@ +import { isFunction } from '../core/utils/type'; + +const CSS_TRANSITION_EASING_REGEX = /cubic-bezier\((\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\)/; + +const TransitionTimingFuncMap = { + 'linear': 'cubic-bezier(0, 0, 1, 1)', + 'swing': 'cubic-bezier(0.445, 0.05, 0.55, 0.95)', + 'ease': 'cubic-bezier(0.25, 0.1, 0.25, 1)', + 'ease-in': 'cubic-bezier(0.42, 0, 1, 1)', + 'ease-out': 'cubic-bezier(0, 0, 0.58, 1)', + 'ease-in-out': 'cubic-bezier(0.42, 0, 0.58, 1)' +}; + +const polynomBezier = function(x1, y1, x2, y2) { + const Cx = 3 * x1; + const Bx = 3 * (x2 - x1) - Cx; + const Ax = 1 - Cx - Bx; + + const Cy = 3 * y1; + const By = 3 * (y2 - y1) - Cy; + const Ay = 1 - Cy - By; + + const bezierX = function(t) { + return t * (Cx + t * (Bx + t * Ax)); + }; + + const bezierY = function(t) { + return t * (Cy + t * (By + t * Ay)); + }; + + const derivativeX = function(t) { + return Cx + t * (2 * Bx + t * 3 * Ax); + }; + + const findXFor = function(t) { + let x = t; + let i = 0; + let z; + + while(i < 14) { + z = bezierX(x) - t; + if(Math.abs(z) < 1e-3) { + break; + } + + x = x - z / derivativeX(x); + i++; + } + + return x; + }; + + return function(t) { + return bezierY(findXFor(t)); + }; +}; + +let easing = {}; +export const convertTransitionTimingFuncToEasing = function(cssTransitionEasing) { + cssTransitionEasing = TransitionTimingFuncMap[cssTransitionEasing] || cssTransitionEasing; + + let coeffs = cssTransitionEasing.match(CSS_TRANSITION_EASING_REGEX); + let forceName; + + if(!coeffs) { + forceName = 'linear'; + coeffs = TransitionTimingFuncMap[forceName].match(CSS_TRANSITION_EASING_REGEX); + } + + coeffs = coeffs.slice(1, 5); + for(let i = 0; i < coeffs.length; i++) { + coeffs[i] = parseFloat(coeffs[i]); + } + + const easingName = forceName || 'cubicbezier_' + coeffs.join('_').replace(/\./g, 'p'); + + if(!isFunction(easing[easingName])) { + easing[easingName] = function(x, t, b, c, d) { + return c * polynomBezier(coeffs[0], coeffs[1], coeffs[2], coeffs[3])(t / d) + b; + }; + } + + return easingName; +}; + +export function setEasing(value) { + easing = value; +} + +export function getEasing(name) { + return easing[name]; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/frame.d.ts b/packages/f-theme-editor/farris-theme-editor/js/animation/frame.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..b9bd4438793d2f88c03f1ee33e52880f0a9ea40b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/frame.d.ts @@ -0,0 +1,15 @@ +/** + * @docid utils.cancelAnimationFrame + * @publicName cancelAnimationFrame(requestID) + * @namespace DevExpress.utils + * @public + */ +export function cancelAnimationFrame(requestID: number): void; + +/** + * @docid utils.requestAnimationFrame + * @publicName requestAnimationFrame(callback) + * @namespace DevExpress.utils + * @public + */ +export function requestAnimationFrame(callback: Function): number; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/frame.js b/packages/f-theme-editor/farris-theme-editor/js/animation/frame.js new file mode 100644 index 0000000000000000000000000000000000000000..d316f81934949649c1e60e9050f68d367b6ae2f3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/frame.js @@ -0,0 +1,66 @@ +import { hasWindow, getWindow } from '../core/utils/window'; +const window = hasWindow() ? getWindow() : {}; +import callOnce from '../core/utils/call_once'; + +const FRAME_ANIMATION_STEP_TIME = 1000 / 60; + +let request = function(callback) { + return setTimeout(callback, FRAME_ANIMATION_STEP_TIME); +}; + +let cancel = function(requestID) { + clearTimeout(requestID); +}; + +const setAnimationFrameMethods = callOnce(function() { + const nativeRequest = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame; + + const nativeCancel = window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame; + + if(nativeRequest && nativeCancel) { + request = nativeRequest; + cancel = nativeCancel; + } + + if(nativeRequest && !nativeCancel) { + // NOTE: https://code.google.com/p/android/issues/detail?id=66243 + + const canceledRequests = {}; + + request = function(callback) { + const requestId = nativeRequest.call(window, function() { + try { + if(requestId in canceledRequests) { + return; + } + callback.apply(this, arguments); + } finally { + delete canceledRequests[requestId]; + } + }); + return requestId; + }; + + cancel = function(requestId) { + canceledRequests[requestId] = true; + }; + } +}); + +export function requestAnimationFrame() { + setAnimationFrameMethods(); + return request.apply(window, arguments); +} + +export function cancelAnimationFrame() { + setAnimationFrameMethods(); + cancel.apply(window, arguments); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/fx.d.ts b/packages/f-theme-editor/farris-theme-editor/js/animation/fx.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9629f97d1b41e5215986ef67fb3e3536bebf0cda --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/fx.d.ts @@ -0,0 +1,148 @@ +import { DxElement } from '../core/element'; +import { DxPromise } from '../core/utils/deferred'; +import { PositionConfig } from './position'; + +/** + * @docid + * @public + * @type object + */ +export type AnimationState = string | number | { + /** + * @docid + * @public + */ + opacity: number; +} | { + /** + * @docid + * @public + */ + scale: number; +} | { + /** + * @docid + * @public + */ + position: PositionConfig; +} | { + /** + * @docid + * @public + */ + left: number; +} | { + /** + * @docid + * @public + */ + top: number; +}; + +/** + * @docid + * @namespace DevExpress + * @type object|number|string + * @public + */ +export type AnimationConfig = { + /** + * @docid + * @public + */ + complete?: (($element: DxElement, config: AnimationConfig) => void); + /** + * @docid + * @default 0 + * @public + */ + delay?: number; + /** + * @docid + * @type Enums.Direction + * @default undefined + * @public + */ + direction?: 'bottom' | 'left' | 'right' | 'top'; + /** + * @docid + * @default 400 + * @public + */ + duration?: number; + /** + * @docid + * @default 'ease' + * @public + */ + easing?: string; + /** + * @docid + * @default {} + * @public + */ + from?: AnimationState; + /** + * @docid + * @default undefined + * @public + */ + staggerDelay?: number; + /** + * @docid + * @public + */ + start?: (($element: DxElement, config: AnimationConfig) => void); + /** + * @docid + * @default {} + * @public + */ + to?: AnimationState; + /** + * @docid + * @type Enums.AnimationType + * @default 'custom' + * @public + */ + type?: 'css' | 'fade' | 'fadeIn' | 'fadeOut' | 'pop' | 'slide' | 'slideIn' | 'slideOut'; +}; + +/** + * @public + * @deprecated Use the AnimationConfig type instead + */ +export type animationConfig = AnimationConfig; + +/** + * @docid + * @section utils + * @namespace DevExpress + */ +declare const fx: { + /** + * @docid + * @publicName animate(element, config) + * @return Promise + * @namespace DevExpress.fx + * @public + */ + animate(element: Element, config: AnimationConfig): DxPromise; + + /** + * @docid + * @publicName isAnimating(element) + * @namespace DevExpress.fx + * @public + */ + isAnimating(element: Element): boolean; + + /** + * @docid + * @publicName stop(element, jumpToEnd) + * @namespace DevExpress.fx + * @public + */ + stop(element: Element, jumpToEnd: boolean): void; +}; +export default fx; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/fx.js b/packages/f-theme-editor/farris-theme-editor/js/animation/fx.js new file mode 100644 index 0000000000000000000000000000000000000000..2b28c77deca331c92d2abbf54183529d33519172 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/fx.js @@ -0,0 +1,841 @@ +import $ from '../core/renderer'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import eventsEngine from '../events/core/events_engine'; +import errors from '../core/errors'; +import { getPublicElement } from '../core/element'; +import { extend } from '../core/utils/extend'; +import { isFunction, isPlainObject } from '../core/utils/type'; +import { each, map } from '../core/utils/iterator'; +import { + getTranslateCss, + parseTranslate, + clearCache, + locate, + getTranslate +} from './translator'; +import { + convertTransitionTimingFuncToEasing, + getEasing +} from './easing'; +import { requestAnimationFrame, cancelAnimationFrame } from './frame'; +import { transitionEndEventName, transition } from '../core/utils/support'; +import positionUtils from './position'; +import { removeEvent } from '../events/remove'; +import { addNamespace } from '../events/utils/index'; +import { when, Deferred } from '../core/utils/deferred'; +const removeEventName = addNamespace(removeEvent, 'dxFX'); +import { noop } from '../core/utils/common'; + + +const RELATIVE_VALUE_REGEX = /^([+-])=(.*)/i; +const ANIM_DATA_KEY = 'dxAnimData'; +const ANIM_QUEUE_KEY = 'dxAnimQueue'; +const TRANSFORM_PROP = 'transform'; + +const TransitionAnimationStrategy = { + initAnimation: function($element, config) { + $element.css({ + 'transitionProperty': 'none' + }); + + if(typeof config.from === 'string') { + $element.addClass(config.from); + } else { + setProps($element, config.from); + } + + const that = this; + const deferred = new Deferred(); + const cleanupWhen = config.cleanupWhen; + + config.transitionAnimation = { + deferred: deferred, + finish: function() { + that._finishTransition($element); + if(cleanupWhen) { + when(deferred, cleanupWhen).always(function() { + that._cleanup($element, config); + }); + } else { + that._cleanup($element, config); + } + deferred.resolveWith($element, [config, $element]); + } + }; + + this._completeAnimationCallback($element, config) + .done(function() { + config.transitionAnimation.finish(); + }) + .fail(function() { + deferred.rejectWith($element, [config, $element]); + }); + + if(!config.duration) { + config.transitionAnimation.finish(); + } + + // NOTE: Hack for setting 'from' css by browser before run animation + // Do not move this hack to initAnimation since some css props can be changed in the 'start' callback (T231434) + // Unfortunately this can't be unit tested + // TODO: find better way if possible + $element.css('transform'); + }, + animate: function($element, config) { + this._startAnimation($element, config); + return config.transitionAnimation.deferred.promise(); + }, + + _completeAnimationCallback: function($element, config) { + const that = this; + const startTime = Date.now() + config.delay; + const deferred = new Deferred(); + const transitionEndFired = new Deferred(); + const simulatedTransitionEndFired = new Deferred(); + let simulatedEndEventTimer; + const transitionEndEventFullName = transitionEndEventName() + '.dxFX'; + + config.transitionAnimation.cleanup = function() { + clearTimeout(simulatedEndEventTimer); + clearTimeout(waitForJSCompleteTimer); + eventsEngine.off($element, transitionEndEventFullName); + eventsEngine.off($element, removeEventName); + }; + + eventsEngine.one($element, transitionEndEventFullName, function() { + // NOTE: prevent native transitionEnd event from previous animation in queue (Chrome) + if(Date.now() - startTime >= config.duration) { + transitionEndFired.reject(); + } + }); + eventsEngine.off($element, removeEventName); + eventsEngine.on($element, removeEventName, function() { + that.stop($element, config); + deferred.reject(); + }); + + const waitForJSCompleteTimer = setTimeout(function() { // Fix for a visual bug (T244514): do not setup the timer until all js code has finished working + simulatedEndEventTimer = setTimeout(function() { + simulatedTransitionEndFired.reject(); + }, config.duration + config.delay + fx._simulatedTransitionEndDelay /* T255863 */); + + when(transitionEndFired, simulatedTransitionEndFired).fail((function() { + deferred.resolve(); + }).bind(this)); + }); + + return deferred.promise(); + }, + + _startAnimation: function($element, config) { + $element.css({ + 'transitionProperty': 'all', + 'transitionDelay': config.delay + 'ms', + 'transitionDuration': config.duration + 'ms', + 'transitionTimingFunction': config.easing + }); + + if(typeof config.to === 'string') { + $element[0].className += ' ' + config.to; + // Do not uncomment: performance critical + // $element.addClass(config.to); + } else if(config.to) { + setProps($element, config.to); + } + }, + + _finishTransition: function($element) { + $element.css('transition', 'none'); + }, + + _cleanup: function($element, config) { + config.transitionAnimation.cleanup(); + + if(typeof config.from === 'string') { + $element.removeClass(config.from); + $element.removeClass(config.to); + } + }, + + stop: function($element, config, jumpToEnd) { + if(!config) { + return; + } + + if(jumpToEnd) { + config.transitionAnimation.finish(); + } else { + if(isPlainObject(config.to)) { + each(config.to, function(key) { + $element.css(key, $element.css(key)); + }); + } + this._finishTransition($element); + this._cleanup($element, config); + } + } +}; + +const FrameAnimationStrategy = { + initAnimation: function($element, config) { + setProps($element, config.from); + }, + animate: function($element, config) { + const deferred = new Deferred(); + const that = this; + + if(!config) { + return deferred.reject().promise(); + } + + each(config.to, function(prop) { + if(config.from[prop] === undefined) { + config.from[prop] = that._normalizeValue($element.css(prop)); + } + }); + + if(config.to[TRANSFORM_PROP]) { + config.from[TRANSFORM_PROP] = that._parseTransform(config.from[TRANSFORM_PROP]); + config.to[TRANSFORM_PROP] = that._parseTransform(config.to[TRANSFORM_PROP]); + } + + config.frameAnimation = { + to: config.to, + from: config.from, + currentValue: config.from, + easing: convertTransitionTimingFuncToEasing(config.easing), + duration: config.duration, + startTime: new Date().valueOf(), + finish: function() { + this.currentValue = this.to; + this.draw(); + cancelAnimationFrame(config.frameAnimation.animationFrameId); + deferred.resolve(); + }, + draw: function() { + if(config.draw) { + config.draw(this.currentValue); + return; + } + + const currentValue = extend({}, this.currentValue); + + if(currentValue[TRANSFORM_PROP]) { + currentValue[TRANSFORM_PROP] = map(currentValue[TRANSFORM_PROP], function(value, prop) { + if(prop === 'translate') { + return getTranslateCss(value); + } else if(prop === 'scale') { + return 'scale(' + value + ')'; + } else if(prop.substr(0, prop.length - 1) === 'rotate') { + return prop + '(' + value + 'deg)'; + } + }).join(' '); + } + + $element.css(currentValue); + } + }; + + if(config.delay) { + config.frameAnimation.startTime += config.delay; + config.frameAnimation.delayTimeout = setTimeout(function() { + that._startAnimation($element, config); + }, config.delay); + } else { + that._startAnimation($element, config); + } + return deferred.promise(); + }, + + _startAnimation: function($element, config) { + eventsEngine.off($element, removeEventName); + eventsEngine.on($element, removeEventName, function() { + if(config.frameAnimation) { + cancelAnimationFrame(config.frameAnimation.animationFrameId); + } + }); + + this._animationStep($element, config); + }, + + _parseTransform: function(transformString) { + const result = {}; + + each(transformString.match(/\w+\d*\w*\([^)]*\)\s*/g), function(i, part) { + const translateData = parseTranslate(part); + const scaleData = part.match(/scale\((.+?)\)/); + const rotateData = part.match(/(rotate.)\((.+)deg\)/); + + if(translateData) { + result.translate = translateData; + } + + if(scaleData && scaleData[1]) { + result.scale = parseFloat(scaleData[1]); + } + + if(rotateData && rotateData[1]) { + result[rotateData[1]] = parseFloat(rotateData[2]); + } + }); + + return result; + }, + + stop: function($element, config, jumpToEnd) { + const frameAnimation = config && config.frameAnimation; + + if(!frameAnimation) { + return; + } + + cancelAnimationFrame(frameAnimation.animationFrameId); + clearTimeout(frameAnimation.delayTimeout); + + if(jumpToEnd) { + frameAnimation.finish(); + } + + delete config.frameAnimation; + }, + + _animationStep: function($element, config) { + const frameAnimation = config && config.frameAnimation; + + if(!frameAnimation) { + return; + } + + const now = new Date().valueOf(); + + if(now >= frameAnimation.startTime + frameAnimation.duration) { + frameAnimation.finish(); + return; + } + + frameAnimation.currentValue = this._calcStepValue(frameAnimation, now - frameAnimation.startTime); + frameAnimation.draw(); + + const that = this; + frameAnimation.animationFrameId = requestAnimationFrame(function() { + that._animationStep($element, config); + }); + }, + + _calcStepValue: function(frameAnimation, currentDuration) { + const calcValueRecursively = function(from, to) { + const result = Array.isArray(to) ? [] : {}; + + const calcEasedValue = function(propName) { + const x = currentDuration / frameAnimation.duration; + const t = currentDuration; + const b = 1 * from[propName]; + const c = to[propName] - from[propName]; + const d = frameAnimation.duration; + + return getEasing(frameAnimation.easing)(x, t, b, c, d); + }; + + each(to, function(propName, endPropValue) { + if(typeof endPropValue === 'string' && parseFloat(endPropValue, 10) === false) { + return true; + } + + result[propName] = typeof endPropValue === 'object' + ? calcValueRecursively(from[propName], endPropValue) + : calcEasedValue(propName); + }); + + return result; + }; + + return calcValueRecursively(frameAnimation.from, frameAnimation.to); + }, + + _normalizeValue: function(value) { + const numericValue = parseFloat(value, 10); + + if(numericValue === false) { + return value; + } + + return numericValue; + } +}; + +const FallbackToNoAnimationStrategy = { + initAnimation: function() { + }, + animate: function() { + return new Deferred().resolve().promise(); + }, + stop: noop, + isSynchronous: true +}; + +const getAnimationStrategy = function(config) { + config = config || {}; + const animationStrategies = { + 'transition': transition() ? TransitionAnimationStrategy : FrameAnimationStrategy, + 'frame': FrameAnimationStrategy, + 'noAnimation': FallbackToNoAnimationStrategy + }; + let strategy = config.strategy || 'transition'; + + if(config.type === 'css' && !transition()) { + strategy = 'noAnimation'; + } + + return animationStrategies[strategy]; +}; + +const baseConfigValidator = function(config, animationType, validate, typeMessage) { + each(['from', 'to'], function() { + if(!validate(config[this])) { + throw errors.Error('E0010', animationType, this, typeMessage); + } + }); +}; + +const isObjectConfigValidator = function(config, animationType) { + return baseConfigValidator(config, animationType, function(target) { return isPlainObject(target); }, 'a plain object'); +}; + +const isStringConfigValidator = function(config, animationType) { + return baseConfigValidator(config, animationType, function(target) { return typeof target === 'string'; }, 'a string'); +}; + +const CustomAnimationConfigurator = { + setup: function() { + } +}; + +const CssAnimationConfigurator = { + validateConfig: function(config) { + isStringConfigValidator(config, 'css'); + }, + + setup: function() { + } +}; + +const positionAliases = { + 'top': { my: 'bottom center', at: 'top center' }, + 'bottom': { my: 'top center', at: 'bottom center' }, + 'right': { my: 'left center', at: 'right center' }, + 'left': { my: 'right center', at: 'left center' } +}; + +const SlideAnimationConfigurator = { + validateConfig: function(config) { + isObjectConfigValidator(config, 'slide'); + }, + + setup: function($element, config) { + const location = locate($element); + + if(config.type !== 'slide') { + const positioningConfig = (config.type === 'slideIn') ? config.from : config.to; + + positioningConfig.position = extend({ of: window }, positionAliases[config.direction]); + setupPosition($element, positioningConfig); + } + + this._setUpConfig(location, config.from); + this._setUpConfig(location, config.to); + + clearCache($element); + }, + + _setUpConfig: function(location, config) { + config.left = 'left' in config ? config.left : '+=0'; + config.top = 'top' in config ? config.top : '+=0'; + + this._initNewPosition(location, config); + }, + + _initNewPosition: function(location, config) { + const position = { + left: config.left, + top: config.top + }; + + delete config.left; + delete config.top; + + let relativeValue = this._getRelativeValue(position.left); + if(relativeValue !== undefined) { + position.left = relativeValue + location.left; + } else { + config.left = 0; + } + + relativeValue = this._getRelativeValue(position.top); + if(relativeValue !== undefined) { + position.top = relativeValue + location.top; + } else { + config.top = 0; + } + + config[TRANSFORM_PROP] = getTranslateCss({ x: position.left, y: position.top }); + }, + + _getRelativeValue: function(value) { + let relativeValue; + if(typeof value === 'string' && (relativeValue = RELATIVE_VALUE_REGEX.exec(value))) { + return parseInt(relativeValue[1] + '1') * relativeValue[2]; + } + } +}; + +const FadeAnimationConfigurator = { + setup: function($element, config) { + const from = config.from; + const to = config.to; + const defaultFromOpacity = config.type === 'fadeOut' ? 1 : 0; + const defaultToOpacity = config.type === 'fadeOut' ? 0 : 1; + let fromOpacity = isPlainObject(from) ? String(from.opacity ?? defaultFromOpacity) : String(from); + let toOpacity = isPlainObject(to) ? String(to.opacity ?? defaultToOpacity) : String(to); + + if(!config.skipElementInitialStyles) { + fromOpacity = $element.css('opacity'); + } + + switch(config.type) { + case 'fadeIn': + toOpacity = 1; + break; + case 'fadeOut': + toOpacity = 0; + break; + } + + config.from = { + visibility: 'visible', + opacity: fromOpacity + }; + + config.to = { + opacity: toOpacity + }; + } +}; + +const PopAnimationConfigurator = { + validateConfig: function(config) { + isObjectConfigValidator(config, 'pop'); + }, + + setup: function($element, config) { + const from = config.from; + const to = config.to; + const fromOpacity = 'opacity' in from ? from.opacity : $element.css('opacity'); + const toOpacity = 'opacity' in to ? to.opacity : 1; + const fromScale = 'scale' in from ? from.scale : 0; + const toScale = 'scale' in to ? to.scale : 1; + + config.from = { + opacity: fromOpacity + }; + + const translate = getTranslate($element); + + config.from[TRANSFORM_PROP] = this._getCssTransform(translate, fromScale); + + config.to = { + opacity: toOpacity + }; + config.to[TRANSFORM_PROP] = this._getCssTransform(translate, toScale); + }, + + _getCssTransform: function(translate, scale) { + return getTranslateCss(translate) + 'scale(' + scale + ')'; + } +}; + + +const animationConfigurators = { + 'custom': CustomAnimationConfigurator, + 'slide': SlideAnimationConfigurator, + 'slideIn': SlideAnimationConfigurator, + 'slideOut': SlideAnimationConfigurator, + 'fade': FadeAnimationConfigurator, + 'fadeIn': FadeAnimationConfigurator, + 'fadeOut': FadeAnimationConfigurator, + 'pop': PopAnimationConfigurator, + 'css': CssAnimationConfigurator +}; + +const getAnimationConfigurator = function(config) { + const result = animationConfigurators[config.type]; + if(!result) { + throw errors.Error('E0011', config.type); + } + + return result; +}; + + +const defaultJSConfig = { + type: 'custom', + from: {}, + to: {}, + duration: 400, + start: noop, + complete: noop, + easing: 'ease', + delay: 0 +}; +const defaultCssConfig = { + duration: 400, + easing: 'ease', + delay: 0 +}; + +function setupAnimationOnElement() { + const animation = this; + const $element = animation.element; + const config = animation.config; + + setupPosition($element, config.from); + setupPosition($element, config.to); + + animation.configurator.setup($element, config); + + $element.data(ANIM_DATA_KEY, animation); + + if(fx.off) { + config.duration = 0; + config.delay = 0; + } + + animation.strategy.initAnimation($element, config); + + if(config.start) { + const element = getPublicElement($element); + config.start.apply(this, [element, config]); + } +} + +const onElementAnimationComplete = function(animation) { + const $element = animation.element; + const config = animation.config; + + $element.removeData(ANIM_DATA_KEY); + if(config.complete) { + const element = getPublicElement($element); + config.complete.apply(this, [element, config]); + } + animation.deferred.resolveWith(this, [$element, config]); +}; + +const startAnimationOnElement = function() { + const animation = this; + const $element = animation.element; + const config = animation.config; + + animation.isStarted = true; + return animation.strategy.animate($element, config) + .done(function() { + onElementAnimationComplete(animation); + }) + .fail(function() { + animation.deferred.rejectWith(this, [$element, config]); + }); +}; + +const stopAnimationOnElement = function(jumpToEnd) { + const animation = this; + const $element = animation.element; + const config = animation.config; + + clearTimeout(animation.startTimeout); + + if(!animation.isStarted) { + animation.start(); + } + + animation.strategy.stop($element, config, jumpToEnd); +}; + +const scopedRemoveEvent = addNamespace(removeEvent, 'dxFXStartAnimation'); + +const subscribeToRemoveEvent = function(animation) { + eventsEngine.off(animation.element, scopedRemoveEvent); + eventsEngine.on(animation.element, scopedRemoveEvent, function() { + fx.stop(animation.element); + }); + + animation.deferred.always(function() { + eventsEngine.off(animation.element, scopedRemoveEvent); + }); +}; + +const createAnimation = function(element, initialConfig) { + const defaultConfig = initialConfig.type === 'css' ? defaultCssConfig : defaultJSConfig; + const config = extend(true, {}, defaultConfig, initialConfig); + const configurator = getAnimationConfigurator(config); + const strategy = getAnimationStrategy(config); + const animation = { + element: $(element), + config: config, + configurator: configurator, + strategy: strategy, + isSynchronous: strategy.isSynchronous, + setup: setupAnimationOnElement, + start: startAnimationOnElement, + stop: stopAnimationOnElement, + deferred: new Deferred() + }; + + if(isFunction(configurator.validateConfig)) { + configurator.validateConfig(config); + } + + subscribeToRemoveEvent(animation); + + return animation; +}; + +const animate = function(element, config) { + const $element = $(element); + + if(!$element.length) { + return new Deferred().resolve().promise(); + } + + const animation = createAnimation($element, config); + + pushInAnimationQueue($element, animation); + return animation.deferred.promise(); +}; + +function pushInAnimationQueue($element, animation) { + const queueData = getAnimQueueData($element); + writeAnimQueueData($element, queueData); + queueData.push(animation); + + if(!isAnimating($element)) { + shiftFromAnimationQueue($element, queueData); + } +} + +function getAnimQueueData($element) { + return $element.data(ANIM_QUEUE_KEY) || []; +} + +function writeAnimQueueData($element, queueData) { + $element.data(ANIM_QUEUE_KEY, queueData); +} + +const destroyAnimQueueData = function($element) { + $element.removeData(ANIM_QUEUE_KEY); +}; + +function isAnimating($element) { + return !!$element.data(ANIM_DATA_KEY); +} + +function shiftFromAnimationQueue($element, queueData) { + queueData = getAnimQueueData($element); + if(!queueData.length) { + return; + } + + const animation = queueData.shift(); + if(queueData.length === 0) { + destroyAnimQueueData($element); + } + + executeAnimation(animation).done(function() { + if(!isAnimating($element)) { + shiftFromAnimationQueue($element); + } + }); +} + +function executeAnimation(animation) { + animation.setup(); + if(fx.off || animation.isSynchronous) { + animation.start(); + } else { + animation.startTimeout = setTimeout(function() { + animation.start(); + }); + } + + return animation.deferred.promise(); +} + +function setupPosition($element, config) { + if(!config || !config.position) { + return; + } + + const win = $(window); + let left = 0; + let top = 0; + const position = positionUtils.calculate($element, config.position); + const offset = $element.offset(); + const currentPosition = $element.position(); + + if(currentPosition.top > offset.top) { + top = win.scrollTop(); + } + + if(currentPosition.left > offset.left) { + left = win.scrollLeft(); + } + + extend(config, { + left: position.h.location - offset.left + currentPosition.left - left, + top: position.v.location - offset.top + currentPosition.top - top + }); + + delete config.position; +} + +function setProps($element, props) { + each(props, function(key, value) { + try { + $element.css(key, isFunction(value) ? value() : value); + } catch(e) { } + }); +} + +const stop = function(element, jumpToEnd) { + const $element = $(element); + const queueData = getAnimQueueData($element); + + // TODO: think about complete all animation in queue + each(queueData, function(_, animation) { + animation.config.delay = 0; + animation.config.duration = 0; + animation.isSynchronous = true; + }); + + if(!isAnimating($element)) { + shiftFromAnimationQueue($element, queueData); + } + const animation = $element.data(ANIM_DATA_KEY); + + if(animation) { + animation.stop(jumpToEnd); + } + + $element.removeData(ANIM_DATA_KEY); + destroyAnimQueueData($element); +}; + +const fx = { + off: false, + animationTypes: animationConfigurators, + animate: animate, + createAnimation: createAnimation, + isAnimating: isAnimating, + stop: stop, + _simulatedTransitionEndDelay: 100 +}; + +export default fx; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/position.d.ts b/packages/f-theme-editor/farris-theme-editor/js/animation/position.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..04a62676378e67ab4b1d4a680a14a9c28a84618b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/position.d.ts @@ -0,0 +1,113 @@ +import { + UserDefinedElement, +} from '../core/element'; + +/** + * @docid + * @namespace DevExpress + * @type object + * @public + */ +export interface PositionConfig { + /** + * @docid + * @type Enums.PositionAlignment|object + * @public + */ + at?: 'bottom' | 'center' | 'left' | 'left bottom' | 'left top' | 'right' | 'right bottom' | 'right top' | 'top' | { + /** + * @docid + * @type Enums.HorizontalAlignment + */ + x?: 'center' | 'left' | 'right'; + /** + * @docid + * @type Enums.VerticalAlignment + */ + y?: 'bottom' | 'center' | 'top'; + }; + /** + * @docid + * @public + */ + boundary?: string | UserDefinedElement | Window; + /** + * @docid + * @public + */ + boundaryOffset?: string | { + /** + * @docid + * @default 0 + */ + x?: number; + /** + * @docid + * @default 0 + */ + y?: number; + }; + /** + * @docid + * @type Enums.PositionResolveCollisionXY|object + * @public + */ + collision?: 'fit' | 'fit flip' | 'fit flipfit' | 'fit none' | 'flip' | 'flip fit' | 'flip none' | 'flipfit' | 'flipfit fit' | 'flipfit none' | 'none' | 'none fit' | 'none flip' | 'none flipfit' | { + /** + * @docid + * @type Enums.PositionResolveCollision + * @default 'none' + */ + x?: 'fit' | 'flip' | 'flipfit' | 'none'; + /** + * @docid + * @type Enums.PositionResolveCollision + * @default 'none' + */ + y?: 'fit' | 'flip' | 'flipfit' | 'none'; + }; + /** + * @docid + * @type Enums.PositionAlignment|object + * @public + */ + my?: 'bottom' | 'center' | 'left' | 'left bottom' | 'left top' | 'right' | 'right bottom' | 'right top' | 'top' | { + /** + * @docid + * @type Enums.HorizontalAlignment + */ + x?: 'center' | 'left' | 'right'; + /** + * @docid + * @type Enums.VerticalAlignment + */ + y?: 'bottom' | 'center' | 'top'; + }; + /** + * @docid + * @public + */ + of?: string | UserDefinedElement | Window; + /** + * @docid + * @public + */ + offset?: string | { + /** + * @docid + * @default 0 + */ + x?: number; + /** + * @docid + * @default 0 + */ + y?: number; + }; +} + +/** + * @public + * @deprecated Use the PositionConfig type instead + */ +export interface positionConfig extends PositionConfig { } diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/position.js b/packages/f-theme-editor/farris-theme-editor/js/animation/position.js new file mode 100644 index 0000000000000000000000000000000000000000..dccb82259ff86f0fca84a09abc4f8c60d7ab8ac9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/position.js @@ -0,0 +1,432 @@ +import { getOuterWidth, getOuterHeight, getWidth, getHeight } from '../core/utils/size'; +import $ from '../core/renderer'; + +import { splitPair, pairToObject } from '../core/utils/common'; +import { each } from '../core/utils/iterator'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import domAdapter from '../core/dom_adapter'; +import { isWindow, isDefined } from '../core/utils/type'; +import { extend } from '../core/utils/extend'; +import { getBoundingRect } from '../core/utils/position'; +import browser from '../core/utils/browser'; +import { resetPosition, move } from './translator'; +import { touch } from '../core/utils/support'; +import devices from '../core/devices'; + +const horzRe = /left|right/; +const vertRe = /top|bottom/; +const collisionRe = /fit|flip|none/; +const scaleRe = /scale\(.+?\)/; +const IS_SAFARI = browser.safari; + +const normalizeAlign = function(raw) { + const result = { + h: 'center', + v: 'center' + }; + + const pair = splitPair(raw); + + if(pair) { + each(pair, function() { + const w = String(this).toLowerCase(); + if(horzRe.test(w)) { + result.h = w; + } else if(vertRe.test(w)) { + result.v = w; + } + }); + } + + return result; +}; + +const normalizeOffset = function(raw) { + return pairToObject(raw); +}; + +const normalizeCollision = function(raw) { + const pair = splitPair(raw); + let h = String(pair && pair[0]).toLowerCase(); + let v = String(pair && pair[1]).toLowerCase(); + + if(!collisionRe.test(h)) { + h = 'none'; + } + if(!collisionRe.test(v)) { + v = h; + } + + return { h: h, v: v }; +}; + +const getAlignFactor = function(align) { + switch(align) { + case 'center': + return 0.5; + case 'right': + case 'bottom': + return 1; + default: + return 0; + } +}; + +const inverseAlign = function(align) { + switch(align) { + case 'left': + return 'right'; + case 'right': + return 'left'; + case 'top': + return 'bottom'; + case 'bottom': + return 'top'; + default: + return align; + } +}; + +const calculateOversize = function(data, bounds) { + let oversize = 0; + + if(data.myLocation < bounds.min) { + oversize += bounds.min - data.myLocation; + } + + if(data.myLocation > bounds.max) { + oversize += data.myLocation - bounds.max; + } + + return oversize; +}; + +const collisionSide = function(direction, data, bounds) { + if(data.myLocation < bounds.min) { + return direction === 'h' ? 'left' : 'top'; + } + if(data.myLocation > bounds.max) { + return direction === 'h' ? 'right' : 'bottom'; + } + return 'none'; +}; + +// TODO: rename? +const initMyLocation = function(data) { + data.myLocation = data.atLocation + + getAlignFactor(data.atAlign) * data.atSize + - getAlignFactor(data.myAlign) * data.mySize + + data.offset; +}; + +const collisionResolvers = { + + 'fit': function(data, bounds) { + let result = false; + if(data.myLocation > bounds.max) { + data.myLocation = bounds.max; + result = true; + } + if(data.myLocation < bounds.min) { + data.myLocation = bounds.min; + result = true; + } + + data.fit = result; + }, + + 'flip': function(data, bounds) { + data.flip = false; + + if(data.myAlign === 'center' && data.atAlign === 'center') { + return; + } + + if(data.myLocation < bounds.min || data.myLocation > bounds.max) { + const inverseData = extend({}, data, { + myAlign: inverseAlign(data.myAlign), + atAlign: inverseAlign(data.atAlign), + offset: -data.offset + }); + + initMyLocation(inverseData); + inverseData.oversize = calculateOversize(inverseData, bounds); + + if((inverseData.myLocation >= bounds.min && inverseData.myLocation <= bounds.max) || data.oversize > inverseData.oversize) { + data.myLocation = inverseData.myLocation; + data.oversize = inverseData.oversize; + data.flip = true; + } + } + }, + + 'flipfit': function(data, bounds) { + this.flip(data, bounds); + this.fit(data, bounds); + }, + + 'none': function(data) { + data.oversize = 0; + } +}; + +let scrollbarWidth; + +const calculateScrollbarWidth = function() { + const $scrollDiv = $('
').css({ + width: 100, + height: 100, + overflow: 'scroll', + position: 'absolute', + top: -9999 + }).appendTo($('body')); + const result = $scrollDiv.get(0).offsetWidth - $scrollDiv.get(0).clientWidth; + + $scrollDiv.remove(); + + scrollbarWidth = result; +}; + +const defaultPositionResult = { + h: { + location: 0, + flip: false, + fit: false, + oversize: 0 + }, + v: { + location: 0, + flip: false, + fit: false, + oversize: 0 + } +}; + +const calculatePosition = function(what, options) { + const $what = $(what); + const currentOffset = $what.offset(); + const result = extend(true, {}, defaultPositionResult, { + h: { location: currentOffset.left }, + v: { location: currentOffset.top } + }); + + if(!options) { + return result; + } + + const my = normalizeAlign(options.my); + const at = normalizeAlign(options.at); + let of = ($(options.of).length && options.of) || window; + const offset = normalizeOffset(options.offset); + const collision = normalizeCollision(options.collision); + const boundary = options.boundary; + const boundaryOffset = normalizeOffset(options.boundaryOffset); + + const h = { + mySize: getOuterWidth($what), + myAlign: my.h, + atAlign: at.h, + offset: offset.h, + collision: collision.h, + boundaryOffset: boundaryOffset.h + }; + + const v = { + mySize: getOuterHeight($what), + myAlign: my.v, + atAlign: at.v, + offset: offset.v, + collision: collision.v, + boundaryOffset: boundaryOffset.v + }; + + if(of.preventDefault) { + h.atLocation = of.pageX; + v.atLocation = of.pageY; + h.atSize = 0; + v.atSize = 0; + } else { + of = $(of); + if(isWindow(of[0])) { + h.atLocation = of.scrollLeft(); + v.atLocation = of.scrollTop(); + if(devices.real().deviceType === 'phone' && of[0].visualViewport) { + h.atLocation = Math.max(h.atLocation, of[0].visualViewport.offsetLeft); + v.atLocation = Math.max(v.atLocation, of[0].visualViewport.offsetTop); + h.atSize = of[0].visualViewport.width; + v.atSize = of[0].visualViewport.height; + } else { + h.atSize = of[0].innerWidth > of[0].outerWidth ? of[0].innerWidth : getWidth(of); + v.atSize = of[0].innerHeight > of[0].outerHeight || IS_SAFARI ? of[0].innerHeight : getHeight(of); + } + } else if(of[0].nodeType === 9) { + h.atLocation = 0; + v.atLocation = 0; + h.atSize = getWidth(of); + v.atSize = getHeight(of); + } else { + const ofRect = getBoundingRect(of.get(0)); + const o = getOffsetWithoutScale(of); + h.atLocation = o.left; + v.atLocation = o.top; + h.atSize = Math.max(ofRect.width, getOuterWidth(of)); + v.atSize = Math.max(ofRect.height, getOuterHeight(of)); + } + } + + initMyLocation(h); + initMyLocation(v); + + const bounds = (function() { + const win = $(window); + const windowWidth = getWidth(win); + const windowHeight = getHeight(win); + let left = win.scrollLeft(); + let top = win.scrollTop(); + const documentElement = domAdapter.getDocumentElement(); + const hZoomLevel = touch ? documentElement.clientWidth / windowWidth : 1; + const vZoomLevel = touch ? documentElement.clientHeight / windowHeight : 1; + + if(scrollbarWidth === undefined) { + calculateScrollbarWidth(); + } + + let boundaryWidth = windowWidth; + let boundaryHeight = windowHeight; + + if(boundary) { + const $boundary = $(boundary); + const boundaryPosition = $boundary.offset(); + + left = boundaryPosition.left; + top = boundaryPosition.top; + + boundaryWidth = getWidth($boundary); + boundaryHeight = getHeight($boundary); + } + + return { + h: { + min: left + h.boundaryOffset, + max: left + boundaryWidth / hZoomLevel - h.mySize - h.boundaryOffset + }, + v: { + min: top + v.boundaryOffset, + max: top + boundaryHeight / vZoomLevel - v.mySize - v.boundaryOffset + } + }; + })(); + + h.oversize = calculateOversize(h, bounds.h); + v.oversize = calculateOversize(v, bounds.v); + + h.collisionSide = collisionSide('h', h, bounds.h); + v.collisionSide = collisionSide('v', v, bounds.v); + + if(collisionResolvers[h.collision]) { + collisionResolvers[h.collision](h, bounds.h); + } + + if(collisionResolvers[v.collision]) { + collisionResolvers[v.collision](v, bounds.v); + } + + const preciser = function(number) { + return options.precise ? number : Math.round(number); + }; + + extend(true, result, { + h: { location: preciser(h.myLocation), oversize: preciser(h.oversize), fit: h.fit, flip: h.flip, collisionSide: h.collisionSide }, + v: { location: preciser(v.myLocation), oversize: preciser(v.oversize), fit: v.fit, flip: v.flip, collisionSide: v.collisionSide }, + precise: options.precise + }); + + return result; +}; + +// NOTE: Setting the 'element.style.transform.scale' requires the inline style when both of the conditions met: +// - a form contains an input with the name property set to "style"; +// - a form contains a dx-validator (or other popup widget). +// T941581 +const setScaleProperty = function(element, scale, transformProp, styleAttr, isEmpty) { + const stylePropIsValid = isDefined(element.style) && !domAdapter.isNode(element.style); + if(stylePropIsValid) { + element.style.transform = isEmpty ? transformProp.replace(scale, '') : transformProp; + } else { + element.setAttribute('style', isEmpty ? styleAttr.replace(scale, '') : styleAttr); + } +}; + +const getOffsetWithoutScale = function($startElement, $currentElement = $startElement) { + const currentElement = $currentElement.get(0); + if(!currentElement) { + return $startElement.offset(); + } + + const style = currentElement.getAttribute?.('style') || ''; + const transform = currentElement.style?.transform; + const scale = style.match(scaleRe)?.[0]; + let offset; + + if(scale) { + setScaleProperty(currentElement, scale, transform, style, true); + offset = getOffsetWithoutScale($startElement, $currentElement.parent()); + setScaleProperty(currentElement, scale, transform, style, false); + } else { + offset = getOffsetWithoutScale($startElement, $currentElement.parent()); + } + + return offset; +}; + +const position = function(what, options) { + const $what = $(what); + + if(!options) { + return $what.offset(); + } + + resetPosition($what, true); + + + const offset = getOffsetWithoutScale($what); + const targetPosition = (options.h && options.v) ? options : calculatePosition($what, options); + + const preciser = function(number) { + return options.precise ? number : Math.round(number); + }; + + move($what, { + left: targetPosition.h.location - preciser(offset.left), + top: targetPosition.v.location - preciser(offset.top) + }); + + return targetPosition; +}; + +const offset = function(element) { + element = $(element).get(0); + if(isWindow(element)) { + return null; + } else if(element && 'pageY' in element && 'pageX' in element) { + return { top: element.pageY, left: element.pageX }; + } + + return $(element).offset(); +}; + +if(!position.inverseAlign) { + position.inverseAlign = inverseAlign; +} + +if(!position.normalizeAlign) { + position.normalizeAlign = normalizeAlign; +} + +export default { + calculateScrollbarWidth: calculateScrollbarWidth, + calculate: calculatePosition, + setup: position, + offset: offset +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/presets.d.ts b/packages/f-theme-editor/farris-theme-editor/js/animation/presets.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..bed84b56a1289ec6c3e04c287565740ba09f46b1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/presets.d.ts @@ -0,0 +1,59 @@ +import { + Device, +} from '../core/devices'; + +import { + AnimationConfig, +} from './fx'; + +/** + * @docid + * @namespace DevExpress + * @public + */ +declare const animationPresets: { + /** + * @docid + * @publicName applyChanges() + * @public + */ + applyChanges(): void; + /** + * @docid + * @publicName clear() + * @public + */ + clear(): void; + /** + * @docid + * @publicName clear(name) + * @public + */ + clear(name: string): void; + /** + * @docid + * @publicName getPreset(name) + * @public + */ + getPreset(name: string): AnimationConfig; + /** + * @docid + * @publicName registerDefaultPresets() + * @public + */ + registerDefaultPresets(): void; + /** + * @docid + * @publicName registerPreset(name, config) + * @public + */ + registerPreset(name: string, config: { animation: AnimationConfig; device?: Device }): void; + /** + * @docid + * @publicName resetToDefaults() + * @public + */ + resetToDefaults(): void; +}; + +export default animationPresets; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/presets.js b/packages/f-theme-editor/farris-theme-editor/js/animation/presets.js new file mode 100644 index 0000000000000000000000000000000000000000..a195940b03099bb5a1c1e95817b21b05c1752e75 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/presets.js @@ -0,0 +1,3 @@ +import { presets } from './presets/presets'; + +export default presets; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/presets/presets.js b/packages/f-theme-editor/farris-theme-editor/js/animation/presets/presets.js new file mode 100644 index 0000000000000000000000000000000000000000..7775d572ff5731d2641d4092c13be3f73a066d2b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/presets/presets.js @@ -0,0 +1,395 @@ +import { getWidth } from '../../core/utils/size'; +import { Component } from '../../core/component'; +import { each } from '../../core/utils/iterator'; +import { extend } from '../../core/utils/extend'; +import devices from '../../core/devices'; +import fx from '../fx'; + +const directionPostfixes = { + forward: ' dx-forward', + backward: ' dx-backward', + none: ' dx-no-direction', + undefined: ' dx-no-direction' +}; + +const optionPrefix = 'preset_'; + +const AnimationPresetCollection = Component.inherit({ + ctor: function() { + this.callBase.apply(this, arguments); + this._registeredPresets = []; + this.resetToDefaults(); + }, + + _getDefaultOptions: function() { + return extend(this.callBase(), { + defaultAnimationDuration: 400, + defaultAnimationDelay: 0, + defaultStaggerAnimationDuration: 300, + defaultStaggerAnimationDelay: 40, + defaultStaggerAnimationStartDelay: 500 // hack for better animations on ipad mini + }); + }, + + _defaultOptionsRules: function() { + return this.callBase().concat([ + { + device: function(device) { + return device.phone; + }, + options: { + defaultStaggerAnimationDuration: 350, + defaultStaggerAnimationDelay: 50, + defaultStaggerAnimationStartDelay: 0 + } + }, + { // T254756 + device: function() { + return devices.current().android || devices.real.android; + }, + options: { + defaultAnimationDelay: 100 + } + } + ]); + }, + + _getPresetOptionName: function(animationName) { + return optionPrefix + animationName; + }, + + // T257755 + _createAndroidSlideAnimationConfig: function(throughOpacity, widthMultiplier) { + const that = this; + + const createBaseConfig = function(configModifier) { + return { + type: 'slide', + delay: configModifier.delay === undefined ? that.option('defaultAnimationDelay') : configModifier.delay, + duration: configModifier.duration === undefined ? that.option('defaultAnimationDuration') : configModifier.duration + }; + }; + + return { + enter: function($element, configModifier) { + const width = getWidth($element.parent()) * widthMultiplier; + const direction = configModifier.direction; + const config = createBaseConfig(configModifier); + + config.to = { + left: 0, + opacity: 1 + }; + + if(direction === 'forward') { + config.from = { + left: width, + opacity: throughOpacity + }; + } else if(direction === 'backward') { + config.from = { + left: -width, + opacity: throughOpacity + }; + } else { + config.from = { + left: 0, + opacity: 0 + }; + } + + return fx.createAnimation($element, config); + }, + leave: function($element, configModifier) { + const width = getWidth($element.parent()) * widthMultiplier; + const direction = configModifier.direction; + const config = createBaseConfig(configModifier); + + config.from = { + left: 0, + opacity: 1 + }; + + if(direction === 'forward') { + config.to = { + left: -width, + opacity: throughOpacity + }; + } else if(direction === 'backward') { + config.to = { + left: width, + opacity: throughOpacity + }; + } else { + config.to = { + left: 0, + opacity: 0 + }; + } + + return fx.createAnimation($element, config); + } + }; + }, + + _createOpenDoorConfig: function() { + const that = this; + + const createBaseConfig = function(configModifier) { + return { + type: 'css', + extraCssClasses: 'dx-opendoor-animation', + delay: configModifier.delay === undefined ? that.option('defaultAnimationDelay') : configModifier.delay, + duration: configModifier.duration === undefined ? that.option('defaultAnimationDuration') : configModifier.duration + }; + }; + + return { + enter: function($element, configModifier) { + const direction = configModifier.direction; + const config = createBaseConfig(configModifier); + + config.delay = direction === 'none' ? config.delay : config.duration; + config.from = 'dx-enter dx-opendoor-animation' + directionPostfixes[direction]; + config.to = 'dx-enter-active'; + + return fx.createAnimation($element, config); + }, + leave: function($element, configModifier) { + const direction = configModifier.direction; + const config = createBaseConfig(configModifier); + + config.from = 'dx-leave dx-opendoor-animation' + directionPostfixes[direction]; + config.to = 'dx-leave-active'; + + return fx.createAnimation($element, config); + } + }; + }, + + _createWinPopConfig: function() { + const that = this; + const baseConfig = { + type: 'css', + extraCssClasses: 'dx-win-pop-animation', + duration: that.option('defaultAnimationDuration') + }; + + return { + enter: function($element, configModifier) { + const config = baseConfig; + const direction = configModifier.direction; + + config.delay = direction === 'none' ? that.option('defaultAnimationDelay') : that.option('defaultAnimationDuration') / 2; + config.from = 'dx-enter dx-win-pop-animation' + directionPostfixes[direction]; + config.to = 'dx-enter-active'; + + return fx.createAnimation($element, config); + }, + leave: function($element, configModifier) { + const config = baseConfig; + const direction = configModifier.direction; + + config.delay = that.option('defaultAnimationDelay'); + config.from = 'dx-leave dx-win-pop-animation' + directionPostfixes[direction]; + config.to = 'dx-leave-active'; + + return fx.createAnimation($element, config); + } + }; + }, + + resetToDefaults: function() { + this.clear(); + this.registerDefaultPresets(); + this.applyChanges(); + }, + + clear: function(name) { + const that = this; + const newRegisteredPresets = []; + + each(this._registeredPresets, function(index, preset) { + if(!name || name === preset.name) { + that.option(that._getPresetOptionName(preset.name), undefined); + } else { + newRegisteredPresets.push(preset); + } + }); + this._registeredPresets = newRegisteredPresets; + this.applyChanges(); + }, + + registerPreset: function(name, config) { + this._registeredPresets.push({ + name: name, + config: config + }); + }, + + applyChanges: function() { + const that = this; + const customRules = []; + + each(this._registeredPresets, function(index, preset) { + const rule = { + device: preset.config.device, + options: {} + }; + + rule.options[that._getPresetOptionName(preset.name)] = preset.config.animation; + customRules.push(rule); + }); + + this._setOptionsByDevice(customRules); + }, + + getPreset: function(name) { + let result = name; + + while(typeof result === 'string') { + result = this.option(this._getPresetOptionName(result)); + } + + return result; + }, + + registerDefaultPresets: function() { + this.registerPreset('pop', { + animation: { + extraCssClasses: 'dx-android-pop-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('openDoor', { + animation: this._createOpenDoorConfig() + }); + this.registerPreset('win-pop', { + animation: this._createWinPopConfig() + }); + this.registerPreset('fade', { + animation: { + extraCssClasses: 'dx-fade-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('slide', { + device: function() { + return devices.current().android || devices.real.android; + }, + animation: this._createAndroidSlideAnimationConfig(1, 1) + }); + this.registerPreset('slide', { + device: function() { + return !devices.current().android && !devices.real.android; + }, + animation: { + extraCssClasses: 'dx-slide-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('ios7-slide', { + animation: { + extraCssClasses: 'dx-ios7-slide-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('overflow', { + animation: { + extraCssClasses: 'dx-overflow-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('ios7-toolbar', { + device: function() { + return !devices.current().android && !devices.real.android; + }, + animation: { + extraCssClasses: 'dx-ios7-toolbar-animation', + delay: this.option('defaultAnimationDelay'), + duration: this.option('defaultAnimationDuration') + } + }); + this.registerPreset('ios7-toolbar', { + device: function() { + return devices.current().android || devices.real.android; + }, + animation: this._createAndroidSlideAnimationConfig(0, 0.4) + }); + this.registerPreset('stagger-fade', { + animation: { + extraCssClasses: 'dx-fade-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-slide', { + animation: { + extraCssClasses: 'dx-slide-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-fade-slide', { + animation: { + extraCssClasses: 'dx-fade-slide-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-drop', { + animation: { + extraCssClasses: 'dx-drop-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-fade-drop', { + animation: { + extraCssClasses: 'dx-fade-drop-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-fade-rise', { + animation: { + extraCssClasses: 'dx-fade-rise-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-3d-drop', { + animation: { + extraCssClasses: 'dx-3d-drop-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + this.registerPreset('stagger-fade-zoom', { + animation: { + extraCssClasses: 'dx-fade-zoom-animation', + staggerDelay: this.option('defaultStaggerAnimationDelay'), + duration: this.option('defaultStaggerAnimationDuration'), + delay: this.option('defaultStaggerAnimationStartDelay') + } + }); + } +}); + +const animationPresets = new AnimationPresetCollection(); +export { + animationPresets as presets, + AnimationPresetCollection as PresetCollection +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.d.ts b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ebfe785da8d488774f75e42d6b7b47327bb30077 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.d.ts @@ -0,0 +1,52 @@ +import { + UserDefinedElementsArray, +} from '../core/element'; + +import { + DxPromise, +} from '../core/utils/deferred'; + +import { + AnimationConfig, +} from './fx'; + +/** + * @docid + * @namespace DevExpress + * @public + */ +export default class TransitionExecutor { + /** + * @docid + * @publicName enter(elements, animation) + * @param1 elements:jQuery + * @public + */ + enter(elements: UserDefinedElementsArray, animation: AnimationConfig | string): void; + /** + * @docid + * @publicName leave(elements, animation) + * @param1 elements:jQuery + * @public + */ + leave(elements: UserDefinedElementsArray, animation: AnimationConfig | string): void; + /** + * @docid + * @publicName reset() + * @public + */ + reset(): void; + /** + * @docid + * @publicName start() + * @return Promise + * @public + */ + start(): DxPromise; + /** + * @docid + * @publicName stop() + * @public + */ + stop(): void; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.js b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.js new file mode 100644 index 0000000000000000000000000000000000000000..62e969cd574ce3063d610fc108db426a91506e95 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor.js @@ -0,0 +1,2 @@ +import { TransitionExecutor } from './transition_executor/transition_executor'; +export default TransitionExecutor; diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor/transition_executor.js b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor/transition_executor.js new file mode 100644 index 0000000000000000000000000000000000000000..07abe63bc90e71782e4c096917ed9df990ea7bf4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/transition_executor/transition_executor.js @@ -0,0 +1,177 @@ +import $ from '../../core/renderer'; +import Class from '../../core/class'; +import { extend } from '../../core/utils/extend'; +import { executeAsync } from '../../core/utils/common'; +import { isFunction, isPlainObject } from '../../core/utils/type'; +import { map } from '../../core/utils/iterator'; +import fx from '../fx'; +import { presets } from '../presets/presets'; +import { when, Deferred } from '../../core/utils/deferred'; + +const directionPostfixes = { + forward: ' dx-forward', + backward: ' dx-backward', + none: ' dx-no-direction', + undefined: ' dx-no-direction' +}; +const DX_ANIMATING_CLASS = 'dx-animating'; + +export const TransitionExecutor = Class.inherit({ + ctor: function() { + this._accumulatedDelays = { + enter: 0, + leave: 0 + }; + this._animations = []; + this.reset(); + }, + + _createAnimations: function($elements, initialConfig, configModifier, type) { + const that = this; + const result = []; + + configModifier = configModifier || {}; + const animationConfig = this._prepareElementAnimationConfig(initialConfig, configModifier, type); + + if(animationConfig) { + $elements.each(function() { + const animation = that._createAnimation($(this), animationConfig, configModifier); + if(animation) { + animation.element.addClass(DX_ANIMATING_CLASS); + animation.setup(); + result.push(animation); + } + }); + } + + return result; + }, + + _prepareElementAnimationConfig: function(config, configModifier, type) { + let result; + + if(typeof config === 'string') { + const presetName = config; + config = presets.getPreset(presetName); + } + + if(!config) { + result = undefined; + } else if(isFunction(config[type])) { + result = config[type]; + } else { + result = extend({ + skipElementInitialStyles: true, + cleanupWhen: this._completePromise + }, config, configModifier); + + if(!result.type || result.type === 'css') { + const cssClass = 'dx-' + type; + const extraCssClasses = (result.extraCssClasses ? ' ' + result.extraCssClasses : '') + directionPostfixes[result.direction]; + + result.type = 'css'; + result.from = (result.from || cssClass) + extraCssClasses; + result.to = result.to || (cssClass + '-active'); + } + + result.staggerDelay = result.staggerDelay || 0; + result.delay = result.delay || 0; + + if(result.staggerDelay) { + result.delay += this._accumulatedDelays[type]; + this._accumulatedDelays[type] += result.staggerDelay; + } + + } + return result; + }, + + _createAnimation: function($element, animationConfig, configModifier) { + let result; + + if(isPlainObject(animationConfig)) { + result = fx.createAnimation($element, animationConfig); + } else if(isFunction(animationConfig)) { + result = animationConfig($element, configModifier); + } + + return result; + }, + + _startAnimations: function() { + const animations = this._animations; + + for(let i = 0; i < animations.length; i++) { + animations[i].start(); + } + }, + + _stopAnimations: function(jumpToEnd) { + const animations = this._animations; + + for(let i = 0; i < animations.length; i++) { + animations[i].stop(jumpToEnd); + } + }, + + _clearAnimations: function() { + const animations = this._animations; + + for(let i = 0; i < animations.length; i++) { + animations[i].element.removeClass(DX_ANIMATING_CLASS); + } + + this._animations.length = 0; + }, + + reset: function() { + this._accumulatedDelays.enter = 0; + this._accumulatedDelays.leave = 0; + this._clearAnimations(); + this._completeDeferred = new Deferred(); + this._completePromise = this._completeDeferred.promise(); + }, + enter: function($elements, animationConfig, configModifier) { + const animations = this._createAnimations($elements, animationConfig, configModifier, 'enter'); + this._animations.push.apply(this._animations, animations); + }, + leave: function($elements, animationConfig, configModifier) { + const animations = this._createAnimations($elements, animationConfig, configModifier, 'leave'); + this._animations.push.apply(this._animations, animations); + }, + start: function() { + const that = this; + let result; + + if(!this._animations.length) { + that.reset(); + result = new Deferred().resolve().promise(); + } else { + const animationDeferreds = map(this._animations, function(animation) { + const result = new Deferred(); + + animation.deferred.always(function() { + result.resolve(); + }); + + return result.promise(); + }); + + result = when.apply($, animationDeferreds) + .always(function() { + that._completeDeferred.resolve(); + that.reset(); + }); + + executeAsync(function() { + that._startAnimations(); + }); + } + + return result; + }, + stop: function(jumpToEnd) { + this._stopAnimations(jumpToEnd); + } + +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/animation/translator.js b/packages/f-theme-editor/farris-theme-editor/js/animation/translator.js new file mode 100644 index 0000000000000000000000000000000000000000..d07d84115ffcf51cfc4e9db5a48b609487ca9d60 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/animation/translator.js @@ -0,0 +1,145 @@ +import $ from '../core/renderer'; +import { data as elementData, removeData } from '../core/element_data'; +import { type } from '../core/utils/type'; + +const TRANSLATOR_DATA_KEY = 'dxTranslator'; +const TRANSFORM_MATRIX_REGEX = /matrix(3d)?\((.+?)\)/; +const TRANSLATE_REGEX = /translate(?:3d)?\((.+?)\)/; + +export const locate = function($element) { + $element = $($element); + + const translate = getTranslate($element); + + return { + left: translate.x, + top: translate.y + }; +}; +function isPercentValue(value) { + return type(value) === 'string' && value[value.length - 1] === '%'; +} + +function cacheTranslate($element, translate) { + if($element.length) { + elementData($element.get(0), TRANSLATOR_DATA_KEY, translate); + } +} + +export const clearCache = function($element) { + if($element.length) { + removeData($element.get(0), TRANSLATOR_DATA_KEY); + } +}; + +export const getTranslateCss = function(translate) { + translate.x = translate.x || 0; + translate.y = translate.y || 0; + + const xValueString = isPercentValue(translate.x) ? translate.x : translate.x + 'px'; + const yValueString = isPercentValue(translate.y) ? translate.y : translate.y + 'px'; + + return 'translate(' + xValueString + ', ' + yValueString + ')'; +}; + +export const getTranslate = function($element) { + let result = $element.length ? elementData($element.get(0), TRANSLATOR_DATA_KEY) : null; + + if(!result) { + const transformValue = $element.css('transform') || getTranslateCss({ x: 0, y: 0 }); + let matrix = transformValue.match(TRANSFORM_MATRIX_REGEX); + const is3D = matrix && matrix[1]; + + if(matrix) { + matrix = matrix[2].split(','); + if(is3D === '3d') { + matrix = matrix.slice(12, 15); + } else { + matrix.push(0); + matrix = matrix.slice(4, 7); + } + } else { + matrix = [0, 0, 0]; + } + + result = { + x: parseFloat(matrix[0]), + y: parseFloat(matrix[1]), + z: parseFloat(matrix[2]) + }; + + cacheTranslate($element, result); + } + + return result; +}; + +export const move = function($element, position) { + $element = $($element); + + const left = position.left; + const top = position.top; + let translate; + + if(left === undefined) { + translate = getTranslate($element); + translate.y = top || 0; + } else if(top === undefined) { + translate = getTranslate($element); + translate.x = left || 0; + } else { + translate = { x: left || 0, y: top || 0, z: 0 }; + cacheTranslate($element, translate); + } + + $element.css({ + transform: getTranslateCss(translate) + }); + + if(isPercentValue(left) || isPercentValue(top)) { + clearCache($element); + } +}; + +export const resetPosition = function($element, finishTransition) { + $element = $($element); + + let originalTransition; + const stylesConfig = { + left: 0, + top: 0, + transform: 'none', + }; + + if(finishTransition) { + originalTransition = $element.css('transition'); + stylesConfig.transition = 'none'; + } + + $element.css(stylesConfig); + + clearCache($element); + + if(finishTransition) { + $element.get(0).offsetHeight; + $element.css('transition', originalTransition); + } +}; + +export const parseTranslate = function(translateString) { + let result = translateString.match(TRANSLATE_REGEX); + + if(!result || !result[1]) { + return; + } + + result = result[1].split(','); + + result = { + x: parseFloat(result[0]), + y: parseFloat(result[1]), + z: parseFloat(result[2]) + }; + + return result; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/aspnet.js b/packages/f-theme-editor/farris-theme-editor/js/aspnet.js new file mode 100644 index 0000000000000000000000000000000000000000..0f7b1b6361a5239d90be70b0e01e115a70ad79c7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/aspnet.js @@ -0,0 +1,256 @@ +/* eslint-disable no-var, one-var, import/no-commonjs */ +(function(factory) { + /* global define, DevExpress, window */ + if(typeof define === 'function' && define.amd) { + define(function(require, exports, module) { + module.exports = factory( + require('jquery'), + require('./core/templates/template_engine_registry').setTemplateEngine, + require('./core/templates/template_base').renderedCallbacks, + require('./core/guid'), + require('./ui/validation_engine'), + require('./core/utils/iterator'), + require('./core/utils/dom').extractTemplateMarkup, + require('./core/utils/string').encodeHtml, + require('./core/utils/ajax'), + require('./core/utils/console') + ); + }); + } else { + DevExpress.aspnet = factory( + window.jQuery, + DevExpress.setTemplateEngine, + DevExpress.templateRendered, + DevExpress.data.Guid, + DevExpress.validationEngine, + DevExpress.utils.iterator, + DevExpress.utils.dom.extractTemplateMarkup, + DevExpress.utils.string.encodeHtml, + DevExpress.utils.ajax, + DevExpress.utils.console + ); + } +})(function($, setTemplateEngine, templateRendered, Guid, validationEngine, iteratorUtils, extractTemplateMarkup, encodeHtml, ajax, console) { + var templateCompiler = createTemplateCompiler(); + var pendingCreateComponentRoutines = [ ]; + var enableAlternativeTemplateTags = true; + var warnBug17028 = false; + + function createTemplateCompiler() { + var OPEN_TAG = '<%', + CLOSE_TAG = '%>', + ENCODE_QUALIFIER = '-', + INTERPOLATE_QUALIFIER = '='; + + var EXTENDED_OPEN_TAG = /[<[]%/g, + EXTENDED_CLOSE_TAG = /%[>\]]/g; + + function acceptText(bag, text) { + if(text) { + bag.push('_.push(', JSON.stringify(text), ');'); + } + } + + function acceptCode(bag, code) { + var encode = code.charAt(0) === ENCODE_QUALIFIER, + value = code.substr(1), + interpolate = code.charAt(0) === INTERPOLATE_QUALIFIER; + + if(encode || interpolate) { + bag.push('_.push('); + var expression = value; + if(encode) { + expression = 'arguments[1]((' + value + ' !== null && ' + value + ' !== undefined) ? ' + value + ' : "")'; + if(/^\s*$/.test(value)) { + expression = 'arguments[1](' + value + ')'; + } + } + bag.push(expression); + bag.push(');'); + } else { + bag.push(code + '\n'); + } + } + + return function(text) { + var bag = ['var _ = [];', 'with(obj||{}) {'], + chunks = text.split(enableAlternativeTemplateTags ? EXTENDED_OPEN_TAG : OPEN_TAG); + + if(warnBug17028 && chunks.length > 1) { + if(text.indexOf(OPEN_TAG) > -1) { + console.logger.warn('Please use an alternative template syntax: https://community.devexpress.com/blogs/aspnet/archive/2020/01/29/asp-net-core-new-syntax-to-fix-razor-issue.aspx'); + warnBug17028 = false; + } + } + + acceptText(bag, chunks.shift()); + + for(var i = 0; i < chunks.length; i++) { + var tmp = chunks[i].split(enableAlternativeTemplateTags ? EXTENDED_CLOSE_TAG : CLOSE_TAG); + if(tmp.length !== 2) { + throw 'Template syntax error'; + } + acceptCode(bag, tmp[0]); + acceptText(bag, tmp[1]); + } + + bag.push('}', 'return _.join(\'\')'); + + // eslint-disable-next-line no-new-func + return new Function('obj', bag.join('')); + }; + } + + function createTemplateEngine() { + return { + compile: function(element) { + return templateCompiler(extractTemplateMarkup(element)); + }, + render: function(template, data) { + var html = template(data, encodeHtml); + + var dxMvcExtensionsObj = window['MVCx']; + if(dxMvcExtensionsObj && !dxMvcExtensionsObj.isDXScriptInitializedOnLoad) { + html = html.replace(/(]+)id="dxss_.+?"/g, '$1'); + } + + return html; + } + }; + } + + function getValidationSummary(validationGroup) { + var result; + $('.dx-validationsummary').each(function(_, element) { + var summary = $(element).data('dxValidationSummary'); + if(summary && summary.option('validationGroup') === validationGroup) { + result = summary; + return false; + } + }); + return result; + } + + function createValidationSummaryItemsFromValidators(validators, editorNames) { + var items = []; + + iteratorUtils.each(validators, function(_, validator) { + var widget = validator.$element().data('dx-validation-target'); + if(widget && $.inArray(widget.option('name'), editorNames) > -1) { + items.push({ + text: widget.option('validationError.message'), + validator: validator + }); + } + }); + + return items; + } + + function createComponent(name, options, id, validatorOptions) { + var selector = '#' + String(id).replace(/[^\w-]/g, '\\$&'); + pendingCreateComponentRoutines.push(function() { + var $element = $(selector); + if($element.length) { + var $component = $(selector)[name](options); + if($.isPlainObject(validatorOptions)) { + $component.dxValidator(validatorOptions); + } + return true; + } + return false; + }); + } + + templateRendered.add(function() { + var snapshot = pendingCreateComponentRoutines.slice(); + var leftover = [ ]; + + pendingCreateComponentRoutines = [ ]; + snapshot.forEach(function(func) { + if(!func()) { + leftover.push(func); + } + }); + pendingCreateComponentRoutines = pendingCreateComponentRoutines.concat(leftover); + }); + + return { + createComponent: createComponent, + + renderComponent: function(name, options, id, validatorOptions) { + id = id || ('dx-' + new Guid()); + createComponent(name, options, id, validatorOptions); + return '
'; + }, + + getEditorValue: function(inputName) { + var $widget = $('input[name=\'' + inputName + '\']').closest('.dx-widget'); + if($widget.length) { + var dxComponents = $widget.data('dxComponents'), + widget = $widget.data(dxComponents[0]); + + if(widget) { + return widget.option('value'); + } + } + }, + + setTemplateEngine: function() { + if(setTemplateEngine) { + setTemplateEngine(createTemplateEngine()); + } + }, + + enableAlternativeTemplateTags: function(value) { + enableAlternativeTemplateTags = value; + }, + + warnBug17028: function() { + warnBug17028 = true; + }, + + createValidationSummaryItems: function(validationGroup, editorNames) { + var summary = getValidationSummary(validationGroup), + groupConfig, + items; + + if(summary) { + groupConfig = validationEngine.getGroupConfig(validationGroup); + if(groupConfig) { + items = createValidationSummaryItemsFromValidators(groupConfig.validators, editorNames); + items.length && summary.option('items', items); + } + } + }, + + sendValidationRequest: function(propertyName, propertyValue, url, method) { + var d = $.Deferred(); + var data = { }; + data[propertyName] = propertyValue; + + ajax.sendRequest({ + url: url, + dataType: 'json', + method: method || 'GET', + data: data + }).then(function(response) { + if(typeof response === 'string') { + d.resolve({ + isValid: false, + message: response + }); + } else { + d.resolve(response); + } + }, function(xhr) { + d.reject({ + isValid: false, + message: xhr.responseText + }); + }); + + return d.promise(); + } + }; +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.all.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.all.js new file mode 100644 index 0000000000000000000000000000000000000000..715a730cd7ba74dec21539b1310cad2ddf427d29 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.all.js @@ -0,0 +1,12 @@ +import './modules/parts/widgets-all'; +import './modules/parts/viz'; +import DevExpress from './modules/core'; +import { EventsStrategy } from '../core/events_strategy'; +import { Options } from '../core/options/index'; + +DevExpress.integration = {}; + +DevExpress.integration.EventsStrategy = EventsStrategy; +DevExpress.integration.Options = Options; + +export default DevExpress; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.viz.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.viz.js new file mode 100644 index 0000000000000000000000000000000000000000..068161dc486ad326e246735a170c2b5b35311333 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.viz.js @@ -0,0 +1 @@ +import './modules/parts/viz'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.web.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.web.js new file mode 100644 index 0000000000000000000000000000000000000000..269a0556ba9ab4eeaf7eb17860749c4f6b976603 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/dx.web.js @@ -0,0 +1 @@ +import './modules/parts/widgets-web'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/core.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/core.js new file mode 100644 index 0000000000000000000000000000000000000000..428357ba4495a8413d1fee4fc6f6685c69156882 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/core.js @@ -0,0 +1,88 @@ +/* eslint-disable import/no-commonjs */ +const windowUtils = require('../../core/utils/window'); +const window = windowUtils.getWindow(); + +const DevExpress = window.DevExpress = window.DevExpress || {}; + +const errors = DevExpress.errors = require('../../core/errors'); + +if(DevExpress._DEVEXTREME_BUNDLE_INITIALIZED) { + throw errors.Error('E0024'); +} +DevExpress._DEVEXTREME_BUNDLE_INITIALIZED = true; + +DevExpress.clientExporter = require('../../exporter'); +DevExpress.excelExporter = require('../../excel_exporter'); +DevExpress.pdfExporter = require('../../pdf_exporter'); + +DevExpress.VERSION = require('../../core/version').version; + +DevExpress.Class = require('../../core/class'); +DevExpress.DOMComponent = require('../../core/dom_component'); + +DevExpress.Component = require('../../core/component').Component; + +DevExpress.registerComponent = require('../../core/component_registrator'); +DevExpress.devices = require('../../core/devices'); + +DevExpress.Color = require('../../color'); + +const animationFrame = require('../../animation/frame'); + +/** + * @name utils + * @namespace DevExpress + */ +DevExpress.utils = {}; + +DevExpress.utils.requestAnimationFrame = animationFrame.requestAnimationFrame; +DevExpress.utils.cancelAnimationFrame = animationFrame.cancelAnimationFrame; + +DevExpress.utils.initMobileViewport = require('../../mobile/init_mobile_viewport/init_mobile_viewport').initMobileViewport; + +DevExpress.utils.getTimeZones = require('../../time_zone_utils').getTimeZones; + +// TODO: MODULARITY: Remove this +DevExpress.utils.extendFromObject = require('../../core/utils/extend').extendFromObject; +DevExpress.utils.triggerShownEvent = require('../../events/visibility_change').triggerShownEvent; +DevExpress.utils.triggerHidingEvent = require('../../events/visibility_change').triggerHidingEvent; +DevExpress.utils.resetActiveElement = require('../../core/utils/dom').resetActiveElement; +DevExpress.utils.findBestMatches = require('../../core/utils/common').findBestMatches; +DevExpress.createQueue = require('../../core/utils/queue').create; +DevExpress.utils.dom = require('../../core/utils/dom'); +DevExpress.utils.common = require('../../core/utils/common'); +DevExpress.utils.date = require('../../core/utils/date'); +DevExpress.utils.browser = require('../../core/utils/browser'); +DevExpress.utils.inflector = require('../../core/utils/inflector'); +DevExpress.utils.iterator = require('../../core/utils/iterator'); +DevExpress.utils.readyCallbacks = require('../../core/utils/ready_callbacks'); +DevExpress.utils.resizeCallbacks = require('../../core/utils/resize_callbacks'); +DevExpress.utils.console = require('../../core/utils/console'); +DevExpress.utils.string = require('../../core/utils/string'); +DevExpress.utils.support = require('../../core/utils/support'); +DevExpress.utils.ajax = require('../../core/utils/ajax'); + +DevExpress.viewPort = require('../../core/utils/view_port').value; + +DevExpress.hideTopOverlay = require('../../mobile/hide_top_overlay'); + +DevExpress.formatHelper = require('../../format_helper'); +DevExpress.config = require('../../core/config'); + +DevExpress.animationPresets = require('../../animation/presets/presets').presets; +DevExpress.fx = require('../../animation/fx'); +DevExpress.TransitionExecutor = require('../../animation/transition_executor/transition_executor').TransitionExecutor; +DevExpress.AnimationPresetCollection = require('../../animation/presets/presets').PresetCollection; + +DevExpress.events = require('../../events'); + +DevExpress.events.click = require('../../events/click'); +DevExpress.events.utils = require('../../events/utils'); +DevExpress.events.GestureEmitter = require('../../events/gesture/emitter.gesture'); + +DevExpress.localization = require('../../localization'); + +DevExpress.templateRendered = require('../../core/templates/template_base').renderedCallbacks; +DevExpress.setTemplateEngine = require('../../core/templates/template_engine_registry').setTemplateEngine; + +module.exports = DevExpress; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.js new file mode 100644 index 0000000000000000000000000000000000000000..a1b15cd9d62927d3cd5282e06f39141c498bff59 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.js @@ -0,0 +1,65 @@ +/* eslint-disable import/no-commonjs */ +const DevExpress = require('./core'); +const errors = require('../../core/errors'); + +module.exports = DevExpress.data = DevExpress.data || {}; + +Object.defineProperty(DevExpress.data, 'errorHandler', { + get: function() { + return require('../../data/errors').errorHandler; + }, + set: function(value) { + errors.log('W0003', 'DevExpress.data', 'errorHandler', '21.1', 'Use the \'setErrorHandler\' method instead'); + require('../../data/errors').setErrorHandler(value); + } +}); + +// TODO: try remove (plugins failed without this) +Object.defineProperty(DevExpress.data, '_errorHandler', { + get: function() { + return require('../../data/errors').handleError; + }, + set: function(value) { + errors.log('W0003', 'DevExpress.data', '_errorHandler', '21.1', 'Use the \'setErrorHandler\' method instead'); + require('../../data/errors').setErrorHandler(value); + } +}); + +DevExpress.data.setErrorHandler = require('../../data/errors').setErrorHandler; +DevExpress.data.DataSource = require('../../data/data_source'); +DevExpress.data.query = require('../../data/query'); +DevExpress.data.Store = require('../../data/abstract_store'); +DevExpress.data.ArrayStore = require('../../data/array_store'); +DevExpress.data.CustomStore = require('../../data/custom_store'); +DevExpress.data.LocalStore = require('../../data/local_store'); +DevExpress.data.base64_encode = require('../../data/utils').base64_encode; +DevExpress.data.applyChanges = require('../../data/apply_changes'); + +DevExpress.data.Guid = require('../../core/guid'); + +DevExpress.data.utils = {}; +DevExpress.data.utils.compileGetter = require('../../core/utils/data').compileGetter; +DevExpress.data.utils.compileSetter = require('../../core/utils/data').compileSetter; + +DevExpress.EndpointSelector = require('../../data/endpoint_selector'); + +DevExpress.data.queryImpl = require('../../data/query_implementation').queryImpl; +DevExpress.data.queryAdapters = require('../../data/query_adapters'); + +const dataUtils = require('../../data/utils'); + +DevExpress.data.utils.normalizeBinaryCriterion = dataUtils.normalizeBinaryCriterion; +DevExpress.data.utils.normalizeSortingInfo = dataUtils.normalizeSortingInfo; +DevExpress.data.utils.errorMessageFromXhr = dataUtils.errorMessageFromXhr; +DevExpress.data.utils.aggregators = dataUtils.aggregators; +DevExpress.data.utils.keysEqual = dataUtils.keysEqual; +DevExpress.data.utils.isDisjunctiveOperator = dataUtils.isDisjunctiveOperator; +DevExpress.data.utils.isConjunctiveOperator = dataUtils.isConjunctiveOperator; +DevExpress.data.utils.processRequestResultLock = dataUtils.processRequestResultLock; + +DevExpress.data.utils.toComparable = require('../../core/utils/data').toComparable; + +DevExpress.data.utils.multiLevelGroup = require('../../data/store_helper').multiLevelGroup; +DevExpress.data.utils.arrangeSortingInfo = require('../../data/store_helper').arrangeSortingInfo; + +DevExpress.data.utils.normalizeDataSourceOptions = require('../../data/data_source/utils').normalizeDataSourceOptions; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.odata.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.odata.js new file mode 100644 index 0000000000000000000000000000000000000000..d8c83c7cf9186ddab650709fab655208175d9882 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/data.odata.js @@ -0,0 +1,25 @@ +/* global DevExpress */ +/* eslint-disable import/no-commonjs */ +require('./data'); + +DevExpress.data.ODataStore = require('../../data/odata/store'); +DevExpress.data.ODataContext = require('../../data/odata/context'); + +DevExpress.data.utils = DevExpress.data.utils || {}; +DevExpress.data.utils.odata = {}; + +DevExpress.data.utils.odata.keyConverters = require('../../data/odata/utils').keyConverters; +DevExpress.data.EdmLiteral = require('../../data/odata/utils').EdmLiteral; + +const ODataUtilsModule = require('../../data/odata/utils'); +DevExpress.data.utils.odata.serializePropName = ODataUtilsModule.serializePropName; +DevExpress.data.utils.odata.serializeValue = ODataUtilsModule.serializeValue; +DevExpress.data.utils.odata.serializeKey = ODataUtilsModule.serializeKey; +DevExpress.data.utils.odata.sendRequest = ODataUtilsModule.sendRequest; + +///#DEBUG +DevExpress.data.OData__internals = ODataUtilsModule.OData__internals; +///#ENDDEBUG + +DevExpress.data.queryAdapters = DevExpress.data.queryAdapters || {}; +DevExpress.data.queryAdapters.odata = require('../../data/odata/query_adapter').odata; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/file_management.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/file_management.js new file mode 100644 index 0000000000000000000000000000000000000000..c0261198c33dcc7a1d6b5efd7dcc827287c89b8a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/file_management.js @@ -0,0 +1,15 @@ +/* eslint-disable import/no-commonjs */ +import DevExpress from './core'; +import FileSystemError from '../../file_management/error'; +import FileSystemItem from '../../file_management/file_system_item'; +import ObjectFileSystemProvider from '../../file_management/object_provider'; +import RemoteFileSystemProvider from '../../file_management/remote_provider'; +import CustomFileSystemProvider from '../../file_management/custom_provider'; + +module.exports = DevExpress.fileManagement = DevExpress.fileManagement || {}; + +DevExpress.fileManagement.FileSystemError = FileSystemError; +DevExpress.fileManagement.FileSystemItem = FileSystemItem; +DevExpress.fileManagement.ObjectFileSystemProvider = ObjectFileSystemProvider; +DevExpress.fileManagement.RemoteFileSystemProvider = RemoteFileSystemProvider; +DevExpress.fileManagement.CustomFileSystemProvider = CustomFileSystemProvider; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/aspnet.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/aspnet.js new file mode 100644 index 0000000000000000000000000000000000000000..7eccd66d741429c01cf3f5fff2a2bb1b7e412a46 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/aspnet.js @@ -0,0 +1,4 @@ +/// BUNDLER_PARTS +/* Utilities for integration with ASP.NET */ +/* DevExpress.aspnet = require("../../../aspnet"); */ +/// BUNDLER_PARTS_END diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/core.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/core.js new file mode 100644 index 0000000000000000000000000000000000000000..7e661a37b535d57b64214c145cda83e2cf1bc903 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/core.js @@ -0,0 +1,32 @@ +/// BUNDLER_PARTS + +/* Core (dx.module-core.js) */ +/* eslint-disable import/no-commonjs */ +const DevExpress = require('../../../bundles/modules/core'); + +/* Integrations (dx.module-core.js) */ + +require('../../../integration/jquery'); +require('../../../integration/angular'); +require('../../../integration/knockout'); + +require('../../../localization/globalize/core'); +require('../../../localization/globalize/message'); +require('../../../localization/globalize/number'); +require('../../../localization/globalize/date'); +require('../../../localization/globalize/currency'); + +/* Events (dx.module-core.js) */ + +require('../../../events/click'); +require('../../../events/contextmenu'); +require('../../../events/double_click'); +require('../../../events/drag'); +require('../../../events/hold'); +require('../../../events/hover'); +require('../../../events/pointer'); +require('../../../events/swipe'); +require('../../../events/transform'); +/// BUNDLER_PARTS_END + +module.exports = DevExpress; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/data.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/data.js new file mode 100644 index 0000000000000000000000000000000000000000..76699046df9e3bb5111f16ed12f0f9e38fe22393 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/data.js @@ -0,0 +1,12 @@ +/* eslint-disable import/no-commonjs */ +const DevExpress = require('./core'); + +/// BUNDLER_PARTS +/* Data (dx.module-core.js) */ + +const data = DevExpress.data = require('../../../bundles/modules/data'); + +data.odata = require('../../../bundles/modules/data.odata'); +/// BUNDLER_PARTS_END + +module.exports = data; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/file_management.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/file_management.js new file mode 100644 index 0000000000000000000000000000000000000000..5c3bedbc46c3702d823f2b5a95be8afd1c050c1e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/file_management.js @@ -0,0 +1,12 @@ +/* eslint-disable import/no-commonjs */ +import DevExpress from './core'; + +/// BUNDLER_PARTS +/* fileManagement (dx.module-core.js) */ + +const fileManagement = require('../../../bundles/modules/file_management'); +DevExpress.fileManagement = fileManagement; + +/// BUNDLER_PARTS_END + +module.exports = fileManagement; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/viz.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/viz.js new file mode 100644 index 0000000000000000000000000000000000000000..0c94a4b4985eb1c4070b07d232d002515ec6f5fb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/viz.js @@ -0,0 +1,71 @@ +/* eslint-disable import/no-commonjs */ +const DevExpress = require('./core'); +require('./data'); + +/// BUNDLER_PARTS +/* Viz core (dx.module-viz-core.js) */ + +const viz = DevExpress.viz = require('../../../bundles/modules/viz'); +viz.currentTheme = require('../../../viz/themes').currentTheme; +viz.registerTheme = require('../../../viz/themes').registerTheme; +viz.exportFromMarkup = require('../../../viz/export').exportFromMarkup; +viz.getMarkup = require('../../../viz/export').getMarkup; +viz.exportWidgets = require('../../../viz/export').exportWidgets; +viz.currentPalette = require('../../../viz/palette').currentPalette; +viz.getPalette = require('../../../viz/palette').getPalette; +viz.generateColors = require('../../../viz/palette').generateColors; +viz.registerPalette = require('../../../viz/palette').registerPalette; +viz.refreshTheme = require('../../../viz/themes').refreshTheme; + +/* Charts (dx.module-viz-charts.js) */ +viz.dxChart = require('../../../viz/chart'); +viz.dxPieChart = require('../../../viz/pie_chart'); +viz.dxPolarChart = require('../../../viz/polar_chart'); + +/* Gauges (dx.module-viz-gauges.js) */ +viz.dxLinearGauge = require('../../../viz/linear_gauge'); +viz.dxCircularGauge = require('../../../viz/circular_gauge'); +viz.dxBarGauge = require('../../../viz/bar_gauge'); + +/* Range selector (dx.module-viz-rangeselector.js) */ +viz.dxRangeSelector = require('../../../viz/range_selector'); + +/* Vector map (dx.module-viz-vectormap.js) */ +viz.dxVectorMap = require('../../../viz/vector_map'); +viz.map = {}; +viz.map.sources = {}; +viz.map.projection = require('../../../viz/vector_map/projection').projection; + +/* Sparklines (dx.module-viz-sparklines.js) */ +viz.dxSparkline = require('../../../viz/sparkline'); +viz.dxBullet = require('../../../viz/bullet'); + +/* Treemap */ +viz.dxTreeMap = require('../../../viz/tree_map'); + +/* Funnel */ +viz.dxFunnel = require('../../../viz/funnel'); + +/* Sankey */ +viz.dxSankey = require('../../../viz/sankey'); + +/// BUNDLER_PARTS_END + +viz.BaseWidget = require('../../../viz/core/base_widget'); + +viz.getTheme = require('../../../viz/themes').getTheme; +// Keep it for backward compatibility after renaming findTheme to getTheme +viz.findTheme = require('../../../viz/themes').getTheme; +// We need to keep this method as we suggested it to users +viz.refreshAll = require('../../../viz/themes').refreshTheme; + +viz.refreshPaths = require('../../../viz/utils').refreshPaths; + +viz.gauges = { __internals: {} }; + +viz._dashboard = {}; +viz._dashboard.Renderer = require('../../../viz/core/renderers/renderer').Renderer; +viz._dashboard.SvgElement = require('../../../viz/core/renderers/renderer').SvgElement; +viz._dashboard.patchFontOptions = require('../../../viz/core/utils').patchFontOptions; + +module.exports = viz; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-all.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-all.js new file mode 100644 index 0000000000000000000000000000000000000000..0f145acc785cd18e1625c0fb376ec8b15c39ab36 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-all.js @@ -0,0 +1,2 @@ +import './widgets-mobile'; +import './widgets-web'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-base.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-base.js new file mode 100644 index 0000000000000000000000000000000000000000..8584c7c93c4a0ebfa91e2dcb472035b77f40a675 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-base.js @@ -0,0 +1,92 @@ +/* eslint-disable import/no-commonjs */ +const DevExpress = require('./core'); +require('./data'); +require('./file_management'); + +/// BUNDLER_PARTS +/* UI core (dx.module-core.js) */ + +const ui = DevExpress.ui = require('../../../bundles/modules/ui'); + +ui.themes = require('../../../ui/themes'); + +// deprecated +ui.setTemplateEngine = require('../../../core/templates/template_engine_registry').setTemplateEngine; + +ui.dialog = require('../../../ui/dialog'); +ui.notify = require('../../../ui/notify'); +ui.repaintFloatingActionButton = require('../../../ui/speed_dial_action/repaint_floating_action_button'); + +/* Base widgets (dx.module-widgets-base.js) */ + +ui.dxActionSheet = require('../../../ui/action_sheet'); +ui.dxAutocomplete = require('../../../ui/autocomplete'); +ui.dxBox = require('../../../ui/box'); +ui.dxButton = require('../../../ui/button'); +ui.dxDropDownButton = require('../../../ui/drop_down_button'); +ui.dxButtonGroup = require('../../../ui/button_group'); +ui.dxCalendar = require('../../../ui/calendar'); +ui.dxCheckBox = require('../../../ui/check_box'); +ui.dxColorBox = require('../../../ui/color_box'); +ui.dxDateBox = require('../../../ui/date_box'); +ui.dxDrawer = require('../../../ui/drawer'); +ui.dxDeferRendering = require('../../../ui/defer_rendering'); +ui.dxDropDownBox = require('../../../ui/drop_down_box'); +ui.dxDropDownMenu = require('../../../ui/drop_down_menu'); +ui.dxFileUploader = require('../../../ui/file_uploader'); +ui.dxForm = require('../../../ui/form'); +ui.dxGallery = require('../../../ui/gallery'); +ui.dxHtmlEditor = require('../../../ui/html_editor'); +ui.dxList = require('../../../ui/list'); +ui.dxLoadIndicator = require('../../../ui/load_indicator'); +ui.dxLoadPanel = require('../../../ui/load_panel'); +ui.dxLookup = require('../../../ui/lookup'); +ui.dxMap = require('../../../ui/map'); +ui.dxMultiView = require('../../../ui/multi_view'); +ui.dxNavBar = require('../../../ui/nav_bar'); +ui.dxNumberBox = require('../../../ui/number_box'); +ui.dxOverlay = require('../../../ui/overlay/ui.overlay'); +ui.dxPopover = require('../../../ui/popover'); +ui.dxPopup = require('../../../ui/popup'); +ui.dxProgressBar = require('../../../ui/progress_bar'); +ui.dxRadioGroup = require('../../../ui/radio_group'); +ui.dxRangeSlider = require('../../../ui/range_slider'); +ui.dxResizable = require('../../../ui/resizable'); +ui.dxResponsiveBox = require('../../../ui/responsive_box'); +ui.dxScrollView = require('../../../ui/scroll_view'); +ui.dxSelectBox = require('../../../ui/select_box'); +ui.dxSlider = require('../../../ui/slider'); +ui.dxSpeedDialAction = require('../../../ui/speed_dial_action'); +ui.dxSwitch = require('../../../ui/switch'); +ui.dxTabPanel = require('../../../ui/tab_panel'); +ui.dxTabs = require('../../../ui/tabs'); +ui.dxTagBox = require('../../../ui/tag_box'); +ui.dxTextArea = require('../../../ui/text_area'); +ui.dxTextBox = require('../../../ui/text_box'); +ui.dxTileView = require('../../../ui/tile_view'); +ui.dxToast = require('../../../ui/toast'); +ui.dxToolbar = require('../../../ui/toolbar'); +ui.dxTooltip = require('../../../ui/tooltip'); +ui.dxTrackBar = require('../../../ui/track_bar'); +ui.dxDraggable = require('../../../ui/draggable'); +ui.dxSortable = require('../../../ui/sortable'); + +/* Validation (dx.module-widgets-base.js) */ + +DevExpress.validationEngine = require('../../../ui/validation_engine'); +ui.dxValidationSummary = require('../../../ui/validation_summary'); +ui.dxValidationGroup = require('../../../ui/validation_group'); +ui.dxValidator = require('../../../ui/validator'); + +/* Widget parts */ +require('../../../ui/html_editor/converters/markdown'); +/// BUNDLER_PARTS_END + +// Dashboards +ui.CollectionWidget = require('../../../ui/collection/ui.collection_widget.edit'); +// Dashboards + +// Reports +ui.dxDropDownEditor = require('../../../ui/drop_down_editor/ui.drop_down_editor'); +// Reports +module.exports = ui; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-mobile.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-mobile.js new file mode 100644 index 0000000000000000000000000000000000000000..62a40d59fb88173564a6cbc5279edf9603a11538 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-mobile.js @@ -0,0 +1,9 @@ +/* eslint-disable import/no-commonjs */ +const ui = require('./widgets-base'); + +/// BUNDLER_PARTS +/* Mobile widgets (dx.module-widgets-mobile.js) */ + +ui.dxSlideOut = require('../../../ui/slide_out'); +ui.dxSlideOutView = require('../../../ui/slide_out_view'); +/// BUNDLER_PARTS_END diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-web.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-web.js new file mode 100644 index 0000000000000000000000000000000000000000..e8d6d70fd6813f2d04c627a5c4fe35ea7e5125b6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/parts/widgets-web.js @@ -0,0 +1,23 @@ +/* eslint-disable import/no-commonjs */ +const data = require('./data'); +const ui = require('./widgets-base'); + +/// BUNDLER_PARTS +/* Web widgets (dx.module-widgets-web.js) */ + +ui.dxAccordion = require('../../../ui/accordion'); +ui.dxContextMenu = require('../../../ui/context_menu'); +ui.dxDataGrid = require('../../../ui/data_grid'); +ui.dxTreeList = require('../../../ui/tree_list'); +ui.dxMenu = require('../../../ui/menu'); +ui.dxPivotGrid = require('../../../ui/pivot_grid'); +ui.dxPivotGridFieldChooser = require('../../../ui/pivot_grid_field_chooser'); +data.PivotGridDataSource = require('../../../ui/pivot_grid/data_source'); +data.XmlaStore = require('../../../ui/pivot_grid/xmla_store'); +ui.dxScheduler = require('../../../ui/scheduler'); +ui.dxTreeView = require('../../../ui/tree_view'); +ui.dxFilterBuilder = require('../../../ui/filter_builder'); +ui.dxFileManager = require('../../../ui/file_manager'); +ui.dxDiagram = require('../../../ui/diagram'); +ui.dxGantt = require('../../../ui/gantt'); +/// BUNDLER_PARTS_END diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/renovation.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/renovation.js new file mode 100644 index 0000000000000000000000000000000000000000..2dcf513de8dbaeacd7f3d43894198e7482d009f9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/renovation.js @@ -0,0 +1,5 @@ +/* global DevExpress */ +/* eslint-disable import/no-commonjs */ +import './core'; + +module.exports = DevExpress.renovation = {}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/ui.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/ui.js new file mode 100644 index 0000000000000000000000000000000000000000..58a7926d4b8ad84b8a62ed77de11a073204ba851 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/ui.js @@ -0,0 +1,5 @@ +/* global DevExpress */ +/* eslint-disable import/no-commonjs */ +import './core'; + +module.exports = DevExpress.ui = {}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/viz.js b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/viz.js new file mode 100644 index 0000000000000000000000000000000000000000..beecd8cef44e229a4c58be55c051528f5fc87813 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/bundles/modules/viz.js @@ -0,0 +1,5 @@ +/* global DevExpress */ +/* eslint-disable import/no-commonjs */ +import './core'; + +module.exports = DevExpress.viz = DevExpress.viz || {}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/color.js b/packages/f-theme-editor/farris-theme-editor/js/color.js new file mode 100644 index 0000000000000000000000000000000000000000..6454719dcc61259cf908de21d73ab51ec53175a2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/color.js @@ -0,0 +1,553 @@ +const standardColorNames = { + 'aliceblue': 'f0f8ff', + 'antiquewhite': 'faebd7', + 'aqua': '00ffff', + 'aquamarine': '7fffd4', + 'azure': 'f0ffff', + 'beige': 'f5f5dc', + 'bisque': 'ffe4c4', + 'black': '000000', + 'blanchedalmond': 'ffebcd', + 'blue': '0000ff', + 'blueviolet': '8a2be2', + 'brown': 'a52a2a', + 'burlywood': 'deb887', + 'cadetblue': '5f9ea0', + 'chartreuse': '7fff00', + 'chocolate': 'd2691e', + 'coral': 'ff7f50', + 'cornflowerblue': '6495ed', + 'cornsilk': 'fff8dc', + 'crimson': 'dc143c', + 'cyan': '00ffff', + 'darkblue': '00008b', + 'darkcyan': '008b8b', + 'darkgoldenrod': 'b8860b', + 'darkgray': 'a9a9a9', + 'darkgreen': '006400', + 'darkgrey': 'a9a9a9', + 'darkkhaki': 'bdb76b', + 'darkmagenta': '8b008b', + 'darkolivegreen': '556b2f', + 'darkorange': 'ff8c00', + 'darkorchid': '9932cc', + 'darkred': '8b0000', + 'darksalmon': 'e9967a', + 'darkseagreen': '8fbc8f', + 'darkslateblue': '483d8b', + 'darkslategray': '2f4f4f', + 'darkslategrey': '2f4f4f', + 'darkturquoise': '00ced1', + 'darkviolet': '9400d3', + 'deeppink': 'ff1493', + 'deepskyblue': '00bfff', + 'dimgray': '696969', + 'dimgrey': '696969', + 'dodgerblue': '1e90ff', + 'feldspar': 'd19275', + 'firebrick': 'b22222', + 'floralwhite': 'fffaf0', + 'forestgreen': '228b22', + 'fuchsia': 'ff00ff', + 'gainsboro': 'dcdcdc', + 'ghostwhite': 'f8f8ff', + 'gold': 'ffd700', + 'goldenrod': 'daa520', + 'gray': '808080', + 'green': '008000', + 'greenyellow': 'adff2f', + 'grey': '808080', + 'honeydew': 'f0fff0', + 'hotpink': 'ff69b4', + 'indianred': 'cd5c5c', + 'indigo': '4b0082', + 'ivory': 'fffff0', + 'khaki': 'f0e68c', + 'lavender': 'e6e6fa', + 'lavenderblush': 'fff0f5', + 'lawngreen': '7cfc00', + 'lemonchiffon': 'fffacd', + 'lightblue': 'add8e6', + 'lightcoral': 'f08080', + 'lightcyan': 'e0ffff', + 'lightgoldenrodyellow': 'fafad2', + 'lightgray': 'd3d3d3', + 'lightgreen': '90ee90', + 'lightgrey': 'd3d3d3', + 'lightpink': 'ffb6c1', + 'lightsalmon': 'ffa07a', + 'lightseagreen': '20b2aa', + 'lightskyblue': '87cefa', + 'lightslateblue': '8470ff', + 'lightslategray': '778899', + 'lightslategrey': '778899', + 'lightsteelblue': 'b0c4de', + 'lightyellow': 'ffffe0', + 'lime': '00ff00', + 'limegreen': '32cd32', + 'linen': 'faf0e6', + 'magenta': 'ff00ff', + 'maroon': '800000', + 'mediumaquamarine': '66cdaa', + 'mediumblue': '0000cd', + 'mediumorchid': 'ba55d3', + 'mediumpurple': '9370d8', + 'mediumseagreen': '3cb371', + 'mediumslateblue': '7b68ee', + 'mediumspringgreen': '00fa9a', + 'mediumturquoise': '48d1cc', + 'mediumvioletred': 'c71585', + 'midnightblue': '191970', + 'mintcream': 'f5fffa', + 'mistyrose': 'ffe4e1', + 'moccasin': 'ffe4b5', + 'navajowhite': 'ffdead', + 'navy': '000080', + 'oldlace': 'fdf5e6', + 'olive': '808000', + 'olivedrab': '6b8e23', + 'orange': 'ffa500', + 'orangered': 'ff4500', + 'orchid': 'da70d6', + 'palegoldenrod': 'eee8aa', + 'palegreen': '98fb98', + 'paleturquoise': 'afeeee', + 'palevioletred': 'd87093', + 'papayawhip': 'ffefd5', + 'peachpuff': 'ffdab9', + 'peru': 'cd853f', + 'pink': 'ffc0cb', + 'plum': 'dda0dd', + 'powderblue': 'b0e0e6', + 'purple': '800080', + 'rebeccapurple': '663399', + 'red': 'ff0000', + 'rosybrown': 'bc8f8f', + 'royalblue': '4169e1', + 'saddlebrown': '8b4513', + 'salmon': 'fa8072', + 'sandybrown': 'f4a460', + 'seagreen': '2e8b57', + 'seashell': 'fff5ee', + 'sienna': 'a0522d', + 'silver': 'c0c0c0', + 'skyblue': '87ceeb', + 'slateblue': '6a5acd', + 'slategray': '708090', + 'slategrey': '708090', + 'snow': 'fffafa', + 'springgreen': '00ff7f', + 'steelblue': '4682b4', + 'tan': 'd2b48c', + 'teal': '008080', + 'thistle': 'd8bfd8', + 'tomato': 'ff6347', + 'turquoise': '40e0d0', + 'violet': 'ee82ee', + 'violetred': 'd02090', + 'wheat': 'f5deb3', + 'white': 'ffffff', + 'whitesmoke': 'f5f5f5', + 'yellow': 'ffff00', + 'yellowgreen': '9acd32' +}; + + +// array of color definition objects +const standardColorTypes = [ + { + re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + process: function(colorString) { + return [ + parseInt(colorString[1], 10), + parseInt(colorString[2], 10), + parseInt(colorString[3], 10) + ]; + } + }, + { + re: /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*\.*\d+)\)$/, + process: function(colorString) { + return [ + parseInt(colorString[1], 10), + parseInt(colorString[2], 10), + parseInt(colorString[3], 10), + parseFloat(colorString[4]) + ]; + } + }, + { + re: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/, + process: function(colorString) { + return [ + parseInt(colorString[1], 16), + parseInt(colorString[2], 16), + parseInt(colorString[3], 16) + ]; + } + }, + { + re: /^#([a-f0-9]{1})([a-f0-9]{1})([a-f0-9]{1})$/, + process: function(colorString) { + return [ + parseInt(colorString[1] + colorString[1], 16), + parseInt(colorString[2] + colorString[2], 16), + parseInt(colorString[3] + colorString[3], 16) + ]; + } + }, + { + re: /^hsv\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + process: function(colorString) { + const h = parseInt(colorString[1], 10); + const s = parseInt(colorString[2], 10); + const v = parseInt(colorString[3], 10); + const rgb = hsvToRgb(h, s, v); + + return [ + rgb[0], + rgb[1], + rgb[2], + 1, + [h, s, v] + ]; + } + }, + { + re: /^hsl\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + process: function(colorString) { + const h = parseInt(colorString[1], 10); + const s = parseInt(colorString[2], 10); + const l = parseInt(colorString[3], 10); + const rgb = hslToRgb(h, s, l); + + return [ + rgb[0], + rgb[1], + rgb[2], + 1, + null, + [h, s, l] + ]; + } + } +]; + +const _round = Math.round; + +function Color(value) { + this.baseColor = value; + let color; + if(value) { + color = String(value).toLowerCase().replace(/ /g, ''); + color = standardColorNames[color] ? '#' + standardColorNames[color] : color; + color = parseColor(color); + } + if(!color) { + this.colorIsInvalid = true; + } + + color = color || {}; + this.r = normalize(color[0]); + this.g = normalize(color[1]); + this.b = normalize(color[2]); + this.a = normalize(color[3], 1, 1); + if(color[4]) { + this.hsv = { h: color[4][0], s: color[4][1], v: color[4][2] }; + } else { + this.hsv = toHsvFromRgb(this.r, this.g, this.b); + } + if(color[5]) { + this.hsl = { h: color[5][0], s: color[5][1], l: color[5][2] }; + } else { + this.hsl = toHslFromRgb(this.r, this.g, this.b); + } +} + +function parseColor(color) { + if(color === 'transparent') { + return [0, 0, 0, 0]; + } + + let i = 0; + const ii = standardColorTypes.length; + let str; + for(; i < ii; ++i) { + str = standardColorTypes[i].re.exec(color); + if(str) { + return standardColorTypes[i].process(str); + } + } + return null; +} + +function normalize(colorComponent, def, max) { + def = def || 0; + max = max || 255; + return (colorComponent < 0 || isNaN(colorComponent)) ? def : ((colorComponent > max) ? max : colorComponent); +} + +function toHexFromRgb(r, g, b) { + return '#' + (0X01000000 | (r << 16) | (g << 8) | b).toString(16).slice(1); +} + +function toHsvFromRgb(r, g, b) { + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const delta = max - min; + let H; + let S; + let V = max; + S = (max === 0 ? 0 : 1 - min / max); + + if(max === min) { + H = 0; + } else { + switch(max) { + case r: + H = 60 * ((g - b) / delta); + if(g < b) { + H = H + 360; + } + break; + case g: + H = 60 * ((b - r) / delta) + 120; + break; + case b: + H = 60 * ((r - g) / delta) + 240; + break; + } + } + + S *= 100; + V *= 100 / 255; + + return { + h: Math.round(H), + s: Math.round(S), + v: Math.round(V) + }; +} + +function hsvToRgb(h, s, v) { + const index = Math.floor((h % 360) / 60); + const vMin = ((100 - s) * v) / 100; + const a = (v - vMin) * ((h % 60) / 60); + const vInc = vMin + a; + const vDec = v - a; + + let r; + let g; + let b; + + switch(index) { + /* eslint-disable no-multi-spaces */ + case 0: r = v; g = vInc; b = vMin; break; + case 1: r = vDec; g = v; b = vMin; break; + case 2: r = vMin; g = v; b = vInc; break; + case 3: r = vMin; g = vDec; b = v; break; + case 4: r = vInc; g = vMin; b = v; break; + case 5: r = v; g = vMin; b = vDec; break; + /* eslint-enable no-multi-spaces */ + } + + return [Math.round(r * 2.55), Math.round(g * 2.55), Math.round(b * 2.55)]; +} + +function calculateHue(r, g, b, delta) { + const max = Math.max(r, g, b); + switch(max) { + case r: + return (g - b) / delta + (g < b ? 6 : 0); + case g: + return (b - r) / delta + 2; + case b: + return (r - g) / delta + 4; + } +} + +function toHslFromRgb(r, g, b) { + r = convertTo01Bounds(r, 255); + g = convertTo01Bounds(g, 255); + b = convertTo01Bounds(b, 255); + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const maxMinSum = max + min; + let h; + let s; + const l = maxMinSum / 2; + + if(max === min) { + h = s = 0; + } else { + const delta = max - min; + + if(l > 0.5) { + s = delta / (2 - maxMinSum); + } else { + s = delta / maxMinSum; + } + + h = calculateHue(r, g, b, delta); + h /= 6; + } + + return { h: _round(h * 360), s: _round(s * 100), l: _round(l * 100) }; +} + +function makeColorTint(colorPart, h) { + let colorTint = h; + if(colorPart === 'r') { + colorTint = h + 1 / 3; + } + if(colorPart === 'b') { + colorTint = h - 1 / 3; + } + + return colorTint; +} + +function modifyColorTint(colorTint) { + if(colorTint < 0) { + colorTint += 1; + } + if(colorTint > 1) { + colorTint -= 1; + } + + return colorTint; +} + +function hueToRgb(p, q, colorTint) { + colorTint = modifyColorTint(colorTint); + if(colorTint < 1 / 6) { + return p + (q - p) * 6 * colorTint; + } + if(colorTint < 1 / 2) { + return q; + } + if(colorTint < 2 / 3) { + return p + (q - p) * (2 / 3 - colorTint) * 6; + } + return p; +} + +function hslToRgb(h, s, l) { + let r; + let g; + let b; + + h = convertTo01Bounds(h, 360); + s = convertTo01Bounds(s, 100); + l = convertTo01Bounds(l, 100); + + if(s === 0) { + r = g = b = l; + } else { + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + r = hueToRgb(p, q, makeColorTint('r', h)); + g = hueToRgb(p, q, makeColorTint('g', h)); + b = hueToRgb(p, q, makeColorTint('b', h)); + } + + return [_round(r * 255), _round(g * 255), _round(b * 255)]; +} + +function convertTo01Bounds(n, max) { + n = Math.min(max, Math.max(0, parseFloat(n))); + if((Math.abs(n - max) < 0.000001)) { + return 1; + } + return (n % max) / parseFloat(max); +} + +function isIntegerBetweenMinAndMax(number, min, max) { + min = min || 0; + max = max || 255; + + if(number % 1 !== 0 || + number < min || + number > max || + typeof number !== 'number' || + isNaN(number)) { + return false; + } + + return true; +} + +Color.prototype = { + constructor: Color, + + highlight: function(step) { + step = step || 10; + return this.alter(step).toHex(); + + }, + + darken: function(step) { + step = step || 10; + return this.alter(-step).toHex(); + }, + + alter: function(step) { + const result = new Color(); + result.r = normalize(this.r + step); + result.g = normalize(this.g + step); + result.b = normalize(this.b + step); + return result; + }, + + blend: function(blendColor, opacity) { + const other = blendColor instanceof Color ? blendColor : new Color(blendColor); + const result = new Color(); + result.r = normalize(_round(this.r * (1 - opacity) + other.r * opacity)); + result.g = normalize(_round(this.g * (1 - opacity) + other.g * opacity)); + result.b = normalize(_round(this.b * (1 - opacity) + other.b * opacity)); + return result; + }, + + toHex: function() { + return toHexFromRgb(this.r, this.g, this.b); + }, + + getPureColor: function() { + const rgb = hsvToRgb(this.hsv.h, 100, 100); + return new Color('rgb(' + rgb.join(',') + ')'); + }, + + isValidHex: function(hex) { + return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex); + }, + + isValidRGB: function(r, g, b) { + if(!isIntegerBetweenMinAndMax(r) || !isIntegerBetweenMinAndMax(g) || !isIntegerBetweenMinAndMax(b)) { + return false; + } + return true; + }, + + isValidAlpha: function(a) { + if(isNaN(a) || a < 0 || a > 1 || typeof a !== 'number') { + return false; + } + return true; + }, + + colorIsInvalid: false, + + fromHSL: function(hsl) { + const color = new Color(); + const rgb = hslToRgb(hsl.h, hsl.s, hsl.l); + + color.r = rgb[0]; + color.g = rgb[1]; + color.b = rgb[2]; + + return color; + } +}; + +export default Color; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/action.js b/packages/f-theme-editor/farris-theme-editor/js/core/action.js new file mode 100644 index 0000000000000000000000000000000000000000..1f9ad111ab4645be00b1a4b2f61923590935f147 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/action.js @@ -0,0 +1,154 @@ +import $ from './renderer'; +import { getWindow } from './utils/window'; +import { isPlainObject, isFunction } from './utils/type'; +import { each } from './utils/iterator'; + +export default class Action { + constructor(action, config) { + config = config || {}; + this._action = action; + this._context = config.context || getWindow(); + this._beforeExecute = config.beforeExecute; + this._afterExecute = config.afterExecute; + this._component = config.component; + this._validatingTargetName = config.validatingTargetName; + const excludeValidators = this._excludeValidators = {}; + + if(config.excludeValidators) { + for(let i = 0; i < config.excludeValidators.length; i++) { + excludeValidators[config.excludeValidators[i]] = true; + } + } + } + + execute() { + const e = { + action: this._action, + args: Array.prototype.slice.call(arguments), + context: this._context, + component: this._component, + validatingTargetName: this._validatingTargetName, + cancel: false, + handled: false + }; + + const beforeExecute = this._beforeExecute; + const afterExecute = this._afterExecute; + + const argsBag = e.args[0] || {}; + + if(!this._validateAction(e)) { + return; + } + + beforeExecute?.call(this._context, e); + + if(e.cancel) { + return; + } + + const result = this._executeAction(e); + + if(argsBag.cancel) { + return; + } + + afterExecute?.call(this._context, e); + + return result; + } + + _validateAction(e) { + const excludeValidators = this._excludeValidators; + const { executors } = Action; + + for(const name in executors) { + if(!excludeValidators[name]) { + const executor = executors[name]; + executor.validate?.(e); + + if(e.cancel) { + return false; + } + } + } + + return true; + } + + _executeAction(e) { + let result; + const { executors } = Action; + + for(const name in executors) { + const executor = executors[name]; + executor.execute?.(e); + + if(e.handled) { + result = e.result; + break; + } + } + + return result; + } + + static registerExecutor(name, executor) { + if(isPlainObject(name)) { + each(name, Action.registerExecutor); + return; + } + Action.executors[name] = executor; + } + + static unregisterExecutor(...args) { + each(args, function() { + delete Action.executors[this]; + }); + } +} + +Action.executors = {}; + +const createValidatorByTargetElement = (condition) => (e) => { + if(!e.args.length) { + return; + } + + const args = e.args[0]; + const element = args[e.validatingTargetName] || args.element; + + if(element && condition($(element))) { + e.cancel = true; + } +}; + +Action.registerExecutor({ + 'disabled': { + validate: createValidatorByTargetElement(($target) => + $target.is('.dx-state-disabled, .dx-state-disabled *') + ) + }, + + 'readOnly': { + validate: createValidatorByTargetElement(($target) => + $target.is('.dx-state-readonly, .dx-state-readonly *:not(.dx-state-independent)') + ) + }, + 'undefined': { + execute: (e) => { + if(!e.action) { + e.result = undefined; + e.handled = true; + } + } + }, + 'func': { + execute: (e) => { + if(isFunction(e.action)) { + e.result = e.action.call(e.context, e.args[0]); + e.handled = true; + } + } + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/class.js b/packages/f-theme-editor/farris-theme-editor/js/core/class.js new file mode 100644 index 0000000000000000000000000000000000000000..cedc3fa81cf1149813daccbda0db9b3de3fae54b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/class.js @@ -0,0 +1,170 @@ +import errors from './errors'; +import { isWindow } from './utils/type'; + +const wrapOverridden = function(baseProto, methodName, method) { + return function() { + const prevCallBase = this.callBase; + this.callBase = baseProto[methodName]; + try { + return method.apply(this, arguments); + } finally { + this.callBase = prevCallBase; + } + }; +}; + +const clonePrototype = function(obj) { + const func = function() { }; + func.prototype = obj.prototype; + return new func(); +}; + +const redefine = function(members) { + const that = this; + let overridden; + let memberName; + let member; + + if(!members) { + return that; + } + + for(memberName in members) { + member = members[memberName]; + overridden = typeof that.prototype[memberName] === 'function' && typeof member === 'function'; + that.prototype[memberName] = overridden ? wrapOverridden(that.parent.prototype, memberName, member) : member; + } + + return that; +}; + +const include = function() { + const classObj = this; + let argument; + let name; + let i; + + // NOTE: For ES6 classes. They don't have _includedCtors/_includedPostCtors + // properties and get them from the ancestor class. + const hasClassObjOwnProperty = Object.prototype.hasOwnProperty.bind(classObj); + const isES6Class = !hasClassObjOwnProperty('_includedCtors') && !hasClassObjOwnProperty('_includedPostCtors'); + + if(isES6Class) { + classObj._includedCtors = classObj._includedCtors.slice(0); + classObj._includedPostCtors = classObj._includedPostCtors.slice(0); + } + + for(i = 0; i < arguments.length; i++) { + argument = arguments[i]; + if(argument.ctor) { + classObj._includedCtors.push(argument.ctor); + } + if(argument.postCtor) { + classObj._includedPostCtors.push(argument.postCtor); + } + + for(name in argument) { + if(name === 'ctor' || name === 'postCtor' || name === 'default') { + continue; + } + ///#DEBUG + if(name in classObj.prototype) { + throw errors.Error('E0002', name); + } + ///#ENDDEBUG + classObj.prototype[name] = argument[name]; + } + } + + return classObj; +}; + +const subclassOf = function(parentClass) { + const hasParentProperty = Object.prototype.hasOwnProperty.bind(this)('parent'); + const isES6Class = !hasParentProperty && this.parent; + + if(isES6Class) { + const baseClass = Object.getPrototypeOf(this); + + return baseClass === parentClass || baseClass.subclassOf(parentClass); + } else { + if(this.parent === parentClass) { + return true; + } + + if(!this.parent || !this.parent.subclassOf) { + return false; + } + + return this.parent.subclassOf(parentClass); + } +}; + +const abstract = function() { + throw errors.Error('E0001'); +}; + +const copyStatic = (function() { + const hasOwn = Object.prototype.hasOwnProperty; + + return function(source, destination) { + for(const key in source) { + if(!hasOwn.call(source, key)) { + return; + } + + destination[key] = source[key]; + } + }; +})(); + +const classImpl = function() { }; + +classImpl.inherit = function(members) { + const inheritor = function() { + if(!this || isWindow(this) || typeof this.constructor !== 'function') { + throw errors.Error('E0003'); + } + + const instance = this; + const ctor = instance.ctor; + const includedCtors = instance.constructor._includedCtors; + const includedPostCtors = instance.constructor._includedPostCtors; + let i; + + for(i = 0; i < includedCtors.length; i++) { + includedCtors[i].call(instance); + } + + if(ctor) { + ctor.apply(instance, arguments); + } + + for(i = 0; i < includedPostCtors.length; i++) { + includedPostCtors[i].call(instance); + } + }; + + inheritor.prototype = clonePrototype(this); + + copyStatic(this, inheritor); + + inheritor.inherit = this.inherit; + inheritor.abstract = abstract; + inheritor.redefine = redefine; + inheritor.include = include; + inheritor.subclassOf = subclassOf; + + inheritor.parent = this; + inheritor._includedCtors = this._includedCtors ? this._includedCtors.slice(0) : []; + inheritor._includedPostCtors = this._includedPostCtors ? this._includedPostCtors.slice(0) : []; + inheritor.prototype.constructor = inheritor; + + inheritor.redefine(members); + + return inheritor; +}; + +classImpl.abstract = abstract; + +export default classImpl; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/component.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/component.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..07c6cd5318b13cfe1e290604d85c4685f13f5f8b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/component.d.ts @@ -0,0 +1,124 @@ +/** @namespace DevExpress */ +export interface ComponentOptions { + /** + * @docid + * @type_function_param1 e:object + * @type_function_param1_field1 component:this + * @default null + * @action + * @public + */ + onDisposing?: ((e: TDisposingEvent) => void); + /** + * @docid + * @type_function_param1 e:object + * @type_function_param1_field1 component:this + * @type_function_param1_field2 element:DxElement + * @default null + * @action + * @public + */ + onInitialized?: ((e: TInitializedEvent) => void); + /** + * @docid + * @type_function_param1 e:object + * @type_function_param1_field1 component:this + * @type_function_param1_field2 name:string + * @type_function_param1_field3 fullName:string + * @type_function_param1_field4 value:any + * @default null + * @action + * @public + */ + onOptionChanged?: ((e: TOptionChangedEvent) => void); +} +/** + * @docid Component + * @namespace DevExpress + * @hidden + * @wrappable + */ +export class Component { + constructor(options?: TProperties); + /** + * @docid + * @publicName beginUpdate() + * @public + */ + beginUpdate(): void; + /** + * @docid + * @publicName endUpdate() + * @public + */ + endUpdate(): void; + /** + * @docid + * @publicName instance() + * @return this + * @public + */ + instance(): this; + /** + * @docid + * @publicName off(eventName) + * @return this + * @public + */ + off(eventName: string): this; + /** + * @docid + * @publicName off(eventName, eventHandler) + * @return this + * @public + */ + off(eventName: string, eventHandler: Function): this; + /** + * @docid + * @publicName on(eventName, eventHandler) + * @return this + * @public + */ + on(eventName: string, eventHandler: Function): this; + /** + * @docid + * @publicName on(events) + * @return this + * @public + */ + on(events: { [key: string]: Function }): this; + /** + * @docid + * @publicName option() + * @return object + * @public + */ + option(): TProperties; + /** + * @docid + * @publicName option(optionName) + * @param1 optionName:string + * @public + */ + option(optionName: TPropertyName): TPropertyName extends (keyof TProperties) ? TProperties[TPropertyName] : TValue; + /** + * @docid + * @publicName option(optionName, optionValue) + * @param1 optionName:string + * @public + */ + option(optionName: TPropertyName, optionValue: TPropertyName extends keyof TProperties ? TProperties[TPropertyName] : TValue): void; + /** + * @docid + * @publicName option(options) + * @param1 options:object + * @public + */ + option(options: Partial): void; + /** + * @docid + * @publicName resetOption(optionName) + * @public + */ + resetOption(optionName: string): void; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/component.js b/packages/f-theme-editor/farris-theme-editor/js/core/component.js new file mode 100644 index 0000000000000000000000000000000000000000..3244dbf34c580c5ec513492ae59030e25ffa3373 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/component.js @@ -0,0 +1,392 @@ +import Config from './config'; +import { extend } from './utils/extend'; +import { Options } from './options/index'; +import { convertRulesToOptions } from './options/utils'; +import Class from './class'; +import Action from './action'; +import errors from './errors'; +import Callbacks from './utils/callbacks'; +import { EventsStrategy } from './events_strategy'; +import { name as publicComponentName } from './utils/public_component'; +import { PostponedOperations } from './postponed_operations'; +import { isFunction, isPlainObject, isDefined } from './utils/type'; +import { noop } from './utils/common'; +import { getPathParts } from './utils/data'; + +const getEventName = (actionName) => { + return actionName.charAt(2).toLowerCase() + actionName.substr(3); +}; + +const isInnerOption = (optionName) => { + return optionName.indexOf('_', 0) === 0; +}; + +export const Component = Class.inherit({ + _setDeprecatedOptions() { + this._deprecatedOptions = {}; + }, + + _getDeprecatedOptions() { + return this._deprecatedOptions; + }, + + _getDefaultOptions() { + return { + onInitialized: null, + onOptionChanged: null, + onDisposing: null, + + defaultOptionsRules: null + }; + }, + + _defaultOptionsRules() { + return []; + }, + + _setOptionsByDevice(rules) { + this._options.applyRules(rules); + }, + + _convertRulesToOptions(rules) { + return convertRulesToOptions(rules); + }, + + _isInitialOptionValue(name) { + return this._options.isInitial(name); + }, + + _setOptionsByReference() { + this._optionsByReference = {}; + }, + + _getOptionsByReference() { + return this._optionsByReference; + }, + /** + * @name Component.ctor + * @publicName ctor(options) + * @param1 options:ComponentOptions|undefined + * @hidden + */ + ctor(options = {}) { + const { _optionChangedCallbacks, _disposingCallbacks } = options; + + this.NAME = publicComponentName(this.constructor); + + this._eventsStrategy = EventsStrategy.create(this, options.eventsStrategy); + + this._updateLockCount = 0; + + this._optionChangedCallbacks = _optionChangedCallbacks || Callbacks(); + this._disposingCallbacks = _disposingCallbacks || Callbacks(); + this.postponedOperations = new PostponedOperations(); + this._createOptions(options); + }, + + _createOptions(options) { + this.beginUpdate(); + + try { + this._setOptionsByReference(); + this._setDeprecatedOptions(); + this._options = new Options( + this._getDefaultOptions(), + this._getDefaultOptions(), + this._getOptionsByReference(), + this._getDeprecatedOptions() + ); + + this._options.onChanging( + (name, previousValue, value) => this._initialized && this._optionChanging(name, previousValue, value)); + this._options.onDeprecated( + (option, info) => this._logDeprecatedOptionWarning(option, info)); + this._options.onChanged( + (name, value, previousValue) => this._notifyOptionChanged(name, value, previousValue)); + this._options.onStartChange(() => this.beginUpdate()); + this._options.onEndChange(() => this.endUpdate()); + this._options.addRules(this._defaultOptionsRules()); + + if(options && options.onInitializing) { + options.onInitializing.apply(this, [options]); + } + + this._setOptionsByDevice(options.defaultOptionsRules); + this._initOptions(options); + } finally { + this.endUpdate(); + } + }, + + _initOptions(options) { + this.option(options); + }, + + _init() { + this._createOptionChangedAction(); + + this.on('disposing', (args) => { + this._disposingCallbacks.fireWith(this, [args]); + }); + }, + + _logDeprecatedOptionWarning(option, info) { + const message = info.message || (`Use the '${info.alias}' option instead`); + errors.log('W0001', this.NAME, option, info.since, message); + }, + + _logDeprecatedComponentWarning(since, alias) { + errors.log('W0000', this.NAME, since, `Use the '${alias}' widget instead`); + }, + + _createOptionChangedAction() { + this._optionChangedAction = this._createActionByOption('onOptionChanged', { excludeValidators: ['disabled', 'readOnly'] }); + }, + + _createDisposingAction() { + this._disposingAction = this._createActionByOption('onDisposing', { excludeValidators: ['disabled', 'readOnly'] }); + }, + + _optionChanged(args) { + switch(args.name) { + case 'onDisposing': + case 'onInitialized': + break; + case 'onOptionChanged': + this._createOptionChangedAction(); + break; + case 'defaultOptionsRules': + break; + } + }, + + _dispose() { + this._optionChangedCallbacks.empty(); + this._createDisposingAction(); + this._disposingAction(); + this._eventsStrategy.dispose(); + this._options.dispose(); + this._disposed = true; + }, + + _lockUpdate() { + this._updateLockCount++; + }, + + _unlockUpdate() { + this._updateLockCount = Math.max(this._updateLockCount - 1, 0); + }, + + // TODO: remake as getter after ES6 refactor + _isUpdateAllowed() { + return this._updateLockCount === 0; + }, + + // TODO: remake as getter after ES6 refactor + _isInitializingRequired() { + return !this._initializing && !this._initialized; + }, + + _commitUpdate() { + this.postponedOperations.callPostponedOperations(); + this._isInitializingRequired() && this._initializeComponent(); + }, + + _initializeComponent() { + this._initializing = true; + + try { + this._init(); + } finally { + this._initializing = false; + this._lockUpdate(); + this._createActionByOption('onInitialized', { excludeValidators: ['disabled', 'readOnly'] })(); + this._unlockUpdate(); + this._initialized = true; + } + }, + + instance() { + return this; + }, + + beginUpdate: function() { + this._lockUpdate(); + }, + + endUpdate: function() { + this._unlockUpdate(); + this._isUpdateAllowed() && this._commitUpdate(); + }, + + _optionChanging: noop, + + _notifyOptionChanged(option, value, previousValue) { + if(this._initialized) { + const optionNames = [option].concat(this._options.getAliasesByName(option)); + for(let i = 0; i < optionNames.length; i++) { + const name = optionNames[i]; + const args = { + name: getPathParts(name)[0], + fullName: name, + value: value, + previousValue: previousValue + }; + + if(!isInnerOption(name)) { + this._optionChangedCallbacks.fireWith(this, [extend(this._defaultActionArgs(), args)]); + this._optionChangedAction(extend({}, args)); + } + + if(!this._disposed && this._cancelOptionChange !== name) { + this._optionChanged(args); + } + } + } + }, + + initialOption(name) { + return this._options.initial(name); + }, + + _defaultActionConfig() { + return { + context: this, + component: this + }; + }, + + _defaultActionArgs() { + return { + component: this + }; + }, + + _createAction(actionSource, config) { + let action; + + return (e) => { + if(!isDefined(e)) { + e = {}; + } + + if(!isPlainObject(e)) { + e = { actionValue: e }; + } + + action = action || new Action(actionSource, extend(config, this._defaultActionConfig())); + + return action.execute.call(action, extend(e, this._defaultActionArgs())); + }; + }, + + _createActionByOption(optionName, config) { + let action; + let eventName; + let actionFunc; + + const result = (...args) => { + if(!eventName) { + config = config || {}; + + if(typeof optionName !== 'string') { + throw errors.Error('E0008'); + } + + if(optionName.indexOf('on') === 0) { + eventName = getEventName(optionName); + } + ///#DEBUG + if(optionName.indexOf('on') !== 0) { + throw Error(`The '${optionName}' option name should start with 'on' prefix`); + } + ///#ENDDEBUG + + actionFunc = this.option()[optionName]; + } + + if(!action && !actionFunc && !config.beforeExecute && !config.afterExecute && !this._eventsStrategy.hasEvent(eventName)) { + return; + } + + if(!action) { + const beforeExecute = config.beforeExecute; + config.beforeExecute = (...props) => { + beforeExecute && beforeExecute.apply(this, props); + this._eventsStrategy.fireEvent(eventName, props[0].args); + }; + action = this._createAction(actionFunc, config); + } + + if(Config().wrapActionsBeforeExecute) { + const beforeActionExecute = this.option('beforeActionExecute') || noop; + const wrappedAction = beforeActionExecute(this, action, config) || action; + return wrappedAction.apply(this, args); + } + + return action.apply(this, args); + }; + + if(Config().wrapActionsBeforeExecute) { + return result; + } + + const onActionCreated = this.option('onActionCreated') || noop; + + return onActionCreated(this, result, config) || result; + }, + + on(eventName, eventHandler) { + this._eventsStrategy.on(eventName, eventHandler); + return this; + }, + + off(eventName, eventHandler) { + this._eventsStrategy.off(eventName, eventHandler); + return this; + }, + + hasActionSubscription: function(actionName) { + return !!this._options.silent(actionName) || + this._eventsStrategy.hasEvent(getEventName(actionName)); + }, + + isOptionDeprecated(name) { + return this._options.isDeprecated(name); + }, + + _setOptionWithoutOptionChange(name, value) { + this._cancelOptionChange = name; + this.option(name, value); + this._cancelOptionChange = false; + }, + + _getOptionValue(name, context) { + const value = this.option(name); + + if(isFunction(value)) { + return value.bind(context)(); + } + + return value; + }, + + option(...args) { + return this._options.option(...args); + }, + + resetOption(name) { + this.beginUpdate(); + this._options.reset(name); + this.endUpdate(); + } +}); + +/** + * @name Component + * @module core/component + * @export Component + * @namespace DevExpress + * @hidden + * @wrappable + */ diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c9637a60890d03d26efe91c2ba956b154e704f89 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.d.ts @@ -0,0 +1,27 @@ +import DOMComponent from './dom_component'; +import { UserDefinedElement } from './element'; + +type ComponentFactory = { + new(element: UserDefinedElement, options?: Record): TComponent; + getInstance(element: UserDefinedElement): TComponent; +}; + +/** + * @docid + * @publicName registerComponent(name, componentClass) + * @param2 componentClass:object + * @namespace DevExpress + * @hidden + */ +declare function registerComponent(name: string, componentClass: ComponentFactory): void; + +/** + * @docid + * @publicName registerComponent(name, namespace, componentClass) + * @param3 componentClass:object + * @namespace DevExpress + * @hidden + */ +declare function registerComponent(name: string, namespace: { [key: string]: ComponentFactory }, componentClass: ComponentFactory): void; + +export default registerComponent; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..c16268d492c7ed3189bc9b72e2f198ff449e338c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator.js @@ -0,0 +1,59 @@ +import $ from './renderer'; +import callbacks from './component_registrator_callbacks'; +import errors from './errors'; +import { name as publicComponentName } from './utils/public_component'; + +const registerComponent = function(name, namespace, componentClass) { + if(!componentClass) { + componentClass = namespace; + } else { + namespace[name] = componentClass; + } + + publicComponentName(componentClass, name); + callbacks.fire(name, componentClass); +}; + +const registerRendererComponent = function(name, componentClass) { + $.fn[name] = function(options) { + const isMemberInvoke = typeof options === 'string'; + let result; + + if(isMemberInvoke) { + const memberName = options; + const memberArgs = [].slice.call(arguments).slice(1); + + this.each(function() { + const instance = componentClass.getInstance(this); + + if(!instance) { + throw errors.Error('E0009', name); + } + + const member = instance[memberName]; + const memberValue = member.apply(instance, memberArgs); + + if(result === undefined) { + result = memberValue; + } + }); + } else { + this.each(function() { + const instance = componentClass.getInstance(this); + if(instance) { + instance.option(options); + } else { + new componentClass(this, options); + } + }); + + result = this; + } + + return result; + }; +}; + +callbacks.add(registerRendererComponent); + +export default registerComponent; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator_callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator_callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..8cb226142cdf40bf957c70d3dadbe074b17bcbf9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/component_registrator_callbacks.js @@ -0,0 +1,3 @@ +import MemorizedCallbacks from './memorized_callbacks'; + +export default new MemorizedCallbacks(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/config.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/config.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a113248ee6ecfaaf9ab845ed71b1384a0dafbcb3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/config.d.ts @@ -0,0 +1,137 @@ +import { + PositionConfig, +} from '../animation/position'; + +/** + * @docid + * @publicName config() + * @namespace DevExpress + * @public + */ +declare function config(): globalConfig; + +/** + * @docid + * @publicName config(config) + * @namespace DevExpress + * @public + */ +// eslint-disable-next-line @typescript-eslint/no-shadow +declare function config(config: globalConfig): void; + +/** + * @docid + * @section commonObjectStructures + * @namespace DevExpress + * @type object + */ +export interface globalConfig { + /** + * @docid + * @default "." + * @deprecated + * @public + */ + decimalSeparator?: string; + /** + * @docid + * @default "USD" + * @public + */ + defaultCurrency?: string; + /** + * @docid + * @type Enums.EditorStylingMode + * @default undefined + * @public + */ + editorStylingMode?: 'outlined' | 'underlined' | 'filled'; + /** + * @docid + * @public + */ + floatingActionButtonConfig?: { + /** + * @docid + * @default "close" + */ + closeIcon?: string; + /** + * @docid + * @type Enums.floatingActionButtonDirection + * @default "auto" + */ + direction?: 'auto' | 'up' | 'down'; + /** + * @docid + * @default "add" + */ + icon?: string; + /** + * @docid + * @default "" + */ + label?: string; + /** + * @docid + * @default 5 + */ + maxSpeedDialActionCount?: number; + /** + * @docid + * @type Enums.PositionAlignment|PositionConfig|function + * @default "{ at: 'right bottom', my: 'right bottom', offset: '-16 -16' }" + */ + position?: 'bottom' | 'center' | 'left' | 'left bottom' | 'left top' | 'right' | 'right bottom' | 'right top' | 'top' | PositionConfig | Function; + /** + * @docid + * @default false + */ + shading?: boolean; + }; + /** + * @docid + * @default true + * @public + */ + forceIsoDateParsing?: boolean; + /** + * @docid + * @default true + * @public + */ + oDataFilterToLower?: boolean; + /** + * @docid + * @default false + * @public + */ + rtlEnabled?: boolean; + /** + * @docid + * @default "." + * @public + */ + serverDecimalSeparator?: string; + /** + * @docid + * @default "," + * @deprecated + * @public + */ + thousandsSeparator?: string; + /** + * @docid + * @default false + * @public + */ + useLegacyStoreResult?: boolean; + /** + * @docid + * @default false + * @public + */ + useLegacyVisibleIndex?: boolean; +} + +export default config; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/config.js b/packages/f-theme-editor/farris-theme-editor/js/core/config.js new file mode 100644 index 0000000000000000000000000000000000000000..1eca0d37391834e044dae80f6fe5991569f27e21 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/config.js @@ -0,0 +1,78 @@ +/* global DevExpress */ + +import { extend } from './utils/extend'; +import errors from './errors'; + +const config = { + rtlEnabled: false, + defaultCurrency: 'USD', + oDataFilterToLower: true, + serverDecimalSeparator: '.', + decimalSeparator: '.', + thousandsSeparator: ',', + forceIsoDateParsing: true, + wrapActionsBeforeExecute: true, + useLegacyStoreResult: false, + /** + * @name globalConfig.useJQuery + * @type boolean + * @hidden + */ + useJQuery: undefined, + editorStylingMode: undefined, + useLegacyVisibleIndex: false, + + floatingActionButtonConfig: { + icon: 'add', + closeIcon: 'close', + label: '', + position: { + at: 'right bottom', + my: 'right bottom', + offset: { + x: -16, + y: -16 + } + }, + maxSpeedDialActionCount: 5, + shading: false, + direction: 'auto' + }, + + optionsParser: (optionsString) => { + if(optionsString.trim().charAt(0) !== '{') { + optionsString = '{' + optionsString + '}'; + } + try { + // eslint-disable-next-line no-new-func + return (new Function('return ' + optionsString))(); + } catch(ex) { + throw errors.Error('E3018', ex, optionsString); + } + } +}; + +const deprecatedFields = [ 'decimalSeparator', 'thousandsSeparator' ]; + +const configMethod = (...args) => { + if(!args.length) { + return config; + } + + const newConfig = args[0]; + + deprecatedFields.forEach((deprecatedField) => { + if(newConfig[deprecatedField]) { + const message = `Now, the ${deprecatedField} is selected based on the specified locale.`; + errors.log('W0003', 'config', deprecatedField, '19.2', message); + } + }); + + extend(config, newConfig); +}; + +if(typeof DevExpress !== 'undefined' && DevExpress.config) { + configMethod(DevExpress.config); +} + +export default configMethod; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/devices.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/devices.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5d05507f7f1d178167ebd6b3b30280f3594eaa1a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/devices.d.ts @@ -0,0 +1,133 @@ +/** + * @public + * @docid + * @section commonObjectStructures + * @namespace DevExpress + */ +export type Device = { + /** + * @docid + * @public + */ + android?: boolean; + /** + * @docid + * @public + */ + deviceType?: 'phone' | 'tablet' | 'desktop'; + /** + * @docid + * @public + */ + default?: boolean; + /** + * @docid + * @public + */ + grade?: 'A' | 'B' | 'C'; + /** + * @docid + * @public + */ + ios?: boolean; + /** + * @docid + * @public + */ + phone?: boolean; + /** + * @docid + * @public + */ + platform?: 'android' | 'ios' | 'default'; + /** + * @docid + * @public + */ + tablet?: boolean; + /** + * @docid + * @public + */ + version?: Array; +}; + +type EventName = 'orientationChanged'; + +/** + * @docid + * @publicName devices + * @section Utils + * @namespace DevExpress + * @public + */ +declare class DevicesObject { + constructor(options?: { window?: Window }); + /** + * @docid + * @publicName current() + * @public + */ + current(): Device; + /** + * @docid + * @publicName current(deviceName) + * @public + */ + current(deviceName: string | Device): void; + /** + * @docid + * @publicName off(eventName) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName): this; + /** + * @docid + * @publicName off(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + on(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(events) + * @param1 events:object + * @return this + * @public + */ + on(events: { [key in EventName]?: Function }): this; + /** + * @docid + * @publicName orientation() + * @return String + * @public + */ + orientation(): 'portrait' | 'landscape' | undefined; + /** + * @docid + * @publicName real() + * @public + */ + real(): Device; + isSimulator(): boolean; +} + +/** + * @const devices + * @namespace DevExpress + * @hidden + */ + +declare const devices: DevicesObject; +export default devices; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/devices.js b/packages/f-theme-editor/farris-theme-editor/js/core/devices.js new file mode 100644 index 0000000000000000000000000000000000000000..0e88580d266467635778a2773e2da79df228f1c7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/devices.js @@ -0,0 +1,366 @@ +import { getHeight, getWidth } from './utils/size'; +import $ from '../core/renderer'; +import { getWindow, getNavigator, hasWindow } from './utils/window'; +import { extend } from './utils/extend'; +import { isPlainObject } from './utils/type'; +import { each } from './utils/iterator'; +import errors from './errors'; +import Callbacks from './utils/callbacks'; +import readyCallbacks from './utils/ready_callbacks'; +import resizeCallbacks from './utils/resize_callbacks'; +import { EventsStrategy } from './events_strategy'; +import { sessionStorage as SessionStorage } from './utils/storage'; +import { changeCallback, value as viewPort } from './utils/view_port'; +import Config from './config'; + +const navigator = getNavigator(); +const window = getWindow(); + +const KNOWN_UA_TABLE = { + 'iPhone': 'iPhone', + 'iPhone5': 'iPhone', + 'iPhone6': 'iPhone', + 'iPhone6plus': 'iPhone', + 'iPad': 'iPad', + 'iPadMini': 'iPad Mini', + 'androidPhone': 'Android Mobile', + 'androidTablet': 'Android', + 'msSurface': 'Windows ARM Tablet PC', + 'desktop': 'desktop' +}; + +const DEFAULT_DEVICE = { + deviceType: 'desktop', + platform: 'default', + version: [], + phone: false, + tablet: false, + android: false, + ios: false, + default: true, + grade: 'A', + + // TODO: For internal use (draft, do not document these options!) + mac: false +}; + +const uaParsers = { + default(userAgent) { + const isPhone = /windows phone/i.test(userAgent) || userAgent.match(/WPDesktop/); + const isTablet = !isPhone && /Windows(.*)arm(.*)Tablet PC/i.test(userAgent); + const isDesktop = !isPhone && !isTablet && /msapphost/i.test(userAgent); + const isMac = /((intel|ppc) mac os x)/.test(userAgent.toLowerCase()); + + if(!(isPhone || isTablet || isDesktop || isMac)) { + return; + } + + return { + deviceType: isPhone ? 'phone' : isTablet ? 'tablet' : 'desktop', + platform: 'default', + version: [], + grade: 'A', + mac: isMac + }; + }, + + ios(userAgent) { + if(!/ip(hone|od|ad)/i.test(userAgent)) { + return; + } + + const isPhone = /ip(hone|od)/i.test(userAgent); + const matches = userAgent.match(/os (\d+)_(\d+)_?(\d+)?/i); + const version = matches ? [parseInt(matches[1], 10), parseInt(matches[2], 10), parseInt(matches[3] || 0, 10)] : []; + const isIPhone4 = (window.screen.height === (960 / 2)); + const grade = isIPhone4 ? 'B' : 'A'; + + return { + deviceType: isPhone ? 'phone' : 'tablet', + platform: 'ios', + version, + grade + }; + }, + + android(userAgent) { + if(!/android|htc_|silk/i.test(userAgent)) { + return; + } + + const isPhone = /mobile/i.test(userAgent); + const matches = userAgent.match(/android (\d+)\.?(\d+)?\.?(\d+)?/i); + const version = matches ? [parseInt(matches[1], 10), parseInt(matches[2] || 0, 10), parseInt(matches[3] || 0, 10)] : []; + const worseThan4_4 = version.length > 1 && (version[0] < 4 || version[0] === 4 && version[1] < 4); + const grade = worseThan4_4 ? 'B' : 'A'; + + return { + deviceType: isPhone ? 'phone' : 'tablet', + platform: 'android', + version, + grade + }; + } +}; + +class Devices { + /** + * @name DevicesObject.ctor + * @publicName ctor(options) + * @param1 options:object + * @param1_field1 window:Window + * @hidden + */ + constructor(options) { + this._window = options?.window || window; + + this._realDevice = this._getDevice(); + this._currentDevice = undefined; + this._currentOrientation = undefined; + this._eventsStrategy = new EventsStrategy(this); + + this.changed = Callbacks(); + if(hasWindow()) { + readyCallbacks.add(this._recalculateOrientation.bind(this)); + resizeCallbacks.add(this._recalculateOrientation.bind(this)); + } + } + + current(deviceOrName) { + if(deviceOrName) { + this._currentDevice = this._getDevice(deviceOrName); + this._forced = true; + this.changed.fire(); + + return; + } + + if(!this._currentDevice) { + deviceOrName = undefined; + try { + deviceOrName = this._getDeviceOrNameFromWindowScope(); + } catch(e) { + deviceOrName = this._getDeviceNameFromSessionStorage(); + } finally { + if(!deviceOrName) { + deviceOrName = this._getDeviceNameFromSessionStorage(); + } + if(deviceOrName) { + this._forced = true; + } + } + this._currentDevice = this._getDevice(deviceOrName); + } + + return this._currentDevice; + } + + real(forceDevice) { + ///#DEBUG + if(isPlainObject(forceDevice)) { + extend(this._realDevice, forceDevice); + return; + } + ///#ENDDEBUG + return extend({}, this._realDevice); + } + + orientation() { + return this._currentOrientation; + } + + isForced() { + return this._forced; + } + + isRippleEmulator() { + return !!this._window.tinyHippos; + } + + _getCssClasses(device) { + const result = []; + const realDevice = this._realDevice; + + device = device || this.current(); + + // TODO: use real device here? + if(device.deviceType) { + result.push(`dx-device-${device.deviceType}`); + if(device.deviceType !== 'desktop') { + result.push('dx-device-mobile'); + } + } + + result.push(`dx-device-${realDevice.platform}`); + + if(realDevice.version && realDevice.version.length) { + result.push(`dx-device-${realDevice.platform}-${realDevice.version[0]}`); + } + + if(this.isSimulator()) { + result.push('dx-simulator'); + } + + if(Config().rtlEnabled) { + result.push('dx-rtl'); + } + + return result; + } + + attachCssClasses(element, device) { + this._deviceClasses = this._getCssClasses(device).join(' '); + $(element).addClass(this._deviceClasses); + } + + detachCssClasses(element) { + $(element).removeClass(this._deviceClasses); + } + + isSimulator() { + // NOTE: error may happen due to same-origin policy + try { + return this._isSimulator || hasWindow() && this._window.top !== this._window.self && this._window.top['dx-force-device'] || this.isRippleEmulator(); + } catch(e) { + return false; + } + } + + forceSimulator() { + this._isSimulator = true; + } + + _getDevice(deviceName) { + if(deviceName === 'defaultPhone') { + deviceName = { + deviceType: 'phone', + platform: 'default', + default: true + }; + } + + if(isPlainObject(deviceName)) { + return this._fromConfig(deviceName); + } else { + let ua; + if(deviceName) { + ua = KNOWN_UA_TABLE[deviceName]; + if(!ua) { + throw errors.Error('E0005'); + } + } else { + ua = navigator.userAgent; + } + return this._fromUA(ua); + } + } + + _getDeviceOrNameFromWindowScope() { + let result; + + if(hasWindow() && (this._window.top['dx-force-device-object'] || this._window.top['dx-force-device'])) { + result = this._window.top['dx-force-device-object'] || this._window.top['dx-force-device']; + } + + return result; + } + + _getDeviceNameFromSessionStorage() { + const sessionStorage = SessionStorage(); + + if(!sessionStorage) { + return; + } + + const deviceOrName = sessionStorage.getItem('dx-force-device'); + + try { + return JSON.parse(deviceOrName); + } catch(ex) { + return deviceOrName; + } + } + + _fromConfig(config) { + const result = extend({}, DEFAULT_DEVICE, this._currentDevice, config); + const shortcuts = { + phone: result.deviceType === 'phone', + tablet: result.deviceType === 'tablet', + android: result.platform === 'android', + ios: result.platform === 'ios', + default: result.platform === 'default' + }; + + return extend(result, shortcuts); + } + + _fromUA(ua) { + let config; + + each(uaParsers, (platform, parser) => { + config = parser(ua); + return !config; + }); + + if(config) { + return this._fromConfig(config); + } + + return DEFAULT_DEVICE; + } + + _changeOrientation() { + const $window = $(this._window); + const orientation = getHeight($window) > getWidth($window) ? 'portrait' : 'landscape'; + + if(this._currentOrientation === orientation) { + return; + } + + this._currentOrientation = orientation; + + this._eventsStrategy.fireEvent('orientationChanged', [{ + orientation: orientation + }]); + } + + _recalculateOrientation() { + const windowWidth = getWidth(this._window); + + if(this._currentWidth === windowWidth) { + return; + } + this._currentWidth = windowWidth; + + this._changeOrientation(); + + } + + on(eventName, eventHandler) { + this._eventsStrategy.on(eventName, eventHandler); + return this; + } + + off(eventName, eventHandler) { + this._eventsStrategy.off(eventName, eventHandler); + return this; + } +} + +const devices = new Devices(); + +const viewPortElement = viewPort(); +if(viewPortElement) { + devices.attachCssClasses(viewPortElement); +} + +changeCallback.add((viewPort, prevViewport) => { + devices.detachCssClasses(prevViewport); + devices.attachCssClasses(viewPort); +}); + +///#DEBUG +devices.Devices = Devices; +///#ENDDEBUG + +export default devices; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5fe47a5a65131a127b8788828908804c04dfdbd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.d.ts @@ -0,0 +1,23 @@ +export interface DomAdapter { + getActiveElement(): HTMLElement; + getDocument(): Document; + getDocumentElement(): HTMLDocument & { + scrollLeft: number; + scrollTop: number; + clientWidth: number; + scrollHeight: number; + offsetHeight: number; + clientHeight: number; + }; + isNode(node: unknown): boolean; + getBody(): HTMLBodyElement; + isElementNode(element: unknown): boolean; + createElement(tagName: string, context?: Document): HTMLElement; + createDocumentFragment(): DocumentFragment; + setClass(element: HTMLElement, className: string, isAdd: boolean): void; + removeElement(element: HTMLElement): void; + inject(obj: Record): void; +} + +declare const domAdapter: DomAdapter; +export default domAdapter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.js b/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.js new file mode 100644 index 0000000000000000000000000000000000000000..d83d0881f515ddf85a90910675917e5d9ed8f592 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/dom_adapter.js @@ -0,0 +1,177 @@ +/* global document */ +import injector from './utils/dependency_injector'; +import { noop } from './utils/common'; + +const ELEMENT_NODE = 1; +const TEXT_NODE = 3; +const DOCUMENT_NODE = 9; + +const nativeDOMAdapterStrategy = { + querySelectorAll(element, selector) { + return element.querySelectorAll(selector); + }, + + elementMatches(element, selector) { + const matches = element.matches || element.matchesSelector || element.mozMatchesSelector || + element.msMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector || + (selector => { + const doc = element.document || element.ownerDocument; + + if(!doc) { + return false; + } + + const items = this.querySelectorAll(doc, selector); + + for(let i = 0; i < items.length; i++) { + if(items[i] === element) { + return true; + } + } + }); + + return matches.call(element, selector); + }, + + createElement(tagName, context) { + context = context || this._document; + return context.createElement(tagName); + }, + + createElementNS(ns, tagName, context) { + context = context || this._document; + return context.createElementNS(ns, tagName); + }, + + createTextNode(text, context) { + context = context || this._document; + return context.createTextNode(text); + }, + + isNode(element) { + return element && typeof element === 'object' && 'nodeType' in element && 'nodeName' in element; + }, + + isElementNode(element) { + return element && element.nodeType === ELEMENT_NODE; + }, + + isTextNode(element) { + return element && element.nodeType === TEXT_NODE; + }, + + isDocument(element) { + return element && element.nodeType === DOCUMENT_NODE; + }, + + removeElement(element) { + const parentNode = element && element.parentNode; + if(parentNode) { + parentNode.removeChild(element); + } + }, + + insertElement(parentElement, newElement, nextSiblingElement) { + if(parentElement && newElement && parentElement !== newElement) { + if(nextSiblingElement) { + parentElement.insertBefore(newElement, nextSiblingElement); + } else { + parentElement.appendChild(newElement); + } + } + }, + + getAttribute(element, name) { + return element.getAttribute(name); + }, + + setAttribute(element, name, value) { + element.setAttribute(name, value); + }, + + removeAttribute(element, name) { + element.removeAttribute(name); + }, + + setProperty(element, name, value) { + element[name] = value; + }, + + setText(element, text) { + if(element) { + element.textContent = text; + } + }, + + setClass(element, className, isAdd) { + if(element.nodeType === 1 && className) { + isAdd + ? element.classList.add(className) + : element.classList.remove(className); + } + }, + + setStyle(element, name, value) { + element.style[name] = value || ''; + }, + + _document: typeof document === 'undefined' ? undefined : document, + + getDocument() { + return this._document; + }, + + getActiveElement() { + return this._document.activeElement; + }, + + getBody() { + return this._document.body; + }, + + createDocumentFragment() { + return this._document.createDocumentFragment(); + }, + + getDocumentElement() { + return this._document.documentElement; + }, + + getLocation() { + return this._document.location; + }, + + getSelection() { + return this._document.selection; + }, + + getReadyState() { + return this._document.readyState; + }, + + getHead() { + return this._document.head; + }, + + hasDocumentProperty(property) { + return property in this._document; + }, + + listen(element, event, callback, options) { + if(!element || !('addEventListener' in element)) { + return noop; + } + + element.addEventListener(event, callback, options); + + return () => { + element.removeEventListener(event, callback); + }; + }, + + elementsFromPoint(x, y) { + return this._document.elementsFromPoint(x, y); + } +}; + +export default injector(nativeDOMAdapterStrategy); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa12788cecce8bec92aed13aed84c9e492039546 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.d.ts @@ -0,0 +1,155 @@ +import { + Component, + ComponentOptions, +} from './component'; + +import { + UserDefinedElement, + DxElement, +} from './element'; + +import { + ChangedOptionInfo, + EventInfo, + InitializedEventInfo, +} from '../events/index'; + +import { TemplateManager } from './template_manager'; +import { FunctionTemplate } from './templates/function_template'; +import { DefaultOptionsRule } from './options'; + +type OptionChangedEventInfo = EventInfo & ChangedOptionInfo; + +/* eslint-disable no-underscore-dangle */ + +/** @namespace DevExpress */ +export interface DOMComponentOptions extends ComponentOptions< + EventInfo, + InitializedEventInfo, + OptionChangedEventInfo +> { + /** + * @docid + * @default {} + * @public + */ + bindingOptions?: { [key: string]: any }; + /** + * @docid + * @default {} + * @public + */ + elementAttr?: { [key: string]: any }; + /** + * @docid + * @default undefined + * @public + */ + height?: number | string | (() => number | string); + /** + * @docid + * @action + * @default null + * @type_function_param1 e:object + * @type_function_param1_field1 component: + * @type_function_param1_field2 element:DxElement + * @type_function_param1_field3 model:any + * @public + */ + onDisposing?: ((e: EventInfo) => void); + /** + * @docid + * @action + * @default null + * @type_function_param1 e:object + * @type_function_param1_field1 component: + * @type_function_param1_field2 element:DxElement + * @type_function_param1_field3 model:any + * @type_function_param1_field4 name:string + * @type_function_param1_field5 fullName:string + * @type_function_param1_field6 value:any + * @public + */ + onOptionChanged?: ((e: OptionChangedEventInfo) => void); + /** + * @docid + * @default false + * @public + */ + rtlEnabled?: boolean; + /** + * @docid + * @default undefined + * @public + */ + width?: number | string | (() => number | string); +} +/** + * @docid + * @section uiWidgets + * @inherits Component + * @namespace DevExpress + * @hidden + */ +export default class DOMComponent extends Component { + _templateManager: TemplateManager; + + _cancelOptionChange?: string; + + constructor(element: UserDefinedElement, options?: TProperties); + + /** + * @docid + * @static + * @section uiWidgets + * @publicName getInstance(element) + * @param1 element:Element|JQuery + * @return DOMComponent + * @public + */ + static getInstance(element: UserDefinedElement): DOMComponent; + + /** + * @docid + * @static + * @section uiWidgets + * @publicName defaultOptions(rule) + * @param1 rule:Object + * @param1_field1 device:Device|Array|function + * @param1_field2 options:Object + * @public + */ + static defaultOptions(rule: DefaultOptionsRule): void; + + /** + * @docid + * @publicName dispose() + * @public + */ + dispose(): void; + /** + * @docid + * @publicName element() + * @public + */ + element(): DxElement; + + $element(): UserDefinedElement; + _getTemplate(template: unknown): FunctionTemplate; + _invalidate(): void; + _refresh(): void; + _notifyOptionChanged(fullName: string, value: unknown, previousValue: unknown): void; + _createElement(element: HTMLElement): void; +} + +export type ComponentClass = { + new(element: HTMLDivElement, options?: TProperties): DOMComponent; + getInstance(widgetRef: HTMLDivElement): DOMComponent; +}; + +interface DOMComponentInstance extends DOMComponent { } + +type Properties = DOMComponentOptions; + +/** @deprecated use Properties instead */ +export type Options = Properties; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.js b/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.js new file mode 100644 index 0000000000000000000000000000000000000000..44b6a9b2bd9f5d60a9e135e0fac920c049c09ba8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/dom_component.js @@ -0,0 +1,496 @@ +import $ from '../core/renderer'; +import config from './config'; +import errors from './errors'; +import windowResizeCallbacks from '../core/utils/resize_callbacks'; +import { Component } from './component'; +import { TemplateManager } from './template_manager'; +import { attachInstanceToElement, getInstanceByElement } from './utils/public_component'; +import { cleanDataRecursive } from './element_data'; +import { each } from './utils/iterator'; +import { extend } from './utils/extend'; +import { getPublicElement } from '../core/element'; +import { grep, noop } from './utils/common'; +import { inArray } from './utils/array'; +import { isString, isDefined, isFunction } from './utils/type'; +import { hasWindow } from '../core/utils/window'; +import { resize as resizeEvent, visibility as visibilityEvents } from '../events/short'; + +const { abstract } = Component; + +const DOMComponent = Component.inherit({ + _getDefaultOptions() { + return extend(this.callBase(), { + + width: undefined, + + height: undefined, + + rtlEnabled: config().rtlEnabled, + + elementAttr: {}, + + disabled: false, + + integrationOptions: {} + }, this._useTemplates() ? TemplateManager.createDefaultOptions() : {}); + }, + /** + * @name DOMComponent.ctor + * @publicName ctor(element,options) + * @param1 element:Element|JQuery + * @param2 options:DOMComponentOptions|undefined + * @hidden + */ + ctor(element, options) { + this._customClass = null; + + this._createElement(element); + attachInstanceToElement(this._$element, this, this._dispose); + + this.callBase(options); + }, + + _createElement(element) { + this._$element = $(element); + }, + + _getSynchronizableOptionsForCreateComponent() { + return ['rtlEnabled', 'disabled', 'templatesRenderAsynchronously']; + }, + + _checkFunctionValueDeprecation: function(optionNames) { + if(!this.option('_ignoreFunctionValueDeprecation')) { + optionNames.forEach(optionName => { + if(isFunction(this.option(optionName))) { + errors.log('W0017', optionName); + } + }); + } + }, + + _visibilityChanged: abstract, + _dimensionChanged: abstract, + + _init() { + this.callBase(); + this._checkFunctionValueDeprecation([ + 'width', 'height', + 'maxHeight', 'maxWidth', + 'minHeight', 'minWidth', + 'popupHeight', 'popupWidth' + ]); + this._attachWindowResizeCallback(); + this._initTemplateManager(); + }, + + _setOptionsByDevice(instanceCustomRules) { + this.callBase([].concat(this.constructor._classCustomRules || [], instanceCustomRules || [])); + }, + + _isInitialOptionValue(name) { + const isCustomOption = this.constructor._classCustomRules + && Object.prototype.hasOwnProperty.call(this._convertRulesToOptions(this.constructor._classCustomRules), name); + + return !isCustomOption && this.callBase(name); + }, + + _attachWindowResizeCallback() { + if(this._isDimensionChangeSupported()) { + const windowResizeCallBack = this._windowResizeCallBack = this._dimensionChanged.bind(this); + + windowResizeCallbacks.add(windowResizeCallBack); + } + }, + + _isDimensionChangeSupported() { + return this._dimensionChanged !== abstract; + }, + + _renderComponent() { + this._initMarkup(); + + hasWindow() && this._render(); + }, + + _initMarkup() { + const { rtlEnabled } = this.option() || {}; + + this._renderElementAttributes(); + this._toggleRTLDirection(rtlEnabled); + this._renderVisibilityChange(); + this._renderDimensions(); + }, + + _render() { + this._attachVisibilityChangeHandlers(); + }, + + _renderElementAttributes() { + const { elementAttr } = this.option() || {}; + const attributes = extend({}, elementAttr); + const classNames = attributes.class; + + delete attributes.class; + + this.$element() + .attr(attributes) + .removeClass(this._customClass) + .addClass(classNames); + + this._customClass = classNames; + }, + + _renderVisibilityChange() { + if(this._isDimensionChangeSupported()) { + this._attachDimensionChangeHandlers(); + } + + if(this._isVisibilityChangeSupported()) { + const $element = this.$element(); + + $element.addClass('dx-visibility-change-handler'); + } + }, + + _renderDimensions() { + const $element = this.$element(); + const element = $element.get(0); + const width = this._getOptionValue('width', element); + const height = this._getOptionValue('height', element); + + if(this._isCssUpdateRequired(element, height, width)) { + $element.css({ + width: width === null ? '' : width, + height: height === null ? '' : height + }); + } + }, + + _isCssUpdateRequired(element, height, width) { + return !!(isDefined(width) || isDefined(height) || element.style.width || element.style.height); + }, + + _attachDimensionChangeHandlers() { + const $el = this.$element(); + const namespace = `${this.NAME}VisibilityChange`; + + resizeEvent.off($el, { namespace }); + resizeEvent.on($el, () => this._dimensionChanged(), { namespace }); + }, + + _attachVisibilityChangeHandlers() { + if(this._isVisibilityChangeSupported()) { + const $el = this.$element(); + const namespace = `${this.NAME}VisibilityChange`; + + this._isHidden = !this._isVisible(); + visibilityEvents.off($el, { namespace }); + visibilityEvents.on($el, + () => this._checkVisibilityChanged('shown'), + () => this._checkVisibilityChanged('hiding'), + { namespace } + ); + } + }, + + _isVisible() { + const $element = this.$element(); + + return $element.is(':visible'); + }, + + _checkVisibilityChanged(action) { + const isVisible = this._isVisible(); + + if(isVisible) { + if(action === 'hiding' && !this._isHidden) { + this._visibilityChanged(false); + this._isHidden = true; + } else if(action === 'shown' && this._isHidden) { + this._isHidden = false; + this._visibilityChanged(true); + } + } + }, + + _isVisibilityChangeSupported() { + return this._visibilityChanged !== abstract && hasWindow(); + }, + + _clean: noop, + + _modelByElement() { + const { modelByElement } = this.option(); + const $element = this.$element(); + + return modelByElement ? modelByElement($element) : undefined; + }, + + _invalidate() { + if(this._isUpdateAllowed()) { + throw errors.Error('E0007'); + } + + this._requireRefresh = true; + }, + + _refresh() { + this._clean(); + this._renderComponent(); + }, + + _dispose() { + this._templateManager && this._templateManager.dispose(); + this.callBase(); + this._clean(); + this._detachWindowResizeCallback(); + }, + + _detachWindowResizeCallback() { + if(this._isDimensionChangeSupported()) { + windowResizeCallbacks.remove(this._windowResizeCallBack); + } + }, + + _toggleRTLDirection(rtl) { + const $element = this.$element(); + + $element.toggleClass('dx-rtl', rtl); + }, + + _createComponent(element, component, config = {}) { + const synchronizableOptions = grep( + this._getSynchronizableOptionsForCreateComponent(), + value => !(value in config) + ); + + const { integrationOptions } = this.option(); + let { nestedComponentOptions } = this.option(); + + nestedComponentOptions = nestedComponentOptions || noop; + + const nestedComponentConfig = extend( + { integrationOptions }, + nestedComponentOptions(this) + ); + + synchronizableOptions.forEach(optionName => + nestedComponentConfig[optionName] = this.option(optionName) + ); + + this._extendConfig(config, nestedComponentConfig); + + let instance = void 0; + + if(isString(component)) { + const $element = $(element)[component](config); + + instance = $element[component]('instance'); + } else if(element) { + instance = component.getInstance(element); + + if(instance) { + instance.option(config); + } else { + instance = new component(element, config); + } + } + + if(instance) { + const optionChangedHandler = ({ name, value }) => { + if(inArray(name, synchronizableOptions) >= 0) { + instance.option(name, value); + } + }; + + this.on('optionChanged', optionChangedHandler); + instance.on('disposing', () => this.off('optionChanged', optionChangedHandler)); + } + + return instance; + }, + + _extendConfig(config, extendConfig) { + each(extendConfig, (key, value) => { + !Object.prototype.hasOwnProperty.call(config, key) && (config[key] = value); + }); + }, + + _defaultActionConfig() { + const $element = this.$element(); + const context = this._modelByElement($element); + + return extend(this.callBase(), { context }); + }, + + _defaultActionArgs() { + const $element = this.$element(); + const model = this._modelByElement($element); + const element = this.element(); + + return extend(this.callBase(), { element, model }); + }, + + _optionChanged(args) { + switch(args.name) { + case 'width': + case 'height': + this._renderDimensions(); + break; + case 'rtlEnabled': + this._invalidate(); + break; + case 'elementAttr': + this._renderElementAttributes(); + break; + case 'disabled': + case 'integrationOptions': + break; + default: + this.callBase(args); + break; + } + }, + + _removeAttributes(element) { + const attrs = element.attributes; + + for(let i = attrs.length - 1; i >= 0; i--) { + const attr = attrs[i]; + + if(attr) { + const { name } = attr; + + if(!name.indexOf('aria-') || name.indexOf('dx-') !== -1 || + name === 'role' || name === 'style' || name === 'tabindex') { + element.removeAttribute(name); + } + } + } + }, + + _removeClasses(element) { + element.className = element.className + .split(' ') + .filter(cssClass => cssClass.lastIndexOf('dx-', 0) !== 0) + .join(' '); + }, + + _updateDOMComponent(renderRequired) { + if(renderRequired) { + this._renderComponent(); + } else if(this._requireRefresh) { + this._requireRefresh = false; + this._refresh(); + } + }, + + endUpdate() { + const renderRequired = this._isInitializingRequired(); + + this.callBase(); + this._isUpdateAllowed() && this._updateDOMComponent(renderRequired); + }, + + $element() { + return this._$element; + }, + + element() { + const $element = this.$element(); + + return getPublicElement($element); + }, + + dispose() { + const element = this.$element().get(0); + + cleanDataRecursive(element, true); + element.textContent = ''; + this._removeAttributes(element); + this._removeClasses(element); + }, + + resetOption(optionName) { + this.callBase(optionName); + + if(optionName === 'width' || optionName === 'height') { + const initialOption = this.initialOption(optionName); + + !isDefined(initialOption) && this.$element().css(optionName, ''); + } + }, + + _getAnonymousTemplateName() { + return void 0; + }, + + _initTemplateManager() { + if(this._templateManager || !this._useTemplates()) return void 0; + + const { integrationOptions = {} } = this.option(); + const { createTemplate } = integrationOptions; + + this._templateManager = new TemplateManager( + createTemplate, + this._getAnonymousTemplateName() + ); + this._initTemplates(); + }, + + _initTemplates() { + const { templates, anonymousTemplateMeta } = this._templateManager.extractTemplates(this.$element()); + const anonymousTemplate = this.option(`integrationOptions.templates.${anonymousTemplateMeta.name}`); + + templates.forEach(({ name, template }) => { + this._options.silent(`integrationOptions.templates.${name}`, template); + }); + + if(anonymousTemplateMeta.name && !anonymousTemplate) { + this._options.silent(`integrationOptions.templates.${anonymousTemplateMeta.name}`, anonymousTemplateMeta.template); + this._options.silent('_hasAnonymousTemplateContent', true); + } + }, + + _getTemplateByOption(optionName) { + return this._getTemplate(this.option(optionName)); + }, + + _getTemplate(templateSource) { + const templates = this.option('integrationOptions.templates'); + const isAsyncTemplate = this.option('templatesRenderAsynchronously'); + const skipTemplates = this.option('integrationOptions.skipTemplates'); + + return this._templateManager.getTemplate( + templateSource, + templates, + { + isAsyncTemplate, + skipTemplates + }, + this + ); + }, + + _saveTemplate(name, template) { + this._setOptionWithoutOptionChange( + 'integrationOptions.templates.' + name, + this._templateManager._createTemplate(template) + ); + }, + + _useTemplates() { + return true; + }, +}); + +DOMComponent.getInstance = function(element) { + return getInstanceByElement($(element), this); +}; + +DOMComponent.defaultOptions = function(rule) { + this._classCustomRules = this._classCustomRules || []; + this._classCustomRules.push(rule); +}; + +export default DOMComponent; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/element.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/element.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9cfba809cb9b45f4cec8019d4b4a0f0f20867282 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/element.d.ts @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars */ +import { dxElementWrapper } from './renderer'; + +export interface Condition {} + +export interface ElementWrapper { } +export interface ElementsArrayWrapper { } +/** + * @docid + * @type HTMLElement|SVGElement|JQuery + */ +export type DxElement = {} extends Condition ? T : ElementWrapper; + +/** + * @docid + * @type HTMLElement|SVGElement|JQuery + */ +export type UserDefinedElement = {} extends Condition ? T : ElementWrapper | T; + +export type UserDefinedElementsArray = {} extends Condition ? Array : ElementsArrayWrapper; + +export interface InternalElementWrapper { } +export type InternalElement = {} extends Condition ? dxElementWrapper : InternalElementWrapper; + +/** + * @docid + * @hidden + * @type HTMLElement|JQuery + * @deprecated + */ +export type dxElement = DxElement; + +/** + * @docid + * @hidden + * @type SVGElement|JQuery + * @deprecated + */ +export type dxSVGElement = DxElement; + +export function getPublicElement(element: InternalElement): DxElement; +export function setPublicElementWrapper(newStrategy: (element: InternalElement) => DxElement): void; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/element.js b/packages/f-theme-editor/farris-theme-editor/js/core/element.js new file mode 100644 index 0000000000000000000000000000000000000000..03b6972149fa03d58f8777f93cd611f3d1ccebf0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/element.js @@ -0,0 +1,11 @@ +let strategy = function(element) { + return element && element.get(0); +}; + +export function getPublicElement(element) { + return strategy(element); +} + +export function setPublicElementWrapper(newStrategy) { + strategy = newStrategy; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/element_data.js b/packages/f-theme-editor/farris-theme-editor/js/core/element_data.js new file mode 100644 index 0000000000000000000000000000000000000000..4bfa41a076abf681362cf012ed1443bb0ee138b7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/element_data.js @@ -0,0 +1,114 @@ +import WeakMap from './polyfills/weak_map'; +import domAdapter from './dom_adapter'; +import eventsEngine from '../events/core/events_engine'; +import MemorizedCallbacks from './memorized_callbacks'; + +const dataMap = new WeakMap(); +let strategy; + +export const strategyChanging = new MemorizedCallbacks(); +let beforeCleanDataFunc = function() {}; +let afterCleanDataFunc = function() {}; + +export const setDataStrategy = function(value) { + strategyChanging.fire(value); + + strategy = value; + + const cleanData = strategy.cleanData; + + strategy.cleanData = function(nodes) { + beforeCleanDataFunc(nodes); + + const result = cleanData.call(this, nodes); + + afterCleanDataFunc(nodes); + + return result; + }; +}; + +setDataStrategy({ + data: function() { + const element = arguments[0]; + const key = arguments[1]; + const value = arguments[2]; + + if(!element) return; + + let elementData = dataMap.get(element); + + if(!elementData) { + elementData = {}; + dataMap.set(element, elementData); + } + + if(key === undefined) { + return elementData; + } + + if(arguments.length === 2) { + return elementData[key]; + } + + elementData[key] = value; + return value; + }, + + removeData: function(element, key) { + if(!element) return; + if(key === undefined) { + dataMap.delete(element); + } else { + const elementData = dataMap.get(element); + if(elementData) { + delete elementData[key]; + } + } + }, + + cleanData: function(elements) { + for(let i = 0; i < elements.length; i++) { + eventsEngine.off(elements[i]); + dataMap.delete(elements[i]); + } + } +}); + +export function getDataStrategy() { + return strategy; +} + +export function data() { + return strategy.data.apply(this, arguments); +} + +export function beforeCleanData(callback) { + beforeCleanDataFunc = callback; +} + +export function afterCleanData(callback) { + afterCleanDataFunc = callback; +} + +export function cleanData(nodes) { + return strategy.cleanData.call(this, nodes); +} + +export function removeData(element, key) { + return strategy.removeData.call(this, element, key); +} + +export function cleanDataRecursive(element, cleanSelf) { + if(!domAdapter.isElementNode(element)) { + return; + } + + const childElements = element.getElementsByTagName('*'); + + strategy.cleanData(childElements); + + if(cleanSelf) { + strategy.cleanData([element]); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/errors.js b/packages/f-theme-editor/farris-theme-editor/js/core/errors.js new file mode 100644 index 0000000000000000000000000000000000000000..fdfc43f0d72bc476454c04adc5268358198d1514 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/errors.js @@ -0,0 +1,253 @@ +import errorUtils from './utils/error'; + +/** +* @docid +* @name ErrorsCore +*/ +export default errorUtils({ + + /** + * @name ErrorsCore.E0001 + */ + E0001: 'Method is not implemented', + + /** + * @name ErrorsCore.E0002 + */ + E0002: 'Member name collision: {0}', + + /** + * @name ErrorsCore.E0003 + */ + E0003: 'A class must be instantiated using the \'new\' keyword', + + /** + * @name ErrorsCore.E0004 + */ + E0004: 'The NAME property of the component is not specified', + + /** + * @name ErrorsCore.E0005 + */ + E0005: 'Unknown device', + + /** + * @name ErrorsCore.E0006 + */ + E0006: 'Unknown endpoint key is requested', + + /** + * @name ErrorsCore.E0007 + */ + E0007: '\'Invalidate\' method is called outside the update transaction', + + /** + * @name ErrorsCore.E0008 + */ + E0008: 'Type of the option name is not appropriate to create an action', + + /** + * @name ErrorsCore.E0009 + */ + E0009: 'Component \'{0}\' has not been initialized for an element', + + /** + * @name ErrorsCore.E0010 + */ + E0010: 'Animation configuration with the \'{0}\' type requires \'{1}\' configuration as {2}', + + /** + * @name ErrorsCore.E0011 + */ + E0011: 'Unknown animation type \'{0}\'', + + /** + * @name ErrorsCore.E0012 + */ + E0012: 'jQuery version is too old. Please upgrade jQuery to 1.10.0 or later', + + /** + * @name ErrorsCore.E0013 + */ + E0013: 'KnockoutJS version is too old. Please upgrade KnockoutJS to 2.3.0 or later', + + /** + * @name ErrorsCore.E0014 + */ + E0014: 'The \'release\' method shouldn\'t be called for an unlocked Lock object', + + /** + * @name ErrorsCore.E0015 + */ + E0015: 'Queued task returned an unexpected result', + + /** + * @name ErrorsCore.E0017 + */ + E0017: 'Event namespace is not defined', + + /** + * @name ErrorsCore.E0018 + */ + E0018: 'DevExpress.ui.DevExpressPopup widget is required', + + /** + * @name ErrorsCore.E0020 + */ + E0020: 'Template engine \'{0}\' is not supported', + + /** + * @name ErrorsCore.E0021 + */ + E0021: 'Unknown theme is set: {0}', + + /** + * @name ErrorsCore.E0022 + */ + E0022: 'LINK[rel=DevExpress-theme] tags must go before DevExpress included scripts', + + /** + * @name ErrorsCore.E0023 + */ + E0023: 'Template name is not specified', + + /** + * @name ErrorsCore.E0024 + */ + E0024: 'DevExtreme bundle already included', + + /** + * @name ErrorsCore.E0025 + */ + E0025: 'Unexpected argument type', + + /** + * @name ErrorsCore.E0100 + */ + E0100: 'Unknown validation type is detected', + + /** + * @name ErrorsCore.E0101 + */ + E0101: 'Misconfigured range validation rule is detected', + + + /** + * @name ErrorsCore.E0102 + */ + E0102: 'Misconfigured comparison validation rule is detected', + + /** + * @name ErrorsCore.E0103 + */ + E0103: 'validationCallback of an asynchronous rule should return a jQuery or a native promise', + + /** + * @name ErrorsCore.E0110 + */ + E0110: 'Unknown validation group is detected', + + /** + * @name ErrorsCore.E0120 + */ + E0120: 'Adapter for a DevExpressValidator component cannot be configured', + + /** + * @name ErrorsCore.E0121 + */ + E0121: 'The \'customItem\' field of the \'onCustomItemCreating\' function\'s parameter should contain a custom item or Promise that is resolved after the item is created.', + + + /** + * @name ErrorsCore.W0000 + */ + W0000: '\'{0}\' is deprecated in {1}. {2}', + + /** + * @name ErrorsCore.W0001 + */ + W0001: '{0} - \'{1}\' option is deprecated in {2}. {3}', + + /** + * @name ErrorsCore.W0002 + */ + W0002: '{0} - \'{1}\' method is deprecated in {2}. {3}', + + /** + * @name ErrorsCore.W0003 + */ + W0003: '{0} - \'{1}\' property is deprecated in {2}. {3}', + + /** + * @name ErrorsCore.W0004 + */ + W0004: 'Timeout for theme loading is over: {0}', + + /** + * @name ErrorsCore.W0005 + */ + W0005: '\'{0}\' event is deprecated in {1}. {2}', + + /** + * @name ErrorsCore.W0006 + */ + W0006: 'Invalid recurrence rule: \'{0}\'', + + /** + * @name ErrorsCore.W0007 + */ + W0007: '\'{0}\' Globalize culture is not defined', + + /** + * @name ErrorsCore.W0008 + */ + W0008: 'Invalid view name: \'{0}\'', + + /** + * @name ErrorsCore.W0009 + */ + W0009: 'Invalid time zone name: \'{0}\'', + + /** + * @name ErrorsCore.W0010 + */ + W0010: '{0} is deprecated in {1}. {2}', + + /** + * @name ErrorsCore.W0011 + */ + W0011: 'Number parsing is invoked while the parser is not defined', + + /** + * @name ErrorsCore.W0012 + */ + W0012: 'Date parsing is invoked while the parser is not defined', + + /** + * @name ErrorsCore.W0013 + */ + W0013: '\'{0}\' file is deprecated in {1}. {2}', + + /** + * @name ErrorsCore.W0014 + */ + W0014: '{0} - \'{1}\' type is deprecated in {2}. {3}', + + /** + * @name ErrorsCore.W0015 + */ + W0015: 'Instead of returning a value from the \'{0}\' function, write it into the \'{1}\' field of the function\'s parameter.', + + /** + * @name ErrorsCore.W0016 + */ + W0016: 'The "{0}" option does not accept the "{1}" value since v{2}. {3}.', + /** + * @name ErrorsCore.W0017 + */ + W0017: 'Setting the "{0}" property with a function is deprecated since v21.2', + /** + * @name ErrorsCore.W0018 + */ + W0018: 'Setting the "position" property with a function is deprecated since v21.2' +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/events_strategy.js b/packages/f-theme-editor/farris-theme-editor/js/core/events_strategy.js new file mode 100644 index 0000000000000000000000000000000000000000..8f85567398279601ad3f64d32350391cac3c9bdc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/events_strategy.js @@ -0,0 +1,68 @@ +import Callbacks from './utils/callbacks'; +import { each } from './utils/iterator'; +import { isFunction, isPlainObject } from './utils/type'; + +export class EventsStrategy { + constructor(owner, options = {}) { + this._events = {}; + this._owner = owner; + this._options = options; + } + static create(owner, strategy) { + if(strategy) { + return isFunction(strategy) ? strategy(owner) : strategy; + } else { + return new EventsStrategy(owner); + } + } + + hasEvent(eventName) { + const callbacks = this._events[eventName]; + return callbacks ? callbacks.has() : false; + } + + fireEvent(eventName, eventArgs) { + const callbacks = this._events[eventName]; + if(callbacks) { + callbacks.fireWith(this._owner, eventArgs); + } + return this._owner; + } + + on(eventName, eventHandler) { + if(isPlainObject(eventName)) { + each(eventName, (e, h) => { + this.on(e, h); + }); + } else { + let callbacks = this._events[eventName]; + + if(!callbacks) { + callbacks = Callbacks({ + syncStrategy: this._options.syncStrategy + }); + this._events[eventName] = callbacks; + } + + const addFn = callbacks.originalAdd || callbacks.add; + addFn.call(callbacks, eventHandler); + } + } + + off(eventName, eventHandler) { + const callbacks = this._events[eventName]; + if(callbacks) { + if(isFunction(eventHandler)) { + callbacks.remove(eventHandler); + } else { + callbacks.empty(); + } + } + } + + dispose() { + each(this._events, (eventName, event) => { + event.empty(); + }); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/guid.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/guid.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..b84c5497c20898ab415531510ce05e27bcddcc22 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/guid.d.ts @@ -0,0 +1,21 @@ +/** + * @docid + * @namespace DevExpress.data + * @public + */ +export default class Guid { + constructor(); + constructor(value: string); + /** + * @docid + * @publicName toString() + * @public + */ + toString(): string; + /** + * @docid + * @publicName valueOf() + * @public + */ + valueOf(): string; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/guid.js b/packages/f-theme-editor/farris-theme-editor/js/core/guid.js new file mode 100644 index 0000000000000000000000000000000000000000..231b30918b6bd1e0d1350378d79828d4960f191f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/guid.js @@ -0,0 +1,57 @@ +import Class from './class'; + +const Guid = Class.inherit({ + + /** + * @name Guid.ctor + * @publicName ctor() + */ + /** + * @name Guid.ctor + * @publicName ctor(value) + * @param1 value:string + */ + ctor: function(value) { + if(value) { + value = String(value); + } + this._value = this._normalize(value || this._generate()); + }, + + _normalize: function(value) { + value = value.replace(/[^a-f0-9]/ig, '').toLowerCase(); + while(value.length < 32) { + value += '0'; + } + return [ + value.substr(0, 8), + value.substr(8, 4), + value.substr(12, 4), + value.substr(16, 4), + value.substr(20, 12) + ].join('-'); + }, + + _generate: function() { + let value = ''; + for(let i = 0; i < 32; i++) { + value += Math.round(Math.random() * 15).toString(16); + } + return value; + }, + + toString: function() { + return this._value; + }, + + valueOf: function() { + return this._value; + }, + + toJSON: function() { + return this._value; + } + +}); + +export default Guid; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/http_request.js b/packages/f-theme-editor/farris-theme-editor/js/core/http_request.js new file mode 100644 index 0000000000000000000000000000000000000000..63bc35b8e6c4495fb543e1a0d94cdc4ec2bf09aa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/http_request.js @@ -0,0 +1,11 @@ +import { getWindow } from './utils/window'; +const window = getWindow(); +import injector from './utils/dependency_injector'; + +const nativeXMLHttpRequest = { + getXhr: function() { + return new window.XMLHttpRequest(); + } +}; + +export default injector(nativeXMLHttpRequest); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/index.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..0acff4bfd5b19486d84468e724b06ba5fc9369b9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/index.d.ts @@ -0,0 +1,27 @@ +type KeyOf = T extends never ? never : keyof T; + +type KeysOf = + KeyOf | KeyOf | KeyOf | KeyOf | KeyOf | KeyOf | KeyOf | KeyOf; + +type Seal = T & { + [P in Exclude]?: never; +}; + +// Exact props check, see https://github.com/Microsoft/TypeScript/issues/12936 +export type Xor = + | Seal> + | Seal> + | Seal> + | Seal> + | Seal> + | Seal> + | Seal> + | Seal> + | Seal>; + +export type DeepPartial = T extends object ? { + [P in keyof T]?: DeepPartial; +} : T; + +// Omit does not exist in TS < 3.5.1 +export type Skip = Pick>; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/inferno_renderer.js b/packages/f-theme-editor/farris-theme-editor/js/core/inferno_renderer.js new file mode 100644 index 0000000000000000000000000000000000000000..816709251b61d4e4113c3e5d28777c203fa0aecc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/inferno_renderer.js @@ -0,0 +1,62 @@ +import { render } from 'inferno'; +import { InfernoEffectHost, hydrate } from '@devextreme/runtime/inferno'; +import { createElement } from 'inferno-create-element'; +import domAdapter from './dom_adapter'; +import { cleanDataRecursive } from './element_data'; +import injector from './utils/dependency_injector'; + +const remove = (element) => { + const { parentNode } = element; + + if(parentNode) { + cleanDataRecursive(element); + parentNode.$V = element.$V; + render(null, parentNode); + parentNode.appendChild(element); + element.innerHTML = ''; + delete parentNode.$V; + } + + delete element.$V; +}; + +export default injector({ + createElement: (component, props) => createElement(component, props), + + remove, + + onAfterRender: () => { + InfernoEffectHost.callEffects(); + }, + + onPreRender: () => { + InfernoEffectHost.lock(); + }, + + render: (component, props, container, replace) => { + if(!replace) { + const { parentNode } = container; + const nextNode = container?.nextSibling; + const rootNode = domAdapter.createElement('div'); + rootNode.appendChild(container); + const mountNode = domAdapter.createDocumentFragment().appendChild(rootNode); + const vNodeAlreadyExists = !!container.$V; + + vNodeAlreadyExists && remove(container); + + hydrate( + createElement(component, props), + mountNode, + ); + container.$V = mountNode.$V; + if(parentNode) { + parentNode.insertBefore(container, nextNode); + } + } else { + render( + createElement(component, props), container, + ); + } + }, +}); + diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/memorized_callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/core/memorized_callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..d40a930b66fe31a74163ad8188fdcc265228c230 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/memorized_callbacks.js @@ -0,0 +1,23 @@ +import { each } from '../core/utils/iterator'; +import Callbacks from './utils/callbacks'; + +export default class MemorizedCallbacks { + constructor() { + this.memory = []; + this.callbacks = Callbacks(); + } + + add(fn) { + each(this.memory, (_, item) => fn.apply(fn, item)); + this.callbacks.add(fn); + } + + remove(fn) { + this.callbacks.remove(fn); + } + + fire(...args) { + this.memory.push(args); + this.callbacks.fire.apply(this.callbacks, args); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/options.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/options.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..eae10cac6c0da450fbfe2d328afb3196be4cadd7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/options.d.ts @@ -0,0 +1,13 @@ +import { + Device, +} from './devices'; + +import { + DeepPartial, +} from './index'; + +/** @public */ +export type DefaultOptionsRule = { + device?: Device | Device[] | ((device: Device) => boolean); + options: DeepPartial; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/options/index.js b/packages/f-theme-editor/farris-theme-editor/js/core/options/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ea660776c05c5115884b6f33f80910afd582d3bb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/options/index.js @@ -0,0 +1,229 @@ +import { isFunction, isObject, type } from '../utils/type'; +import { equalByValue, noop } from '../utils/common'; +import { OptionManager } from './option_manager'; +import { getPathParts } from '../utils/data'; +import { getFieldName, getParentName, convertRulesToOptions, getNestedOptionValue } from './utils'; +import { extend } from '../utils/extend'; + +export class Options { + constructor(options, defaultOptions, optionsByReference, deprecatedOptions) { + this._deprecatedCallback; + this._startChangeCallback; + this._endChangeCallback; + + this._default = defaultOptions; + this._deprecated = deprecatedOptions; + + this._deprecatedNames = []; + this._initDeprecatedNames(); + + this._optionManager = new OptionManager( + options, + optionsByReference + ); + this._optionManager.onRelevantNamesPrepared((options, name, value, silent) => this._setRelevantNames(options, name, value, silent)); + this._cachedOptions = {}; + + this._rules = []; + } + + set _initial(value) { + this._initialOptions = value; + } + + get _initial() { + if(!this._initialOptions) { + const rulesOptions = this._getByRules(this.silent('defaultOptionsRules')); + + this._initialOptions = this._default; + this._optionManager._setByReference(this._initialOptions, rulesOptions); + } + + return this._initialOptions; + } + + _initDeprecatedNames() { + for(const optionName in this._deprecated) { + this._deprecatedNames.push(optionName); + } + } + + _getByRules(rules) { + rules = Array.isArray(rules) ? this._rules.concat(rules) : this._rules; + + return convertRulesToOptions(rules); + } + + _notifyDeprecated(option) { + const info = this._deprecated[option]; + + if(info) { + this._deprecatedCallback(option, info); + } + } + + _setRelevantNames(options, name, value, silent) { + if(name) { + const normalizedName = this._normalizeName(name, silent); + + if(normalizedName && normalizedName !== name) { + this._setField(options, normalizedName, value); + this._clearField(options, name); + } + } + } + + _setField(options, fullName, value) { + let fieldName = ''; + let fieldObject = null; + + do { + fieldName = fieldName ? `.${fieldName}` : ''; + fieldName = getFieldName(fullName) + fieldName; + fullName = getParentName(fullName); + fieldObject = fullName ? this._optionManager.get(options, fullName, false) : options; + } while(!fieldObject); + + fieldObject[fieldName] = value; + } + + _clearField(options, name) { + delete options[name]; + + const previousFieldName = getParentName(name); + const fieldObject = previousFieldName ? + this._optionManager.get(options, previousFieldName, false) : + options; + + if(fieldObject) { + delete fieldObject[getFieldName(name)]; + } + } + + _normalizeName(name, silent) { + if(this._deprecatedNames.length && name) { + for(let i = 0; i < this._deprecatedNames.length; i++) { + if(this._deprecatedNames[i] === name) { + const deprecate = this._deprecated[name]; + + if(deprecate) { + !silent && this._notifyDeprecated(name); + + return deprecate.alias || name; + } + } + } + } + + return name; + } + + addRules(rules) { + this._rules = rules.concat(this._rules); + } + + applyRules(rules) { + const options = this._getByRules(rules); + + this.silent(options); + } + + dispose() { + this._deprecatedCallback = noop; + this._startChangeCallback = noop; + this._endChangeCallback = noop; + this._optionManager.dispose(); + } + + onChanging(callBack) { + this._optionManager.onChanging(callBack); + } + + onChanged(callBack) { + this._optionManager.onChanged(callBack); + } + + onDeprecated(callBack) { + this._deprecatedCallback = callBack; + } + + onStartChange(callBack) { + this._startChangeCallback = callBack; + } + + onEndChange(callBack) { + this._endChangeCallback = callBack; + } + + isInitial(name) { + const value = this.silent(name); + const initialValue = this.initial(name); + const areFunctions = isFunction(value) && isFunction(initialValue); + + return areFunctions ? + value.toString() === initialValue.toString() : + equalByValue(value, initialValue); + } + + initial(name) { + return getNestedOptionValue(this._initial, name); + } + + option(options, value) { + const isGetter = arguments.length < 2 && type(options) !== 'object'; + + if(isGetter) { + return this._optionManager.get(undefined, this._normalizeName(options)); + } else { + this._startChangeCallback(); + try { + this._optionManager.set(options, value); + } finally { + this._endChangeCallback(); + } + } + } + + silent(options, value) { + const isGetter = arguments.length < 2 && type(options) !== 'object'; + + if(isGetter) { + return this._optionManager.get(undefined, options, undefined, true); + } else { + this._optionManager.set(options, value, undefined, true); + } + } + + reset(name) { + if(name) { + const fullPath = getPathParts(name); + const value = fullPath.reduce( + (value, field) => value ? value[field] : this.initial(field), null + ); + + const defaultValue = isObject(value) ? { ...value } : value; + + this._optionManager.set(name, defaultValue, false); + } + } + + getAliasesByName(name) { + return Object.keys(this._deprecated).filter( + aliasName => name === this._deprecated[aliasName].alias + ); + } + + isDeprecated(name) { + return Object.prototype.hasOwnProperty.call(this._deprecated, name); + } + + cache(name, options) { + const isGetter = arguments.length < 2; + + if(isGetter) { + return this._cachedOptions[name]; + } else { + this._cachedOptions[name] = extend(this._cachedOptions[name], options); + } + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/options/option_manager.js b/packages/f-theme-editor/farris-theme-editor/js/core/options/option_manager.js new file mode 100644 index 0000000000000000000000000000000000000000..3d73e856b048e4b4852fb5f86468a7e3bb395c68 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/options/option_manager.js @@ -0,0 +1,92 @@ +import { compileGetter, compileSetter, getPathParts } from '../utils/data'; +import { noop } from '../utils/common'; +import { equals } from '../utils/comparator'; +import { extend } from '../utils/extend'; +import { isDefined, isPlainObject } from '../utils/type'; +import { normalizeOptions } from './utils'; + +const cachedGetters = {}; +const cachedSetters = {}; + +export class OptionManager { + constructor(options, optionsByReference) { + this._options = options; + this._optionsByReference = optionsByReference; + + this._changingCallback; + this._changedCallback; + this._namePreparedCallbacks; + } + + _setByReference(options, rulesOptions) { + extend(true, options, rulesOptions); + + for(const fieldName in this._optionsByReference) { + if(Object.prototype.hasOwnProperty.call(rulesOptions, fieldName)) { + options[fieldName] = rulesOptions[fieldName]; + } + } + } + + _setPreparedValue(name, value, merge, silent) { + const previousValue = this.get(this._options, name, false); + + if(!equals(previousValue, value)) { + const path = getPathParts(name); + + !silent && this._changingCallback(name, previousValue, value); + cachedSetters[name] = cachedSetters[name] || compileSetter(name); + cachedSetters[name](this._options, value, { + functionsAsIs: true, + merge: isDefined(merge) ? merge : !this._optionsByReference[name], + unwrapObservables: path.length > 1 && !!this._optionsByReference[path[0]] + }); + !silent && this._changedCallback(name, value, previousValue); + } + } + + _prepareRelevantNames(options, name, value, silent) { + if(isPlainObject(value)) { + for(const valueName in value) { + this._prepareRelevantNames(options, `${name}.${valueName}`, value[valueName]); + } + } + + this._namePreparedCallbacks(options, name, value, silent); + } + + get(options = this._options, name, unwrapObservables) { + cachedGetters[name] = cachedGetters[name] || compileGetter(name); + + return cachedGetters[name](options, { functionsAsIs: true, unwrapObservables }); + } + + set(options, value, merge, silent) { + options = normalizeOptions(options, value); + + for(const name in options) { + this._prepareRelevantNames(options, name, options[name], silent); + } + + for(const name in options) { + this._setPreparedValue(name, options[name], merge, silent); + } + } + + onRelevantNamesPrepared(callBack) { + this._namePreparedCallbacks = callBack; + } + + onChanging(callBack) { + this._changingCallback = callBack; + } + + onChanged(callBack) { + this._changedCallback = callBack; + } + + dispose() { + this._changingCallback = noop; + this._changedCallback = noop; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e9ed90f997ef07766b22d5f6fcc24bac8eda632 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.d.ts @@ -0,0 +1,23 @@ +import { + Device, +} from '../devices'; + +import { + DefaultOptionsRule, +} from '../options'; + +export { + DefaultOptionsRule, +} from '../options'; + +export function convertRulesToOptions(rules: DefaultOptionsRule[]): T; + +export function normalizeOptions(options: string | object, value): { [name: string]: string }; + +export function deviceMatch(device: Device, filter): boolean; + +export function getFieldName(fullName: string): string; + +export function getParentName(fullName: string): string; + +export function createDefaultOptionRules(options?: DefaultOptionsRule[]): DefaultOptionsRule[]; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.js b/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..08be167a417550189602b01eca2c6f68ad42e5d8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/options/utils.js @@ -0,0 +1,39 @@ +import devices from '../devices'; +import { isEmptyObject, isFunction } from '../utils/type'; +import { findBestMatches } from '../utils/common'; +import { extend } from '../utils/extend'; +import { compileGetter } from '../utils/data'; + +const cachedGetters = {}; + +export const convertRulesToOptions = (rules) => { + const currentDevice = devices.current(); + return rules.reduce((options, { device, options: ruleOptions }) => { + const deviceFilter = device || {}; + const match = isFunction(deviceFilter) ? + deviceFilter(currentDevice) : + deviceMatch(currentDevice, deviceFilter); + + if(match) { + extend(true, options, ruleOptions); + } + return options; + }, {}); +}; + +export const normalizeOptions = (options, value) => { + return typeof options !== 'string' ? options : { [options]: value }; +}; + +export const deviceMatch = (device, filter) => isEmptyObject(filter) || findBestMatches(device, [filter]).length > 0; + +export const getFieldName = fullName => fullName.substr(fullName.lastIndexOf('.') + 1); + +export const getParentName = fullName => fullName.substr(0, fullName.lastIndexOf('.')); + +export const getNestedOptionValue = function(optionsObject, name) { + cachedGetters[name] = cachedGetters[name] || compileGetter(name); + return cachedGetters[name](optionsObject, { functionsAsIs: true }); +}; + +export const createDefaultOptionRules = (options = []) => options; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e8bff2f06eaa2daa66b64ee6eea4678c92c10a9d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.d.ts @@ -0,0 +1 @@ +export default Number; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.js b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.js new file mode 100644 index 0000000000000000000000000000000000000000..a594b516195382b6e74c700b4e235be3b39d8850 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/number.js @@ -0,0 +1,9 @@ +import { hasWindow, getWindow } from '../../core/utils/window'; +const number = hasWindow() ? getWindow().Number : Number; + +number.isFinite = number.isFinite || function(value) { + return typeof value === 'number' && isFinite(value); +}; + + +export default number; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/promise.js b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/promise.js new file mode 100644 index 0000000000000000000000000000000000000000..e52dc5e182699f5fb090c465cffd8ff626cf3d60 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/promise.js @@ -0,0 +1,29 @@ +import { Deferred, when } from '../../core/utils/deferred'; +import { hasWindow, getWindow } from '../../core/utils/window'; +let promise = hasWindow() ? getWindow().Promise : Promise; + +if(!promise) { + // NOTE: This is an incomplete Promise polyfill but it is enough for creation purposes + + promise = function(resolver) { + const d = new Deferred(); + resolver(d.resolve.bind(this), d.reject.bind(this)); + return d.promise(); + }; + + promise.resolve = function(val) { + return new Deferred().resolve(val).promise(); + }; + + promise.reject = function(val) { + return new Deferred().reject(val).promise(); + }; + + promise.all = function(promises) { + return when.apply(this, promises).then(function() { + return [].slice.call(arguments); + }); + }; +} + +export default promise; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/weak_map.js b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/weak_map.js new file mode 100644 index 0000000000000000000000000000000000000000..ef24e32cb8f0690962acec3704d4a9aee1dd7b69 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/polyfills/weak_map.js @@ -0,0 +1,49 @@ +import { inArray } from '../utils/array'; +import { hasWindow, getWindow } from '../utils/window'; +let weakMap = hasWindow() ? getWindow().WeakMap : WeakMap; + +if(!weakMap) { + // NOTE: This is an incomplete WeakMap polyfill but it is enough for creation purposes + + weakMap = function() { + const keys = []; + const values = []; + + this.set = function(key, value) { + const index = inArray(key, keys); + if(index === -1) { + keys.push(key); + values.push(value); + } else { + values[index] = value; + } + }; + + this.get = function(key) { + const index = inArray(key, keys); + if(index === -1) { + return undefined; + } + return values[index]; + }; + + this.has = function(key) { + const index = inArray(key, keys); + if(index === -1) { + return false; + } + return true; + }; + + this.delete = function(key) { + const index = inArray(key, keys); + if(index === -1) { + return; + } + keys.splice(index, 1); + values.splice(index, 1); + }; + }; +} + +export default weakMap; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/postponed_operations.js b/packages/f-theme-editor/farris-theme-editor/js/core/postponed_operations.js new file mode 100644 index 0000000000000000000000000000000000000000..91bbfa6d7da8002fccae74150f843b702fd68e12 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/postponed_operations.js @@ -0,0 +1,38 @@ +import { Deferred, when } from './utils/deferred'; +import { isDefined } from './utils/type'; + +export class PostponedOperations { + constructor() { + this._postponedOperations = {}; + } + + add(key, fn, postponedPromise) { + if(key in this._postponedOperations) { + postponedPromise && this._postponedOperations[key].promises.push(postponedPromise); + } else { + const completePromise = new Deferred(); + this._postponedOperations[key] = { + fn: fn, + completePromise: completePromise, + promises: postponedPromise ? [postponedPromise] : [] + }; + } + + return this._postponedOperations[key].completePromise.promise(); + } + + callPostponedOperations() { + for(const key in this._postponedOperations) { + const operation = this._postponedOperations[key]; + + if(isDefined(operation)) { + if(operation.promises && operation.promises.length) { + when(...operation.promises).done(operation.fn).then(operation.completePromise.resolve); + } else { + operation.fn().done(operation.completePromise.resolve); + } + } + } + this._postponedOperations = {}; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/renderer.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/renderer.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fa60ce4c9b0de6a1d0cacc12c04f92666763b09 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/renderer.d.ts @@ -0,0 +1,130 @@ +interface Coordinates { + left: number; + top: number; +} + +export interface dxElementWrapper { + + add(selector: string): this; + + addClass(className: string): this; + + after(element: Element | dxElementWrapper): this; + + append(element: Element | dxElementWrapper): this; + + appendTo(element: Element | dxElementWrapper): this; + + attr(attributeName: string, value: string | number | null): this; + + before(element: Element | dxElementWrapper): this; + + children(selector?: string): this; + + clone(): this; + + closest(selector: string): this; + + contents(): this; + + css(propertyName: string, value: string | number): this; + + data(key: string, value: any): this; + + detach(): this; + + each(func: (this: Element, index: number, element: Element) => boolean): this; + + empty(): this; + + eq(index: number): this; + + filter(selector: string): this; + + find(selector_element: string | Element | dxElementWrapper): this; + + first(): this; + + get(index: number): Element; + + hasClass(className: string): boolean; + + hide(): this; + + html(value: string): this; + + index(element: Element | dxElementWrapper): number; + + insertAfter(element: Element | dxElementWrapper): this; + + insertBefore(element: Element | dxElementWrapper): this; + + is(selector: string): boolean; + + last(): this; + + next(selector: string): this; + + not(selector: string): this; + + offset(): Coordinates | undefined; + + offsetParent(): this; + + parent(selector?: string): this; + + parents(selector: string): this; + + position(): Coordinates | undefined; + + prepend(element: Element | dxElementWrapper): this; + + prependTo(element: Element | dxElementWrapper): this; + + prev(): this; + + prop(propertyName: string, value: string | number | boolean): this; + + remove(element: Element | dxElementWrapper): this; + + removeAttr(attributeName: string): this; + + removeClass(className: string): this; + + removeData(key: string): this; + + replaceWith(element: Element | dxElementWrapper): this; + + scrollLeft(value: string | undefined): this; + + scrollTop(value: string | undefined): this; + + show(): this; + + siblings(): this; + + slice(start?: number, end?: number): this; + + splice(start: number, deleteCount?: number): this; + + text(text: string | number | boolean): this; + text(): string; + + toArray(): Element[]; + + toggle(value: string | undefined): this; + + toggleClass(className: string, value?: boolean): this; + + val(value?: string | string[] | number): this; + + wrap(wrappingElement: this | Element | string): this; + + wrapInner(wrappingElement: this | Element | string): this; + + length: number; +} + +declare function renderer(selector: string | Element | dxElementWrapper): dxElementWrapper; + +export default renderer; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/renderer.js b/packages/f-theme-editor/farris-theme-editor/js/core/renderer.js new file mode 100644 index 0000000000000000000000000000000000000000..a226a7e9fb55866101f734f756aae2aac138ca92 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/renderer.js @@ -0,0 +1,2 @@ +import rendererBase from './renderer_base'; +export default rendererBase.get(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/renderer_base.js b/packages/f-theme-editor/farris-theme-editor/js/core/renderer_base.js new file mode 100644 index 0000000000000000000000000000000000000000..85fadeb15d0d40db2964c4272c3f5c3291476300 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/renderer_base.js @@ -0,0 +1,800 @@ +import { cleanDataRecursive, removeData, data as elementData } from './element_data'; +import domAdapter from './dom_adapter'; +import { getWindow } from './utils/window'; +import { isObject, isWindow, isPlainObject, isString, isNumeric, isDefined, isFunction, type } from './utils/type'; +import { styleProp, normalizeStyleProp } from './utils/style'; +import { getOffset, getWindowByElement } from './utils/size'; +import { parseHTML, isTablePart } from './utils/html_parser'; + +const window = getWindow(); + +let renderer; +const initRender = function(selector, context) { + if(!selector) { + this.length = 0; + return this; + } + + if(typeof selector === 'string') { + if(selector === 'body') { + this[0] = context ? context.body : domAdapter.getBody(); + this.length = 1; + return this; + } + + context = context || domAdapter.getDocument(); + if(selector[0] === '<') { + this[0] = domAdapter.createElement(selector.slice(1, -1), context); + this.length = 1; + return this; + } + + [].push.apply(this, domAdapter.querySelectorAll(context, selector)); + return this; + } else if(domAdapter.isNode(selector) || isWindow(selector)) { + this[0] = selector; + this.length = 1; + return this; + } else if(Array.isArray(selector)) { + [].push.apply(this, selector); + return this; + } + + return renderer(selector.toArray ? selector.toArray() : [selector]); +}; + +renderer = function(selector, context) { + return new initRender(selector, context); +}; +renderer.fn = { dxRenderer: true }; +initRender.prototype = renderer.fn; + +const repeatMethod = function(methodName, args) { + for(let i = 0; i < this.length; i++) { + const item = renderer(this[i]); + item[methodName].apply(item, args); + } + return this; +}; + +const setAttributeValue = function(element, attrName, value) { + if(value !== undefined && value !== null) { + domAdapter.setAttribute(element, attrName, value); + } else { + domAdapter.removeAttribute(element, attrName); + } +}; + +initRender.prototype.show = function() { + return this.toggle(true); +}; + +initRender.prototype.hide = function() { + return this.toggle(false); +}; + +initRender.prototype.toggle = function(value) { + if(this[0]) { + this.toggleClass('dx-state-invisible', !value); + } + + return this; +}; + +initRender.prototype.attr = function(attrName, value) { + if(this.length > 1 && arguments.length > 1) return repeatMethod.call(this, 'attr', arguments); + if(!this[0]) { + if(isObject(attrName) || value !== undefined) { + return this; + } else { + return undefined; + } + } + if(!this[0].getAttribute) { + return this.prop(attrName, value); + } + if(typeof attrName === 'string' && arguments.length === 1) { + const result = this[0].getAttribute(attrName); + return result == null ? undefined : result; + } else if(isPlainObject(attrName)) { + for(const key in attrName) { + this.attr(key, attrName[key]); + } + } else { + setAttributeValue(this[0], attrName, value); + } + return this; +}; + +initRender.prototype.removeAttr = function(attrName) { + this[0] && domAdapter.removeAttribute(this[0], attrName); + return this; +}; + +initRender.prototype.prop = function(propName, value) { + if(!this[0]) return this; + if(typeof propName === 'string' && arguments.length === 1) { + return this[0][propName]; + } else if(isPlainObject(propName)) { + for(const key in propName) { + this.prop(key, propName[key]); + } + } else { + domAdapter.setProperty(this[0], propName, value); + } + + return this; +}; + +initRender.prototype.addClass = function(className) { + return this.toggleClass(className, true); +}; + +initRender.prototype.removeClass = function(className) { + return this.toggleClass(className, false); +}; + +initRender.prototype.hasClass = function(className) { + if(!this[0] || this[0].className === undefined) return false; + + const classNames = className.split(' '); + for(let i = 0; i < classNames.length; i++) { + if(this[0].classList) { + if(this[0].classList.contains(classNames[i])) return true; + } else { // IE9 + const className = isString(this[0].className) ? this[0].className : domAdapter.getAttribute(this[0], 'class'); + if((className || '').split(' ').indexOf(classNames[i]) >= 0) return true; + } + } + return false; +}; + +initRender.prototype.toggleClass = function(className, value) { + if(this.length > 1) { + return repeatMethod.call(this, 'toggleClass', arguments); + } + + if(!this[0] || !className) return this; + value = value === undefined ? !this.hasClass(className) : value; + + const classNames = className.split(' '); + for(let i = 0; i < classNames.length; i++) { + domAdapter.setClass(this[0], classNames[i], value); + } + return this; +}; + +initRender.prototype.html = function(value) { + if(!arguments.length) { + return this[0].innerHTML; + } + + this.empty(); + + if(typeof value === 'string' && !isTablePart(value) || typeof value === 'number') { + this[0].innerHTML = value; + + return this; + } + + return this.append(parseHTML(value)); +}; + +const appendElements = function(element, nextSibling) { + if(!this[0] || !element) return; + + if(typeof element === 'string') { + element = parseHTML(element); + } else if(element.nodeType) { + element = [element]; + } else if(isNumeric(element)) { + element = [domAdapter.createTextNode(element)]; + } + + for(let i = 0; i < element.length; i++) { + const item = element[i]; + let container = this[0]; + const wrapTR = container.tagName === 'TABLE' && item.tagName === 'TR'; + + if(wrapTR && container.tBodies && container.tBodies.length) { + container = container.tBodies[0]; + } + domAdapter.insertElement(container, item.nodeType ? item : item[0], nextSibling); + } +}; + +const setCss = function(name, value) { + if(!this[0] || !this[0].style) return; + + if(value === null || (typeof value === 'number' && isNaN(value))) { + return; + } + + name = styleProp(name); + for(let i = 0; i < this.length; i++) { + this[i].style[name] = normalizeStyleProp(name, value); + } +}; + +initRender.prototype.css = function(name, value) { + if(isString(name)) { + if(arguments.length === 2) { + setCss.call(this, name, value); + } else { + if(!this[0]) return; + + name = styleProp(name); + + const result = window.getComputedStyle(this[0])[name] || this[0].style[name]; + return isNumeric(result) ? result.toString() : result; + } + } else if(isPlainObject(name)) { + for(const key in name) { + setCss.call(this, key, name[key]); + } + } + + return this; +}; + +initRender.prototype.prepend = function(element) { + if(arguments.length > 1) { + for(let i = 0; i < arguments.length; i++) { + this.prepend(arguments[i]); + } + return this; + } + appendElements.apply(this, [element, this[0].firstChild]); + return this; +}; + +initRender.prototype.append = function(element) { + if(arguments.length > 1) { + for(let i = 0; i < arguments.length; i++) { + this.append(arguments[i]); + } + return this; + } + appendElements.apply(this, [element]); + return this; +}; + +initRender.prototype.prependTo = function(element) { + if(this.length > 1) { + for(let i = this.length - 1; i >= 0; i--) { + renderer(this[i]).prependTo(element); + } + return this; + } + + element = renderer(element); + if(element[0]) { + domAdapter.insertElement(element[0], this[0], element[0].firstChild); + } + + return this; +}; + +initRender.prototype.appendTo = function(element) { + if(this.length > 1) { + return repeatMethod.call(this, 'appendTo', arguments); + } + + domAdapter.insertElement(renderer(element)[0], this[0]); + return this; +}; + +initRender.prototype.insertBefore = function(element) { + if(element && element[0]) { + domAdapter.insertElement(element[0].parentNode, this[0], element[0]); + } + return this; +}; + +initRender.prototype.insertAfter = function(element) { + if(element && element[0]) { + domAdapter.insertElement(element[0].parentNode, this[0], element[0].nextSibling); + } + return this; +}; + +initRender.prototype.before = function(element) { + if(this[0]) { + domAdapter.insertElement(this[0].parentNode, element[0], this[0]); + } + return this; +}; + +initRender.prototype.after = function(element) { + if(this[0]) { + domAdapter.insertElement(this[0].parentNode, element[0], this[0].nextSibling); + } + return this; +}; + +initRender.prototype.wrap = function(wrapper) { + if(this[0]) { + const wrap = renderer(wrapper); + + wrap.insertBefore(this); + wrap.append(this); + } + + return this; +}; + +initRender.prototype.wrapInner = function(wrapper) { + const contents = this.contents(); + + if(contents.length) { + contents.wrap(wrapper); + } else { + this.append(wrapper); + } + + return this; +}; + +initRender.prototype.replaceWith = function(element) { + if(!(element && element[0])) return; + if(element.is(this)) return this; + + element.insertBefore(this); + this.remove(); + + return element; +}; + +initRender.prototype.remove = function() { + if(this.length > 1) { + return repeatMethod.call(this, 'remove', arguments); + } + + cleanDataRecursive(this[0], true); + domAdapter.removeElement(this[0]); + + return this; +}; + +initRender.prototype.detach = function() { + if(this.length > 1) { + return repeatMethod.call(this, 'detach', arguments); + } + + domAdapter.removeElement(this[0]); + + return this; +}; + +initRender.prototype.empty = function() { + if(this.length > 1) { + return repeatMethod.call(this, 'empty', arguments); + } + + cleanDataRecursive(this[0]); + domAdapter.setText(this[0], ''); + + return this; +}; + +initRender.prototype.clone = function() { + const result = []; + for(let i = 0; i < this.length; i++) { + result.push(this[i].cloneNode(true)); + } + return renderer(result); +}; + +initRender.prototype.text = function(value) { + if(!arguments.length) { + let result = ''; + + for(let i = 0; i < this.length; i++) { + result += this[i] && this[i].textContent || ''; + } + return result; + } + + const text = isFunction(value) ? value() : value; + + cleanDataRecursive(this[0], false); + domAdapter.setText(this[0], isDefined(text) ? text : ''); + + return this; +}; + +initRender.prototype.val = function(value) { + if(arguments.length === 1) { + return this.prop('value', isDefined(value) ? value : ''); + } + + return this.prop('value'); +}; + +initRender.prototype.contents = function() { + if(!this[0]) return renderer(); + + const result = []; + result.push.apply(result, this[0].childNodes); + return renderer(result); +}; + +initRender.prototype.find = function(selector) { + const result = renderer(); + if(!selector) { + return result; + } + + const nodes = []; + let i; + + if(typeof selector === 'string') { + selector = selector.trim(); + + for(i = 0; i < this.length; i++) { + const element = this[i]; + if(domAdapter.isElementNode(element)) { + const elementId = element.getAttribute('id'); + let queryId = elementId || 'dx-query-children'; + + if(!elementId) { + setAttributeValue(element, 'id', queryId); + } + queryId = '[id=\'' + queryId + '\'] '; + + const querySelector = queryId + selector.replace(/([^\\])(,)/g, '$1, ' + queryId); + nodes.push.apply(nodes, domAdapter.querySelectorAll(element, querySelector)); + setAttributeValue(element, 'id', elementId); + } else if(domAdapter.isDocument(element)) { + nodes.push.apply(nodes, domAdapter.querySelectorAll(element, selector)); + } + } + } else { + for(i = 0; i < this.length; i++) { + selector = domAdapter.isNode(selector) ? selector : selector[0]; + if(this[i] !== selector && this[i].contains(selector)) { + nodes.push(selector); + } + } + } + + return result.add(nodes); +}; + +const isVisible = function(_, element) { + if(!element.nodeType) return true; + return !!(element.offsetWidth || element.offsetHeight || element.getClientRects().length); +}; + +initRender.prototype.filter = function(selector) { + if(!selector) return renderer(); + + if(selector === ':visible') { + return this.filter(isVisible); + } else if(selector === ':hidden') { + return this.filter(function(_, element) { + return !isVisible(_, element); + }); + } + + const result = []; + for(let i = 0; i < this.length; i++) { + const item = this[i]; + if(domAdapter.isElementNode(item) && type(selector) === 'string') { + domAdapter.elementMatches(item, selector) && result.push(item); + } else if(domAdapter.isNode(selector) || isWindow(selector)) { + selector === item && result.push(item); + } else if(isFunction(selector)) { + selector.call(item, i, item) && result.push(item); + } else { + for(let j = 0; j < selector.length; j++) { + selector[j] === item && result.push(item); + } + } + } + + return renderer(result); +}; + +initRender.prototype.not = function(selector) { + const result = []; + const nodes = this.filter(selector).toArray(); + + for(let i = 0; i < this.length; i++) { + if(nodes.indexOf(this[i]) === -1) { + result.push(this[i]); + } + } + + return renderer(result); +}; + +initRender.prototype.is = function(selector) { + return !!this.filter(selector).length; +}; + +initRender.prototype.children = function(selector) { + let result = []; + for(let i = 0; i < this.length; i++) { + const nodes = this[i] ? this[i].childNodes : []; + for(let j = 0; j < nodes.length; j++) { + if(domAdapter.isElementNode(nodes[j])) { + result.push(nodes[j]); + } + } + } + + result = renderer(result); + + return selector ? result.filter(selector) : result; +}; + +initRender.prototype.siblings = function() { + const element = this[0]; + if(!element || !element.parentNode) { + return renderer(); + } + + const result = []; + const parentChildNodes = element.parentNode.childNodes || []; + + for(let i = 0; i < parentChildNodes.length; i++) { + const node = parentChildNodes[i]; + if(domAdapter.isElementNode(node) && node !== element) { + result.push(node); + } + } + + return renderer(result); +}; + +initRender.prototype.each = function(callback) { + for(let i = 0; i < this.length; i++) { + if(callback.call(this[i], i, this[i]) === false) { + break; + } + } +}; + +initRender.prototype.index = function(element) { + if(!element) { + return this.parent().children().index(this); + } + + element = renderer(element); + return this.toArray().indexOf(element[0]); +}; + +initRender.prototype.get = function(index) { + return this[index < 0 ? this.length + index : index]; +}; + +initRender.prototype.eq = function(index) { + index = index < 0 ? this.length + index : index; + return renderer(this[index]); +}; + +initRender.prototype.first = function() { + return this.eq(0); +}; + +initRender.prototype.last = function() { + return this.eq(-1); +}; + +initRender.prototype.parent = function(selector) { + if(!this[0]) return renderer(); + const result = renderer(this[0].parentNode); + return !selector || result.is(selector) ? result : renderer(); +}; + +initRender.prototype.parents = function(selector) { + const result = []; + let parent = this.parent(); + + while(parent && parent[0] && !domAdapter.isDocument(parent[0])) { + if(domAdapter.isElementNode(parent[0])) { + if(!selector || parent.is(selector)) { + result.push(parent.get(0)); + } + } + parent = parent.parent(); + } + return renderer(result); +}; + +initRender.prototype.closest = function(selector) { + if(this.is(selector)) { + return this; + } + + let parent = this.parent(); + while(parent && parent.length) { + if(parent.is(selector)) { + return parent; + } + parent = parent.parent(); + } + + return renderer(); +}; + +initRender.prototype.next = function(selector) { + if(!this[0]) return renderer(); + let next = renderer(this[0].nextSibling); + if(!arguments.length) { + return next; + } + while(next && next.length) { + if(next.is(selector)) return next; + next = next.next(); + } + return renderer(); +}; + +initRender.prototype.prev = function() { + if(!this[0]) return renderer(); + return renderer(this[0].previousSibling); +}; + +initRender.prototype.add = function(selector) { + const targets = renderer(selector); + const result = this.toArray(); + + for(let i = 0; i < targets.length; i++) { + const target = targets[i]; + if(result.indexOf(target) === -1) { + result.push(target); + } + } + + return renderer(result); +}; + +const emptyArray = []; +initRender.prototype.splice = function() { + return renderer(emptyArray.splice.apply(this, arguments)); +}; +initRender.prototype.slice = function() { + return renderer(emptyArray.slice.apply(this, arguments)); +}; +initRender.prototype.toArray = function() { + return emptyArray.slice.call(this); +}; + +initRender.prototype.offset = function() { + if(!this[0]) return; + + return getOffset(this[0]); +}; + +initRender.prototype.offsetParent = function() { + if(!this[0]) return renderer(); + + let offsetParent = renderer(this[0].offsetParent); + + while(offsetParent[0] && offsetParent.css('position') === 'static') { + offsetParent = renderer(offsetParent[0].offsetParent); + } + + offsetParent = offsetParent[0] ? offsetParent : renderer(domAdapter.getDocumentElement()); + + return offsetParent; +}; + +initRender.prototype.position = function() { + if(!this[0]) return; + + let offset; + const marginTop = parseFloat(this.css('marginTop')); + const marginLeft = parseFloat(this.css('marginLeft')); + + if(this.css('position') === 'fixed') { + offset = this[0].getBoundingClientRect(); + + return { + top: offset.top - marginTop, + left: offset.left - marginLeft + }; + } + + offset = this.offset(); + + const offsetParent = this.offsetParent(); + let parentOffset = { + top: 0, + left: 0 + }; + + if(offsetParent[0].nodeName !== 'HTML') { + parentOffset = offsetParent.offset(); + } + + parentOffset = { + top: parentOffset.top + parseFloat(offsetParent.css('borderTopWidth')), + left: parentOffset.left + parseFloat(offsetParent.css('borderLeftWidth')) + }; + + return { + top: offset.top - parentOffset.top - marginTop, + left: offset.left - parentOffset.left - marginLeft + }; +}; + +[{ + name: 'scrollLeft', + offsetProp: 'pageXOffset', + scrollWindow: function(win, value) { + win.scrollTo(value, win.pageYOffset); + } +}, { + name: 'scrollTop', + offsetProp: 'pageYOffset', + scrollWindow: function(win, value) { + win.scrollTo(win.pageXOffset, value); + } +}].forEach(function(directionStrategy) { + const propName = directionStrategy.name; + + initRender.prototype[propName] = function(value) { + if(!this[0]) { + return; + } + + const window = getWindowByElement(this[0]); + + if(value === undefined) { + return window ? window[directionStrategy.offsetProp] : this[0][propName]; + } + + if(window) { + directionStrategy.scrollWindow(window, value); + } else { + this[0][propName] = value; + } + return this; + }; +}); + +initRender.prototype.data = function(key, value) { + if(!this[0]) return; + + if(arguments.length < 2) { + return elementData.call(renderer, this[0], key); + } + + elementData.call(renderer, this[0], key, value); + return this; +}; + +initRender.prototype.removeData = function(key) { + this[0] && removeData(this[0], key); + + return this; +}; + +const rendererWrapper = function() { + return renderer.apply(this, arguments); +}; + +Object.defineProperty(rendererWrapper, 'fn', { + enumerable: true, + configurable: true, + + get: function() { + return renderer.fn; + }, + + set: function(value) { + renderer.fn = value; + } +}); + +export default { + set: function(strategy) { + renderer = strategy; + }, + get: function() { + return rendererWrapper; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/resize_observer.js b/packages/f-theme-editor/farris-theme-editor/js/core/resize_observer.js new file mode 100644 index 0000000000000000000000000000000000000000..b7babb33da1f3bca0d4300c9bb2eaf9cd12367f7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/resize_observer.js @@ -0,0 +1,47 @@ +import { noop } from './utils/common'; +import { getWindow, hasWindow } from './utils/window'; +const window = getWindow(); + +const ResizeObserverMock = { + observe: noop, + unobserve: noop, + disconnect: noop +}; + +class ResizeObserverSingleton { + constructor() { + if(!hasWindow() || !window.ResizeObserver) { + return ResizeObserverMock; + } + + this._callbacksMap = new Map(); + this._observer = new window.ResizeObserver((entries) => { + entries.forEach(entry => { + this._callbacksMap.get(entry.target)?.(entry); + }); + }); + } + + observe(element, callback) { + this._callbacksMap.set(element, callback); + this._observer.observe(element); + } + + unobserve(element) { + this._callbacksMap.delete(element); + this._observer.unobserve(element); + } + + disconnect() { + this._callbacksMap.clear(); + this._observer.disconnect(); + } +} + +const resizeObserverSingleton = new ResizeObserverSingleton(); + +///#DEBUG +resizeObserverSingleton.ResizeObserverSingleton = ResizeObserverSingleton; +///#ENDDEBUG + +export default resizeObserverSingleton; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..2451a16def8b228467e43aeee8f5bfb141d9f448 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.d.ts @@ -0,0 +1,17 @@ +/** + * @docid + * @publicName setTemplateEngine(name) + * @namespace DevExpress + * @public + */ +declare function setTemplateEngine(templateEngineName: string): void; + +/** + * @docid + * @publicName setTemplateEngine(options) + * @namespace DevExpress + * @public + */ +declare function setTemplateEngine(templateEngineOptions: { compile?: Function; render?: Function }): void; + +export default setTemplateEngine; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.js b/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.js new file mode 100644 index 0000000000000000000000000000000000000000..66317828997bd6a148db2a62e89da6350d87292a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/set_template_engine.js @@ -0,0 +1 @@ +export { setTemplateEngine as default } from './templates/template_engine_registry'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..dfc3921270acb1cfa451637814bfd2a796ec5f87 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.d.ts @@ -0,0 +1,4 @@ +export class TemplateManager { + anonymousTemplateName: string; + addDefaultTemplates(templates: Record): void; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.js b/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.js new file mode 100644 index 0000000000000000000000000000000000000000..22d81ac18dbf095b22bc6f551e67c63baafc6edd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/template_manager.js @@ -0,0 +1,161 @@ +import $ from './renderer'; +import { isDefined, isFunction, isRenderer } from './utils/type'; +import { noop } from './utils/common'; +import { extend } from './utils/extend'; +import { FunctionTemplate } from './templates/function_template'; +import { EmptyTemplate } from './templates/empty_template'; +import { + findTemplates, + suitableTemplatesByName, + templateKey, + getNormalizedTemplateArgs, + validateTemplateSource, + defaultCreateElement, + acquireTemplate, +} from './utils/template_manager'; + +const TEXT_NODE = 3; +const ANONYMOUS_TEMPLATE_NAME = 'template'; +const TEMPLATE_OPTIONS_NAME = 'dxTemplate'; +const TEMPLATE_WRAPPER_CLASS = 'dx-template-wrapper'; +const DX_POLYMORPH_WIDGET_TEMPLATE = new FunctionTemplate(({ model, parent }) => { + const widgetName = model.widget; + if(!widgetName) return $(); + + const widgetElement = $('
'); + const widgetOptions = model.options || {}; + + if(parent) { + parent._createComponent(widgetElement, widgetName, widgetOptions); + } else { + widgetElement[widgetName](widgetOptions); + } + + return widgetElement; +}); + +export class TemplateManager { + constructor(createElement, anonymousTemplateName) { + this._tempTemplates = []; + this._defaultTemplates = {}; + this._anonymousTemplateName = anonymousTemplateName || ANONYMOUS_TEMPLATE_NAME; + + this._createElement = createElement || defaultCreateElement; + this._createTemplateIfNeeded = this._createTemplateIfNeeded.bind(this); + } + + static createDefaultOptions() { + return { + integrationOptions: { + watchMethod: (fn, callback, options = {}) => { + if(!options.skipImmediate) { + callback(fn()); + } + return noop; + }, + templates: { 'dx-polymorph-widget': DX_POLYMORPH_WIDGET_TEMPLATE }, + useDeferUpdateForTemplates: true + } + }; + } + + get anonymousTemplateName() { + return this._anonymousTemplateName; + } + + addDefaultTemplates(templates) { + this._defaultTemplates = extend({}, this._defaultTemplates, templates); + } + + dispose() { + this._tempTemplates.forEach(tempTemplate => { + tempTemplate.template.dispose && tempTemplate.template.dispose(); + }); + this._tempTemplates = []; + } + + extractTemplates($el) { + const templates = this._extractTemplates($el); + const anonymousTemplateMeta = this._extractAnonymousTemplate($el); + return { templates, anonymousTemplateMeta }; + } + + _extractTemplates($el) { + const templates = findTemplates($el, TEMPLATE_OPTIONS_NAME); + const suitableTemplates = suitableTemplatesByName(templates); + + templates.forEach(({ element, options: { name } }) => { + if(element === suitableTemplates[name]) { + $(element).addClass(TEMPLATE_WRAPPER_CLASS).detach(); + } else { + $(element).remove(); + } + }); + + return Object.keys(suitableTemplates).map((name) => { + return { + name, + template: this._createTemplate(suitableTemplates[name]), + }; + }); + } + + _extractAnonymousTemplate($el) { + const $anonymousTemplate = $el.contents().detach(); + + const $notJunkTemplateContent = $anonymousTemplate.filter((_, element) => { + const isTextNode = element.nodeType === TEXT_NODE; + const isEmptyText = $(element).text().trim().length < 1; + + return !(isTextNode && isEmptyText); + }); + + return $notJunkTemplateContent.length > 0 + ? { template: this._createTemplate($anonymousTemplate), name: this._anonymousTemplateName } + : {}; + } + + _createTemplateIfNeeded(templateSource) { + const cachedTemplate = this._tempTemplates.filter(tempTemplate => + tempTemplate.source === templateKey(templateSource) + )[0]; + if(cachedTemplate) return cachedTemplate.template; + + const template = this._createTemplate(templateSource); + this._tempTemplates.push({ template, source: templateKey(templateSource) }); + return template; + } + + _createTemplate(templateSource) { + return this._createElement(validateTemplateSource(templateSource)); + } + + getTemplate(templateSource, templates, { isAsyncTemplate, skipTemplates }, context) { + if(!isFunction(templateSource)) { + return acquireTemplate( + templateSource, this._createTemplateIfNeeded, templates, isAsyncTemplate, skipTemplates, this._defaultTemplates + ); + } + + return new FunctionTemplate((options) => { + const templateSourceResult = templateSource.apply(context, getNormalizedTemplateArgs(options)); + + if(!isDefined(templateSourceResult)) { + return new EmptyTemplate(); + } + + let dispose = false; + const template = acquireTemplate(templateSourceResult, (templateSource) => { + if(templateSource.nodeType || isRenderer(templateSource) && !$(templateSource).is('script')) { + return new FunctionTemplate(() => templateSource); + } + dispose = true; + return this._createTemplate(templateSource); + }, templates, isAsyncTemplate, skipTemplates, this._defaultTemplates); + + const result = template.render(options); + dispose && template.dispose && template.dispose(); + return result; + }); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/bindable_template.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/bindable_template.js new file mode 100644 index 0000000000000000000000000000000000000000..f666ae2d1130b4bdc6b5c0145a6867c5ebf0b531 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/bindable_template.js @@ -0,0 +1,83 @@ +import $ from '../renderer'; +import { TemplateBase } from './template_base'; +import eventsEngine from '../../events/core/events_engine'; +import { removeEvent } from '../../events/remove'; +import { isPrimitive } from '../utils/type'; + +const watchChanges = (function() { + const globalWatch = (data, watchMethod, callback) => watchMethod(() => data, callback); + + const fieldsWatch = function(data, watchMethod, fields, fieldsMap, callback) { + const resolvedData = {}; + const missedFields = fields.slice(); + + const watchHandlers = fields.map(function(name) { + const fieldGetter = fieldsMap[name]; + + return watchMethod( + fieldGetter ? () => fieldGetter(data) : () => data[name], + function(value) { + resolvedData[name] = value; + + if(missedFields.length) { + const index = missedFields.indexOf(name); + if(index >= 0) { + missedFields.splice(index, 1); + } + } + + if(!missedFields.length) { + callback(resolvedData); + } + } + ); + }); + + return function() { + watchHandlers.forEach(dispose => dispose()); + }; + }; + + return function(rawData, watchMethod, fields, fieldsMap, callback) { + let fieldsDispose; + + const globalDispose = globalWatch(rawData, watchMethod, function(dataWithRawFields) { + fieldsDispose && fieldsDispose(); + + if(isPrimitive(dataWithRawFields)) { + callback(dataWithRawFields); + return; + } + + fieldsDispose = fieldsWatch(dataWithRawFields, watchMethod, fields, fieldsMap, callback); + }); + + return function() { + fieldsDispose && fieldsDispose(); + globalDispose && globalDispose(); + }; + }; + +})(); + +export class BindableTemplate extends TemplateBase { + constructor(render, fields, watchMethod, fieldsMap) { + super(); + this._render = render; + this._fields = fields; + this._fieldsMap = fieldsMap || {}; + this._watchMethod = watchMethod; + } + + _renderCore(options) { + const $container = $(options.container); + + const dispose = watchChanges(options.model, this._watchMethod, this._fields, this._fieldsMap, data => { + $container.empty(); + this._render($container, data, options.model); + }); + eventsEngine.on($container, removeEvent, dispose); + + return $container.contents(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/child_default_template.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/child_default_template.js new file mode 100644 index 0000000000000000000000000000000000000000..6a3d558302db77a0c805a67d08d1f216475a7547 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/child_default_template.js @@ -0,0 +1,8 @@ +import { TemplateBase } from './template_base'; + +export class ChildDefaultTemplate extends TemplateBase { + constructor(name) { + super(); + this.name = name; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/empty_template.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/empty_template.js new file mode 100644 index 0000000000000000000000000000000000000000..99c27225ae7dca4675fbbb8ae3f5218118b6c6bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/empty_template.js @@ -0,0 +1,8 @@ +import $ from '../renderer'; +import { TemplateBase } from './template_base'; + +export class EmptyTemplate extends TemplateBase { + _renderCore() { + return $(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..049b2316bbc14f2a59a76602240cae183726fa3f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.d.ts @@ -0,0 +1,9 @@ +import { DxElement } from '../element'; + +export class FunctionTemplate { + render(template: { + container: unknown; + model?: object; + transclude?: boolean; + }): DxElement; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.js new file mode 100644 index 0000000000000000000000000000000000000000..6a59e3e3704af8f759f0e508a4db491e38c7e3f4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/function_template.js @@ -0,0 +1,13 @@ +import { TemplateBase } from './template_base'; +import { normalizeTemplateElement } from '../utils/dom'; + +export class FunctionTemplate extends TemplateBase { + constructor(render) { + super(); + this._render = render; + } + + _renderCore(options) { + return normalizeTemplateElement(this._render(options)); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ebdfb9ed9599eb38b87e6fc5f0c26087f4cb41be --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.d.ts @@ -0,0 +1,30 @@ +import { + UserDefinedElement, +} from '../element'; + +export interface dxTemplateOptions { + /** + * @docid + * @public + */ + name?: string; +} +/** + * @docid + * @section uiWidgetMarkupComponents + * @type object + * @public + */ +export type dxTemplate = Template; + + // eslint-disable-next-line @typescript-eslint/no-extraneous-class +export class Template { + constructor(options?: dxTemplateOptions) +} + +/** + * @docid + * @section Common + * @public + */ +export type template = string | Function | UserDefinedElement; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.js new file mode 100644 index 0000000000000000000000000000000000000000..c22666007188a6e55dbfb02db2ec463fb100cff6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template.js @@ -0,0 +1,34 @@ +import $ from '../renderer'; +import { TemplateBase } from './template_base'; +import { normalizeTemplateElement } from '../utils/dom'; +import { getCurrentTemplateEngine, registerTemplateEngine, setTemplateEngine } from './template_engine_registry'; +import './template_engines'; + +registerTemplateEngine('default', { + compile: (element) => normalizeTemplateElement(element), + render: (template, model, index) => template.clone() +}); + +setTemplateEngine('default'); + +export class Template extends TemplateBase { + constructor(element) { + super(); + this._element = element; + } + + _renderCore(options) { + const transclude = options.transclude; + if(!transclude && !this._compiledTemplate) { + this._compiledTemplate = getCurrentTemplateEngine().compile(this._element); + } + + return $('
').append( + transclude ? this._element : getCurrentTemplateEngine().render(this._compiledTemplate, options.model, options.index) + ).contents(); + } + + source() { + return $(this._element).clone(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_base.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_base.js new file mode 100644 index 0000000000000000000000000000000000000000..881a11c547f0a4b41e746f4281cf5b9b5c3368e5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_base.js @@ -0,0 +1,49 @@ +import $ from '../renderer'; +import domAdapter from '../dom_adapter'; +import Callbacks from '../utils/callbacks'; +import { contains } from '../utils/dom'; +import { triggerShownEvent } from '../../events/visibility_change'; +import errors from '../errors'; + +export const renderedCallbacks = Callbacks({ syncStrategy: true }); + +export class TemplateBase { + render(options) { + options = options || {}; + + const onRendered = options.onRendered; + delete options.onRendered; + + const $result = this._renderCore(options); + + this._ensureResultInContainer($result, options.container); + renderedCallbacks.fire($result, options.container); + + onRendered && onRendered(); + return $result; + } + + _ensureResultInContainer($result, container) { + if(!container) { + return; + } + + const $container = $(container); + const resultInContainer = contains($container.get(0), $result.get(0)); + $container.append($result); + if(resultInContainer) { + return; + } + + const resultInBody = domAdapter.getBody().contains($container.get(0)); + if(!resultInBody) { + return; + } + + triggerShownEvent($result); + } + + _renderCore() { + throw errors.Error('E0001'); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engine_registry.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engine_registry.js new file mode 100644 index 0000000000000000000000000000000000000000..9fb63dcafcf4d965e4568cb44201bd38aaab636d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engine_registry.js @@ -0,0 +1,23 @@ +import { isString } from '../utils/type'; +import errors from '../errors'; + +const templateEngines = {}; +let currentTemplateEngine; + +export function registerTemplateEngine(name, templateEngine) { + templateEngines[name] = templateEngine; +} + + +export function setTemplateEngine(templateEngine) { + if(isString(templateEngine)) { + currentTemplateEngine = templateEngines[templateEngine]; + if(!currentTemplateEngine) { + throw errors.Error('E0020', templateEngine); + } + } else { + currentTemplateEngine = templateEngine; + } +} + +export function getCurrentTemplateEngine() { return currentTemplateEngine; } diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engines.js b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engines.js new file mode 100644 index 0000000000000000000000000000000000000000..c5ca41b939257eda072b57f461ce858efa6d220f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/templates/template_engines.js @@ -0,0 +1,58 @@ +import { extractTemplateMarkup } from '../utils/dom'; +import { registerTemplateEngine } from './template_engine_registry'; + +registerTemplateEngine('jquery-tmpl', { + compile: (element) => extractTemplateMarkup(element), + render: (template, data) => { + /* global jQuery */ + return jQuery.tmpl(template, data); + } +}); + +registerTemplateEngine('jsrender', { + compile: (element) => { + /* global jsrender */ + return (jQuery ? jQuery : jsrender).templates(extractTemplateMarkup(element)); + }, + render: (template, data) => template.render(data) +}); + +registerTemplateEngine('mustache', { + compile: (element) => { + /* global Mustache */ + return extractTemplateMarkup(element); + }, + render: (template, data) => Mustache.render(template, data) +}); + +registerTemplateEngine('hogan', { + compile: (element) => { + /* global Hogan */ + return Hogan.compile(extractTemplateMarkup(element)); + }, + render: (template, data) => template.render(data) +}); + +registerTemplateEngine('underscore', { + compile: (element) => { + /* global _ */ + return _.template(extractTemplateMarkup(element)); + }, + render: (template, data) => template(data) +}); + +registerTemplateEngine('handlebars', { + compile: (element) => { + /* global Handlebars */ + return Handlebars.compile(extractTemplateMarkup(element)); + }, + render: (template, data) => template(data) +}); + +registerTemplateEngine('doT', { + compile: (element) => { + /* global doT */ + return doT.template(extractTemplateMarkup(element)); + }, + render: (template, data) => template(data) +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/ajax.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/ajax.js new file mode 100644 index 0000000000000000000000000000000000000000..0e1675dd5a4a262a3b6f51a0cc510436fee34f96 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/ajax.js @@ -0,0 +1,360 @@ +import { Deferred } from './deferred'; +import domAdapter from '../../core/dom_adapter'; +import httpRequest from '../../core/http_request'; +import { getWindow, hasWindow } from '../../core/utils/window'; +const window = getWindow(); +import { extendFromObject } from './extend'; +import { isDefined } from './type'; +import Promise from '../polyfills/promise'; +import injector from './dependency_injector'; + +const SUCCESS = 'success'; +const ERROR = 'error'; +const TIMEOUT = 'timeout'; +const NO_CONTENT = 'nocontent'; +const PARSER_ERROR = 'parsererror'; + + +const isStatusSuccess = function(status) { + return 200 <= status && status < 300; +}; + +const hasContent = function(status) { + return status !== 204; +}; + +const paramsConvert = function(params) { + const result = []; + + for(const name in params) { + let value = params[name]; + + if(value === undefined) { + continue; + } + + if(value === null) { + value = ''; + } + + if(typeof value === 'function') { + value = value(); + } + + result.push(encodeURIComponent(name) + '=' + encodeURIComponent(value)); + } + + return result.join('&'); +}; + +const createScript = function(options) { + const script = domAdapter.createElement('script'); + for(const name in options) { + script[name] = options[name]; + } + return script; +}; + +const removeScript = function(scriptNode) { + scriptNode.parentNode.removeChild(scriptNode); +}; + +const appendToHead = function(element) { + return domAdapter.getHead().appendChild(element); +}; + +const evalScript = function(code) { + const script = createScript({ text: code }); + appendToHead(script); + removeScript(script); +}; + +const evalCrossDomainScript = function(url) { + const script = createScript({ src: url }); + + return new Promise(function(resolve, reject) { + const events = { + 'load': resolve, + 'error': reject + }; + + const loadHandler = function(e) { + events[e.type](); + removeScript(script); + }; + + for(const event in events) { + domAdapter.listen(script, event, loadHandler); + } + + appendToHead(script); + }); +}; + +const getAcceptHeader = function(options) { + + const dataType = options.dataType || '*'; + const scriptAccept = 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'; + const accepts = { + '*': '*/*', + text: 'text/plain', + html: 'text/html', + xml: 'application/xml, text/xml', + json: 'application/json, text/javascript', + jsonp: scriptAccept, + script: scriptAccept + }; + extendFromObject(accepts, options.accepts, true); + + return accepts[dataType] ? + accepts[dataType] + (dataType !== '*' ? ', */*; q=0.01' : '') : + accepts['*']; +}; + +const getContentTypeHeader = function(options) { + let defaultContentType; + if(options.data && !options.upload && getMethod(options) !== 'GET') { + defaultContentType = 'application/x-www-form-urlencoded;charset=utf-8'; + } + + return options.contentType || + defaultContentType; +}; + +const getDataFromResponse = function(xhr) { + return xhr.responseType && xhr.responseType !== 'text' || typeof xhr.responseText !== 'string' + ? xhr.response + : xhr.responseText; +}; + +const postProcess = function(deferred, xhr, dataType) { + + const data = getDataFromResponse(xhr); + + switch(dataType) { + case 'jsonp': + evalScript(data); + break; + + case 'script': + evalScript(data); + deferred.resolve(data, SUCCESS, xhr); + break; + + case 'json': + try { + deferred.resolve(JSON.parse(data), SUCCESS, xhr); + } catch(e) { + deferred.reject(xhr, PARSER_ERROR, e); + } + break; + + default: + deferred.resolve(data, SUCCESS, xhr); + } +}; + +const isCrossDomain = function(url) { + if(!hasWindow()) { + return true; + } + + let crossDomain = false; + const originAnchor = domAdapter.createElement('a'); + const urlAnchor = domAdapter.createElement('a'); + + originAnchor.href = window.location.href; + + try { + urlAnchor.href = url; + + // NOTE: IE11 + // eslint-disable-next-line no-self-assign + urlAnchor.href = urlAnchor.href; + + crossDomain = originAnchor.protocol + '//' + originAnchor.host !== + urlAnchor.protocol + '//' + urlAnchor.host; + } catch(e) { + crossDomain = true; + } + return crossDomain; +}; + +const setHttpTimeout = function(timeout, xhr) { + return timeout && setTimeout(function() { + xhr.customStatus = TIMEOUT; + xhr.abort(); + }, timeout); +}; + +const getJsonpOptions = function(options) { + if(options.dataType === 'jsonp') { + const random = Math.random().toString().replace(/\D/g, ''); + const callbackName = options.jsonpCallback || 'dxCallback' + Date.now() + '_' + random; + const callbackParameter = options.jsonp || 'callback'; + + options.data = options.data || {}; + options.data[callbackParameter] = callbackName; + + return callbackName; + } +}; + +const getRequestOptions = function(options, headers) { + + let params = options.data; + const paramsAlreadyString = typeof params === 'string'; + let url = options.url || window.location.href; + + if(!paramsAlreadyString && !options.cache) { + params = params || {}; + params['_'] = Date.now(); + } + + if(params && !options.upload) { + if(!paramsAlreadyString) { + params = paramsConvert(params); + } + + if(getMethod(options) === 'GET') { + if(params !== '') { + url += (url.indexOf('?') > -1 ? '&' : '?') + params; + } + params = null; + } else if(headers['Content-Type'] && headers['Content-Type'].indexOf('application/x-www-form-urlencoded') > -1) { + params = params.replace(/%20/g, '+'); + } + } + + return { + url: url, + parameters: params + }; +}; + +function getMethod(options) { + return (options.method || 'GET').toUpperCase(); +} + +const getRequestHeaders = function(options) { + const headers = options.headers || {}; + + headers['Content-Type'] = headers['Content-Type'] || getContentTypeHeader(options); + headers['Accept'] = headers['Accept'] || getAcceptHeader(options); + + if(!options.crossDomain && !headers['X-Requested-With']) { + headers['X-Requested-With'] = 'XMLHttpRequest'; + } + return headers; +}; + + +const sendRequest = function(options) { + const xhr = httpRequest.getXhr(); + const d = new Deferred(); + const result = d.promise(); + const async = isDefined(options.async) ? options.async : true; + const dataType = options.dataType; + const timeout = options.timeout || 0; + let timeoutId; + + options.crossDomain = isCrossDomain(options.url); + const needScriptEvaluation = dataType === 'jsonp' || dataType === 'script'; + + if(options.cache === undefined) { + options.cache = !needScriptEvaluation; + } + + const callbackName = getJsonpOptions(options); + const headers = getRequestHeaders(options); + const requestOptions = getRequestOptions(options, headers); + const url = requestOptions.url; + const parameters = requestOptions.parameters; + + if(callbackName) { + window[callbackName] = function(data) { + d.resolve(data, SUCCESS, xhr); + }; + } + + if(options.crossDomain && needScriptEvaluation) { + const reject = function() { + d.reject(xhr, ERROR); + }; + const resolve = function() { + if(dataType === 'jsonp') return; + d.resolve(null, SUCCESS, xhr); + }; + + evalCrossDomainScript(url).then(resolve, reject); + return result; + } + + if(options.crossDomain && !('withCredentials' in xhr)) { + d.reject(xhr, ERROR); + return result; + } + + xhr.open( + getMethod(options), + url, + async, + options.username, + options.password); + + if(async) { + xhr.timeout = timeout; + timeoutId = setHttpTimeout(timeout, xhr, d); + } + + xhr['onreadystatechange'] = function(e) { + if(xhr.readyState === 4) { + clearTimeout(timeoutId); + if(isStatusSuccess(xhr.status)) { + if(hasContent(xhr.status)) { + postProcess(d, xhr, dataType); + } else { + d.resolve(null, NO_CONTENT, xhr); + } + } else { + d.reject(xhr, xhr.customStatus || ERROR); + } + } + }; + + if(options.upload) { + xhr.upload['onprogress'] = options.upload['onprogress']; + xhr.upload['onloadstart'] = options.upload['onloadstart']; + xhr.upload['onabort'] = options.upload['onabort']; + } + + if(options.xhrFields) { + for(const field in options.xhrFields) { + xhr[field] = options.xhrFields[field]; + } + } + + if(options.responseType === 'arraybuffer') { + xhr.responseType = options.responseType; + } + + for(const name in headers) { + if(Object.prototype.hasOwnProperty.call(headers, name) && isDefined(headers[name])) { + xhr.setRequestHeader(name, headers[name]); + } + } + + if(options.beforeSend) { + options.beforeSend(xhr); + } + + xhr.send(parameters); + + result.abort = function() { + xhr.abort(); + }; + + return result; +}; + +export default injector({ sendRequest: sendRequest }); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/array.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/array.js new file mode 100644 index 0000000000000000000000000000000000000000..ac289962fac2d6210f38e004b54f6d3f624edafb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/array.js @@ -0,0 +1,144 @@ +import { isDefined } from './type'; +import { each } from './iterator'; +import { orderEach } from './object'; +import config from '../config'; + +export const isEmpty = function(entity) { + return Array.isArray(entity) && !entity.length; +}; + +export const wrapToArray = function(entity) { + return Array.isArray(entity) ? entity : [entity]; +}; + +export const inArray = function(value, object) { + if(!object) { + return -1; + } + const array = Array.isArray(object) ? object : object.toArray(); + + return array.indexOf(value); +}; + +export const intersection = function(a, b) { + if(!Array.isArray(a) || a.length === 0 || + !Array.isArray(b) || b.length === 0) { + return []; + } + + const result = []; + + each(a, function(_, value) { + const index = inArray(value, b); + + if(index !== -1) { + result.push(value); + } + }); + + return result; +}; + +export const uniqueValues = function(data) { + return [...new Set(data)]; +}; + +export const removeDuplicates = function(from, what) { + if(!Array.isArray(from) || from.length === 0) { + return []; + } + + const result = from.slice(); + + if(!Array.isArray(what) || what.length === 0) { + return result; + } + + each(what, function(_, value) { + const index = inArray(value, result); + + result.splice(index, 1); + }); + + return result; +}; + +export const normalizeIndexes = function(items, indexParameterName, currentItem, needIndexCallback) { + const indexedItems = {}; + let parameterIndex = 0; + const useLegacyVisibleIndex = config().useLegacyVisibleIndex; + + each(items, function(index, item) { + index = item[indexParameterName]; + if(index >= 0) { + indexedItems[index] = indexedItems[index] || []; + + if(item === currentItem) { + indexedItems[index].unshift(item); + } else { + indexedItems[index].push(item); + } + } else { + item[indexParameterName] = undefined; + } + }); + + if(!useLegacyVisibleIndex) { + each(items, function() { + if(!isDefined(this[indexParameterName]) && (!needIndexCallback || needIndexCallback(this))) { + while(indexedItems[parameterIndex]) { + parameterIndex++; + } + indexedItems[parameterIndex] = [this]; + parameterIndex++; + } + }); + } + + parameterIndex = 0; + + orderEach(indexedItems, function(index, items) { + each(items, function() { + if(index >= 0) { + this[indexParameterName] = parameterIndex++; + } + }); + }); + + if(useLegacyVisibleIndex) { + each(items, function() { + if(!isDefined(this[indexParameterName]) && (!needIndexCallback || needIndexCallback(this))) { + this[indexParameterName] = parameterIndex++; + } + }); + } + + return parameterIndex; +}; + +export const merge = function(array1, array2) { + for(let i = 0; i < array2.length; i++) { + array1[array1.length] = array2[i]; + } + + return array1; +}; + +export const find = function(array, condition) { + for(let i = 0; i < array.length; i++) { + if(condition(array[i])) { + return array[i]; + } + } +}; + +export const groupBy = (array, cb) => array.reduce( + (result, item) => ({ + ...result, + [cb(item)]: [ + ...(result[cb(item)] || []), + item, + ], + }), + {} +); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/array_compare.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/array_compare.js new file mode 100644 index 0000000000000000000000000000000000000000..0821bbfdb4b718ad836200d0a13ff10f18b9fd0d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/array_compare.js @@ -0,0 +1,98 @@ +import { isObject } from './type'; + +const getKeyWrapper = function(item, getKey) { + const key = getKey(item); + if(isObject(key)) { + try { + return JSON.stringify(key); + } catch(e) { + return key; + } + } + return key; +}; + +const getSameNewByOld = function(oldItem, newItems, newIndexByKey, getKey) { + const key = getKeyWrapper(oldItem, getKey); + return newItems[newIndexByKey[key]]; +}; + +export const isKeysEqual = function(oldKeys, newKeys) { + if(oldKeys.length !== newKeys.length) { + return false; + } + + for(let i = 0; i < newKeys.length; i++) { + if(oldKeys[i] !== newKeys[i]) { + return false; + } + } + + return true; +}; + +export const findChanges = function(oldItems, newItems, getKey, isItemEquals) { + const oldIndexByKey = {}; + const newIndexByKey = {}; + let addedCount = 0; + let removeCount = 0; + const result = []; + + oldItems.forEach(function(item, index) { + const key = getKeyWrapper(item, getKey); + oldIndexByKey[key] = index; + }); + + newItems.forEach(function(item, index) { + const key = getKeyWrapper(item, getKey); + newIndexByKey[key] = index; + }); + + const itemCount = Math.max(oldItems.length, newItems.length); + for(let index = 0; index < itemCount + addedCount; index++) { + const newItem = newItems[index]; + const oldNextIndex = index - addedCount + removeCount; + const nextOldItem = oldItems[oldNextIndex]; + const isRemoved = !newItem || (nextOldItem && !getSameNewByOld(nextOldItem, newItems, newIndexByKey, getKey)); + + if(isRemoved) { + if(nextOldItem) { + result.push({ + type: 'remove', + key: getKey(nextOldItem), + index: index, + oldItem: nextOldItem + }); + removeCount++; + index--; + } + } else { + const key = getKeyWrapper(newItem, getKey); + const oldIndex = oldIndexByKey[key]; + const oldItem = oldItems[oldIndex]; + if(!oldItem) { + addedCount++; + result.push({ + type: 'insert', + data: newItem, + index: index + }); + } else if(oldIndex === oldNextIndex) { + if(!isItemEquals(oldItem, newItem)) { + result.push({ + type: 'update', + data: newItem, + key: getKey(newItem), + index: index, + oldItem: oldItem + }); + } + } else { + return; + } + } + } + + return result; +}; + diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..85be9c39ac8a5505d0ec5ac7febe389bb6022361 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.d.ts @@ -0,0 +1,11 @@ +export type BrowserInfo = { + webkit?: boolean; + chrome?: boolean; + mozilla?: boolean; + safari?: boolean; + unknown?: boolean; + version?: string; +}; + +declare const browser: BrowserInfo; +export default browser; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.js new file mode 100644 index 0000000000000000000000000000000000000000..658f4f95b55f8c0d06d49d66e99cdc24ed73efdc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/browser.js @@ -0,0 +1,48 @@ +import { extend } from './extend'; +import { getNavigator } from './window'; +const navigator = getNavigator(); + +const webkitRegExp = /(webkit)[ /]([\w.]+)/; +const mozillaRegExp = /(mozilla)(?:.*? rv:([\w.]+))/; + +const browserFromUA = (ua) => { + ua = ua.toLowerCase(); + + const result = {}; + const matches = + webkitRegExp.exec(ua) || + ua.indexOf('compatible') < 0 && mozillaRegExp.exec(ua) || + []; + let browserName = matches[1]; + let browserVersion = matches[2]; + + if(browserName === 'webkit') { + result['webkit'] = true; + + if(ua.indexOf('chrome') >= 0 || ua.indexOf('crios') >= 0) { + browserName = 'chrome'; + browserVersion = /(?:chrome|crios)\/(\d+\.\d+)/.exec(ua); + browserVersion = browserVersion && browserVersion[1]; + } else if(ua.indexOf('fxios') >= 0) { + browserName = 'mozilla'; + browserVersion = /fxios\/(\d+\.\d+)/.exec(ua); + browserVersion = browserVersion && browserVersion[1]; + } else if(ua.indexOf('safari') >= 0 && /version|phantomjs/.test(ua)) { + browserName = 'safari'; + browserVersion = /(?:version|phantomjs)\/([0-9.]+)/.exec(ua); + browserVersion = browserVersion && browserVersion[1]; + } else { + browserName = 'unknown'; + browserVersion = /applewebkit\/([0-9.]+)/.exec(ua); + browserVersion = browserVersion && browserVersion[1]; + } + } + + if(browserName) { + result[browserName] = true; + result.version = browserVersion; + } + + return result; +}; +export default extend({ _fromUA: browserFromUA }, browserFromUA(navigator.userAgent)); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/call_once.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/call_once.js new file mode 100644 index 0000000000000000000000000000000000000000..1771ea8fac4213e42c730bc3dc9c53a4bf0eaf34 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/call_once.js @@ -0,0 +1,17 @@ +const callOnce = function(handler) { + let result; + + let wrappedHandler = function() { + result = handler.apply(this, arguments); + wrappedHandler = function() { + return result; + }; + return result; + }; + + return function() { + return wrappedHandler.apply(this, arguments); + }; +}; + +export default callOnce; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..9f9b82cc343d63e2039091fc5dca75c0c0e39eb2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/callbacks.js @@ -0,0 +1,109 @@ +const Callback = function(options) { + this._options = options || {}; + this._list = []; + this._queue = []; + this._firing = false; + this._fired = false; + this._firingIndexes = []; +}; + +Callback.prototype._fireCore = function(context, args) { + const firingIndexes = this._firingIndexes; + const list = this._list; + const stopOnFalse = this._options.stopOnFalse; + const step = firingIndexes.length; + + for(firingIndexes[step] = 0; firingIndexes[step] < list.length; firingIndexes[step]++) { + const result = list[firingIndexes[step]].apply(context, args); + + if(result === false && stopOnFalse) { + break; + } + } + + firingIndexes.pop(); +}; + + +Callback.prototype.add = function(fn) { + if(typeof fn === 'function' && (!this._options.unique || !this.has(fn))) { + this._list.push(fn); + } + return this; +}; + +Callback.prototype.remove = function(fn) { + const list = this._list; + const firingIndexes = this._firingIndexes; + const index = list.indexOf(fn); + + if(index > -1) { + list.splice(index, 1); + + if(this._firing && firingIndexes.length) { + for(let step = 0; step < firingIndexes.length; step++) { + if(index <= firingIndexes[step]) { + firingIndexes[step]--; + } + } + } + } + + return this; +}; + +Callback.prototype.has = function(fn) { + const list = this._list; + + return fn ? list.indexOf(fn) > -1 : !!list.length; +}; + +Callback.prototype.empty = function(fn) { + this._list = []; + + return this; +}; + +Callback.prototype.fireWith = function(context, args) { + const queue = this._queue; + + args = args || []; + args = args.slice ? args.slice() : args; + + if(this._options.syncStrategy) { + this._firing = true; + this._fireCore(context, args); + } else { + queue.push([context, args]); + if(this._firing) { + return; + } + + this._firing = true; + + while(queue.length) { + const memory = queue.shift(); + + this._fireCore(memory[0], memory[1]); + } + } + + this._firing = false; + this._fired = true; + + return this; +}; + +Callback.prototype.fire = function() { + this.fireWith(this, arguments); +}; + +Callback.prototype.fired = function() { + return this._fired; +}; + +const Callbacks = function(options) { + return new Callback(options); +}; + +export default Callbacks; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/common.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/common.js new file mode 100644 index 0000000000000000000000000000000000000000..0751793b29d0b0d87a6ebdf2f247177edf7ef587 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/common.js @@ -0,0 +1,319 @@ +import config from '../config'; +import Guid from '../guid'; +import { when, Deferred } from '../utils/deferred'; +import { toComparable } from './data'; +import { each } from './iterator'; +import { isDefined, isFunction, isString, isObject, type } from './type'; + +export const ensureDefined = function(value, defaultValue) { + return isDefined(value) ? value : defaultValue; +}; + +export const executeAsync = function(action, context/* , internal */) { + const deferred = new Deferred(); + const normalizedContext = context || this; + const task = { + promise: deferred.promise(), + abort: function() { + clearTimeout(timerId); + deferred.rejectWith(normalizedContext); + } + }; + + const callback = function() { + const result = action.call(normalizedContext); + + if(result && result.done && isFunction(result.done)) { + result.done(function() { + deferred.resolveWith(normalizedContext); + }); + } else { + deferred.resolveWith(normalizedContext); + } + }; + + const timerId = (arguments[2] || setTimeout)(callback, typeof context === 'number' ? context : 0); + + return task; +}; + +const delayedFuncs = []; +const delayedNames = []; +const delayedDeferreds = []; +let executingName; + +const deferExecute = function(name, func, deferred) { + if(executingName && executingName !== name) { + delayedFuncs.push(func); + delayedNames.push(name); + deferred = deferred || new Deferred(); + delayedDeferreds.push(deferred); + return deferred; + } else { + const oldExecutingName = executingName; + const currentDelayedCount = delayedDeferreds.length; + + executingName = name; + let result = func(); + + if(!result) { + if(delayedDeferreds.length > currentDelayedCount) { + result = when.apply(this, delayedDeferreds.slice(currentDelayedCount)); + } else if(deferred) { + deferred.resolve(); + } + } + + executingName = oldExecutingName; + + if(deferred && result && result.done) { + result.done(deferred.resolve).fail(deferred.reject); + } + + if(!executingName && delayedFuncs.length) { + (delayedNames.shift() === 'render' ? deferRender : deferUpdate)(delayedFuncs.shift(), delayedDeferreds.shift()); + } + return result || when(); + } +}; + +export const deferRender = function(func, deferred) { + return deferExecute('render', func, deferred); +}; + +export const deferUpdate = function(func, deferred) { + return deferExecute('update', func, deferred); +}; + +export const deferRenderer = function(func) { + return function() { + const that = this; + return deferExecute('render', function() { + return func.call(that); + }); + }; +}; + +export const deferUpdater = function(func) { + return function() { + const that = this; + return deferExecute('update', function() { + return func.call(that); + }); + }; +}; + +export const findBestMatches = function(targetFilter, items, mapFn) { + const bestMatches = []; + let maxMatchCount = 0; + + each(items, (index, itemSrc) => { + let matchCount = 0; + const item = mapFn ? mapFn(itemSrc) : itemSrc; + + each(targetFilter, (paramName, targetValue) => { + const value = item[paramName]; + + if(value === undefined) { + return; + } + + if(match(value, targetValue)) { + matchCount++; + return; + } + matchCount = -1; + return false; + }); + + if(matchCount < maxMatchCount) { + return; + } + if(matchCount > maxMatchCount) { + bestMatches.length = 0; + maxMatchCount = matchCount; + } + bestMatches.push(itemSrc); + }); + + return bestMatches; +}; + +const match = function(value, targetValue) { + if(Array.isArray(value) && Array.isArray(targetValue)) { + let mismatch = false; + + each(value, (index, valueItem) => { + if(valueItem !== targetValue[index]) { + mismatch = true; + return false; + } + }); + + if(mismatch) { + return false; + } + + return true; + } + + if(value === targetValue) { + return true; + } + + return false; +}; + +export const splitPair = function(raw) { + switch(type(raw)) { + case 'string': + return raw.split(/\s+/, 2); + case 'object': + return [raw.x ?? raw.h, raw.y ?? raw.v]; + case 'number': + return [raw]; + case 'array': + return raw; + default: + return null; + } +}; + +export const normalizeKey = function(id) { + let key = isString(id) ? id : id.toString(); + const arr = key.match(/[^a-zA-Z0-9_]/g); + + arr && each(arr, (_, sign) => { + key = key.replace(sign, '__' + sign.charCodeAt() + '__'); + }); + return key; +}; + +export const denormalizeKey = function(key) { + const arr = key.match(/__\d+__/g); + + arr && arr.forEach((char) => { + const charCode = parseInt(char.replace('__', '')); + + key = key.replace(char, String.fromCharCode(charCode)); + }); + + return key; +}; + +export const pairToObject = function(raw, preventRound) { + const pair = splitPair(raw); + let h = preventRound ? parseFloat(pair && pair[0]) : parseInt(pair && pair[0], 10); + let v = preventRound ? parseFloat(pair && pair[1]) : parseInt(pair && pair[1], 10); + + if(!isFinite(h)) { + h = 0; + } + if(!isFinite(v)) { + v = h; + } + + return { h, v }; +}; + +export const getKeyHash = function(key) { + if(key instanceof Guid) { + return key.toString(); + } else if(isObject(key) || Array.isArray(key)) { + try { + const keyHash = JSON.stringify(key); + return keyHash === '{}' ? key : keyHash; + } catch(e) { + return key; + } + } + + return key; +}; + +export const escapeRegExp = function(string) { + return string.replace(/[[\]{}\-()*+?.\\^$|\s]/g, '\\$&'); +}; + +export const applyServerDecimalSeparator = function(value) { + const separator = config().serverDecimalSeparator; + if(isDefined(value)) { + value = value.toString().replace('.', separator); + } + return value; +}; + +export const noop = function() {}; +export const asyncNoop = function() { return new Deferred().resolve().promise(); }; + +export const grep = function(elements, checkFunction, invert) { + const result = []; + let check; + const expectedCheck = !invert; + + for(let i = 0; i < elements.length; i++) { + check = !!checkFunction(elements[i], i); + + if(check === expectedCheck) { + result.push(elements[i]); + } + } + + return result; +}; + +const arraysEqualByValue = function(array1, array2, depth) { + if(array1.length !== array2.length) { + return false; + } + + for(let i = 0; i < array1.length; i++) { + if(!equalByValue(array1[i], array2[i], depth + 1)) { + return false; + } + } + + return true; +}; + +const objectsEqualByValue = function(object1, object2, depth, strict) { + for(const propertyName in object1) { + if( + Object.prototype.hasOwnProperty.call(object1, propertyName) && + !equalByValue(object1[propertyName], object2[propertyName], depth + 1, strict) + ) { + return false; + } + } + + for(const propertyName in object2) { + if(!(propertyName in object1)) { + return false; + } + } + + return true; +}; + +const maxEqualityDepth = 3; + +export const equalByValue = function(object1, object2, depth = 0, strict = true) { + + object1 = toComparable(object1, true); + object2 = toComparable(object2, true); + + // eslint-disable-next-line eqeqeq + const comparisonResult = strict ? object1 === object2 : object1 == object2; + + if(comparisonResult || depth >= maxEqualityDepth) { + return true; + } + + if(isObject(object1) && isObject(object2)) { + return objectsEqualByValue(object1, object2, depth, strict); + } else if(Array.isArray(object1) && Array.isArray(object2)) { + return arraysEqualByValue(object1, object2, depth); + } + + return false; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/comparator.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/comparator.js new file mode 100644 index 0000000000000000000000000000000000000000..36ba408364eaac911d00556e4d2f05c6a4db2a6c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/comparator.js @@ -0,0 +1,32 @@ +import domAdapter from '../dom_adapter'; +import { toComparable } from './data'; +import { isRenderer } from './type'; + +const hasNegation = function(oldValue, newValue) { + return (1 / oldValue) === (1 / newValue); +}; + +export const equals = function(oldValue, newValue) { + oldValue = toComparable(oldValue, true); + newValue = toComparable(newValue, true); + + if(oldValue && newValue && isRenderer(oldValue) && isRenderer(newValue)) { + return newValue.is(oldValue); + } + + const oldValueIsNaN = oldValue !== oldValue; + const newValueIsNaN = newValue !== newValue; + if(oldValueIsNaN && newValueIsNaN) { + return true; + } + + if(oldValue === 0 && newValue === 0) { + return hasNegation(oldValue, newValue); + } + + if(oldValue === null || typeof oldValue !== 'object' || domAdapter.isElementNode(oldValue)) { + return oldValue === newValue; + } + + return false; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/console.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/console.js new file mode 100644 index 0000000000000000000000000000000000000000..2a3ba1885858ad4d0c0d4f6215a8d62be14d1dbc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/console.js @@ -0,0 +1,33 @@ +/* global console */ +/* eslint no-console: off */ + +import { isFunction } from './type'; + +const noop = function() {}; +const getConsoleMethod = function(method) { + if(typeof console === 'undefined' || !isFunction(console[method])) { + return noop; + } + return console[method].bind(console); +}; + +export const logger = { + info: getConsoleMethod('info'), + warn: getConsoleMethod('warn'), + error: getConsoleMethod('error') +}; + +export const debug = (function() { + function assert(condition, message) { + if(!condition) { + throw new Error(message); + } + } + function assertParam(parameter, message) { + assert(parameter !== null && parameter !== undefined, message); + } + return { + assert: assert, + assertParam: assertParam + }; +}()); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..817c12a2d35dfff5ac291946f7b74d0ffcbaebe1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.d.ts @@ -0,0 +1,3 @@ +export function getPathParts(name: string): string[]; +export function compileGetter(expr: string): unknown; +export function compileSetter(expr: string): unknown; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.js new file mode 100644 index 0000000000000000000000000000000000000000..1767783e6b91aa861525c4dc33c82a3d57083e58 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/data.js @@ -0,0 +1,198 @@ +import errors from '../errors'; +import Class from '../class'; +import { deepExtendArraySafe } from './object'; +import { isObject, isPlainObject, isFunction, isDefined } from './type'; +import { each } from './iterator'; +import variableWrapper from './variable_wrapper'; +const unwrapVariable = variableWrapper.unwrap; +const isWrapped = variableWrapper.isWrapped; +const assign = variableWrapper.assign; + +const bracketsToDots = function(expr) { + return expr + .replace(/\[/g, '.') + .replace(/\]/g, ''); +}; + +export const getPathParts = function(name) { + return bracketsToDots(name).split('.'); +}; + +const readPropValue = function(obj, propName, options) { + options = options || { }; + if(propName === 'this') { + return unwrap(obj, options); + } + return unwrap(obj[propName], options); +}; + +const assignPropValue = function(obj, propName, value, options) { + if(propName === 'this') { + throw new errors.Error('E4016'); + } + + const propValue = obj[propName]; + if(options.unwrapObservables && isWrapped(propValue)) { + assign(propValue, value); + } else { + obj[propName] = value; + } +}; + +const prepareOptions = function(options) { + options = options || {}; + options.unwrapObservables = options.unwrapObservables !== undefined ? options.unwrapObservables : true; + return options; +}; + +function unwrap(value, options) { + return options.unwrapObservables ? unwrapVariable(value) : value; +} + +export const compileGetter = function(expr) { + if(arguments.length > 1) { + expr = [].slice.call(arguments); + } + + if(!expr || expr === 'this') { + return function(obj) { return obj; }; + } + + if(typeof expr === 'string') { + const path = getPathParts(expr); + + return function(obj, options) { + options = prepareOptions(options); + const functionAsIs = options.functionsAsIs; + const hasDefaultValue = 'defaultValue' in options; + let current = unwrap(obj, options); + + for(let i = 0; i < path.length; i++) { + if(!current) { + if(current == null && hasDefaultValue) { + return options.defaultValue; + } + break; + } + + const pathPart = path[i]; + + if(hasDefaultValue && isObject(current) && !(pathPart in current)) { + return options.defaultValue; + } + + let next = unwrap(current[pathPart], options); + + if(!functionAsIs && isFunction(next)) { + next = next.call(current); + } + + current = next; + } + + return current; + }; + } + + if(Array.isArray(expr)) { + return combineGetters(expr); + } + + if(isFunction(expr)) { + return expr; + } +}; + +function combineGetters(getters) { + const compiledGetters = {}; + for(let i = 0, l = getters.length; i < l; i++) { + const getter = getters[i]; + compiledGetters[getter] = compileGetter(getter); + } + + return function(obj, options) { + let result; + + each(compiledGetters, function(name) { + const value = this(obj, options); + + if(value === undefined) { + return; + } + + let current = (result || (result = {})); + const path = name.split('.'); + const last = path.length - 1; + + for(let i = 0; i < last; i++) { + const pathItem = path[i]; + if(!(pathItem in current)) { + current[pathItem] = { }; + } + current = current[pathItem]; + } + + current[path[last]] = value; + }); + return result; + }; +} + +const ensurePropValueDefined = function(obj, propName, value, options) { + if(isDefined(value)) { + return value; + } + + const newValue = {}; + assignPropValue(obj, propName, newValue, options); + + return newValue; +}; + +export const compileSetter = function(expr) { + expr = getPathParts(expr || 'this'); + const lastLevelIndex = expr.length - 1; + + return function(obj, value, options) { + options = prepareOptions(options); + let currentValue = unwrap(obj, options); + + expr.forEach(function(propertyName, levelIndex) { + let propertyValue = readPropValue(currentValue, propertyName, options); + const isPropertyFunc = !options.functionsAsIs && isFunction(propertyValue) && !isWrapped(propertyValue); + + if(levelIndex === lastLevelIndex) { + if(options.merge && isPlainObject(value) && (!isDefined(propertyValue) || isPlainObject(propertyValue))) { + propertyValue = ensurePropValueDefined(currentValue, propertyName, propertyValue, options); + deepExtendArraySafe(propertyValue, value, false, true); + } else if(isPropertyFunc) { + currentValue[propertyName](value); + } else { + assignPropValue(currentValue, propertyName, value, options); + } + } else { + propertyValue = ensurePropValueDefined(currentValue, propertyName, propertyValue, options); + if(isPropertyFunc) { + propertyValue = propertyValue.call(currentValue); + } + currentValue = propertyValue; + } + }); + }; +}; + +export const toComparable = function(value, caseSensitive) { + if(value instanceof Date) { + return value.getTime(); + } + + if(value && value instanceof Class && value.valueOf) { + return value.valueOf(); + } + + if(!caseSensitive && typeof value === 'string') { + return value.toLowerCase(); + } + + return value; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/date.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/date.js new file mode 100644 index 0000000000000000000000000000000000000000..1b4a49b341ac653f04d7c7f05cf604e452a51b8a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/date.js @@ -0,0 +1,696 @@ +import { isObject, isString, isDate, isDefined, isNumeric } from './type'; +import { adjust } from './math'; +import { each } from './iterator'; +import { camelize } from './inflector'; + +const dateUnitIntervals = ['millisecond', 'second', 'minute', 'hour', 'day', 'week', 'month', 'quarter', 'year']; + +const toMilliseconds = function(value) { + switch(value) { + case 'millisecond': + return 1; + case 'second': + return toMilliseconds('millisecond') * 1000; + case 'minute': + return toMilliseconds('second') * 60; + case 'hour': + return toMilliseconds('minute') * 60; + case 'day': + return toMilliseconds('hour') * 24; + case 'week': + return toMilliseconds('day') * 7; + case 'month': + return toMilliseconds('day') * 30; + case 'quarter': + return toMilliseconds('month') * 3; + case 'year': + return toMilliseconds('day') * 365; + default: + return 0; + } +}; + +const getDatesInterval = function(startDate, endDate, intervalUnit) { + const delta = endDate.getTime() - startDate.getTime(); + const millisecondCount = toMilliseconds(intervalUnit) || 1; + + return Math.floor(delta / millisecondCount); +}; + +const getNextDateUnit = function(unit, withWeeks) { + const interval = getDateUnitInterval(unit); + + switch(interval) { + case 'millisecond': + return 'second'; + case 'second': + return 'minute'; + case 'minute': + return 'hour'; + case 'hour': + return 'day'; + case 'day': + return withWeeks ? 'week' : 'month'; + case 'week': + return 'month'; + case 'month': + return 'quarter'; + case 'quarter': + return 'year'; + case 'year': + return 'year'; + default: + return 0; + } +}; + +const convertMillisecondsToDateUnits = function(value) { + let i; + let dateUnitCount; + let dateUnitInterval; + const dateUnitIntervals = ['millisecond', 'second', 'minute', 'hour', 'day', 'month', 'year']; + const result = {}; + + for(i = dateUnitIntervals.length - 1; i >= 0; i--) { + dateUnitInterval = dateUnitIntervals[i]; + dateUnitCount = Math.floor(value / toMilliseconds(dateUnitInterval)); + if(dateUnitCount > 0) { + result[dateUnitInterval + 's'] = dateUnitCount; + value -= convertDateUnitToMilliseconds(dateUnitInterval, dateUnitCount); + } + } + return result; +}; + +const dateToMilliseconds = function(tickInterval) { + let milliseconds = 0; + if(isObject(tickInterval)) { + each(tickInterval, function(key, value) { + milliseconds += convertDateUnitToMilliseconds(key.substr(0, key.length - 1), value); + }); + } + if(isString(tickInterval)) { + milliseconds = convertDateUnitToMilliseconds(tickInterval, 1); + } + return milliseconds; +}; + +function convertDateUnitToMilliseconds(dateUnit, count) { + return toMilliseconds(dateUnit) * count; +} + +// refactor for performance +function getDateUnitInterval(tickInterval) { + let maxInterval = -1; + let i; + + if(isString(tickInterval)) { + return tickInterval; + } + + if(isObject(tickInterval)) { + each(tickInterval, function(key, value) { + for(i = 0; i < dateUnitIntervals.length; i++) { + if(value && (key === dateUnitIntervals[i] + 's' || key === dateUnitIntervals[i]) && maxInterval < i) { + maxInterval = i; + } + } + }); + + return dateUnitIntervals[maxInterval]; + } + return ''; +} + +// T375972 +const tickIntervalToFormatMap = { + millisecond: 'millisecond', + second: 'longtime', + minute: 'shorttime', + hour: 'shorttime', + day: 'day', + week: 'day', + month: 'month', + quarter: 'quarter', + year: 'year' +}; + +// Because of changes in formatting (Globalize has been updated) common date formatting has been changed. +// The purpose of the following method is to preserve original dates formatting in axes and range selector slider markers. +function getDateFormatByTickInterval(tickInterval) { + return tickIntervalToFormatMap[getDateUnitInterval(tickInterval)] || ''; +} + +const getQuarter = function(month) { + return Math.floor(month / 3); +}; + +const getFirstQuarterMonth = function(month) { + return getQuarter(month) * 3; +}; + +function correctDateWithUnitBeginning(date, dateInterval, withCorrection, firstDayOfWeek) { + date = new Date(date.getTime()); + const oldDate = new Date(date.getTime()); + let firstQuarterMonth; + let month; + const dateUnitInterval = getDateUnitInterval(dateInterval); + + switch(dateUnitInterval) { + case 'second': + date = new Date(Math.floor(oldDate.getTime() / 1000) * 1000); + break; + case 'minute': + date = new Date(Math.floor(oldDate.getTime() / 60000) * 60000); + break; + case 'hour': + date = new Date(Math.floor(oldDate.getTime() / 3600000) * 3600000); + break; + case 'year': + date.setMonth(0); + /* falls through */ + case 'month': + date.setDate(1); + /* falls through */ + case 'day': + date.setHours(0, 0, 0, 0); + break; + case 'week': + date = getFirstWeekDate(date, firstDayOfWeek || 0); + date.setHours(0, 0, 0, 0); + break; + case 'quarter': + firstQuarterMonth = getFirstQuarterMonth(date.getMonth()); + month = date.getMonth(); + + date.setDate(1); + date.setHours(0, 0, 0, 0); + if(month !== firstQuarterMonth) { + date.setMonth(firstQuarterMonth); + } + break; + } + + if(withCorrection && dateUnitInterval !== 'hour' && dateUnitInterval !== 'minute' && dateUnitInterval !== 'second') { + fixTimezoneGap(oldDate, date); + } + return date; +} + +function trimTime(date) { + return correctDateWithUnitBeginning(date, 'day'); +} + +const setToDayEnd = function(date) { + const result = trimTime(date); + + result.setDate(result.getDate() + 1); + return new Date(result.getTime() - 1); +}; + + +const getDatesDifferences = function(date1, date2) { + let counter = 0; + + const differences = { + year: date1.getFullYear() !== date2.getFullYear(), + month: date1.getMonth() !== date2.getMonth(), + day: date1.getDate() !== date2.getDate(), + hour: date1.getHours() !== date2.getHours(), + minute: date1.getMinutes() !== date2.getMinutes(), + second: date1.getSeconds() !== date2.getSeconds(), + millisecond: date1.getMilliseconds() !== date2.getMilliseconds() + }; + + each(differences, function(key, value) { + if(value) { + counter++; + } + }); + if(counter === 0 && getTimezonesDifference(date1, date2) !== 0) { + differences.hour = true; + counter++; + } + + differences.count = counter; + return differences; +}; + +function addDateInterval(value, interval, dir) { + const result = new Date(value.getTime()); + const intervalObject = isString(interval) ? getDateIntervalByString(interval.toLowerCase()) + : isNumeric(interval) ? convertMillisecondsToDateUnits(interval) + : interval; + if(intervalObject.years) { + result.setFullYear(result.getFullYear() + intervalObject.years * dir); + } + if(intervalObject.quarters) { + result.setMonth(result.getMonth() + 3 * intervalObject.quarters * dir); + } + if(intervalObject.months) { + result.setMonth(result.getMonth() + intervalObject.months * dir); + } + if(intervalObject.weeks) { + result.setDate(result.getDate() + 7 * intervalObject.weeks * dir); + } + if(intervalObject.days) { + result.setDate(result.getDate() + intervalObject.days * dir); + } + if(intervalObject.hours) { + result.setTime(result.getTime() + intervalObject.hours * 3600000 * dir); + } + if(intervalObject.minutes) { + result.setTime(result.getTime() + intervalObject.minutes * 60000 * dir); + } + if(intervalObject.seconds) { + result.setTime(result.getTime() + intervalObject.seconds * 1000 * dir); + } + if(intervalObject.milliseconds) { + result.setTime(result.getTime() + intervalObject.milliseconds * dir); + } + return result; +} + +const addInterval = function(value, interval, isNegative) { + const dir = isNegative ? -1 : +1; + return isDate(value) ? addDateInterval(value, interval, dir) : adjust(value + interval * dir, interval); +}; + +const getSequenceByInterval = function(min, max, interval) { + const intervals = []; + let cur; + + intervals.push(isDate(min) ? new Date(min.getTime()) : min); + cur = min; + while(cur < max) { + cur = addInterval(cur, interval); + intervals.push(cur); + } + return intervals; +}; + +const getViewFirstCellDate = function(viewType, date) { + if(viewType === 'month') { return createDateWithFullYear(date.getFullYear(), date.getMonth(), 1); } + if(viewType === 'year') { return createDateWithFullYear(date.getFullYear(), 0, date.getDate()); } + if(viewType === 'decade') { return createDateWithFullYear(getFirstYearInDecade(date), date.getMonth(), date.getDate()); } + if(viewType === 'century') { return createDateWithFullYear(getFirstDecadeInCentury(date), date.getMonth(), date.getDate()); } +}; + +const getViewLastCellDate = function(viewType, date) { + if(viewType === 'month') { return createDateWithFullYear(date.getFullYear(), date.getMonth(), getLastMonthDay(date)); } + if(viewType === 'year') { return createDateWithFullYear(date.getFullYear(), 11, date.getDate()); } + if(viewType === 'decade') { return createDateWithFullYear(getFirstYearInDecade(date) + 9, date.getMonth(), date.getDate()); } + if(viewType === 'century') { return createDateWithFullYear(getFirstDecadeInCentury(date) + 90, date.getMonth(), date.getDate()); } +}; + +const getViewMinBoundaryDate = function(viewType, date) { + const resultDate = createDateWithFullYear(date.getFullYear(), date.getMonth(), 1); + + if(viewType === 'month') { + return resultDate; + } + + resultDate.setMonth(0); + + if(viewType === 'year') { + return resultDate; + } + + if(viewType === 'decade') { + resultDate.setFullYear(getFirstYearInDecade(date)); + } + + if(viewType === 'century') { + resultDate.setFullYear(getFirstDecadeInCentury(date)); + } + + return resultDate; +}; + +const getViewMaxBoundaryDate = function(viewType, date) { + const resultDate = new Date(date); + resultDate.setDate(getLastMonthDay(date)); + + if(viewType === 'month') { + return resultDate; + } + + resultDate.setMonth(11); + resultDate.setDate(getLastMonthDay(resultDate)); + + if(viewType === 'year') { + return resultDate; + } + + if(viewType === 'decade') { + resultDate.setFullYear(getFirstYearInDecade(date) + 9); + } + + if(viewType === 'century') { + resultDate.setFullYear(getFirstDecadeInCentury(date) + 99); + } + + return resultDate; +}; + +function getLastMonthDay(date) { + const resultDate = createDateWithFullYear(date.getFullYear(), date.getMonth() + 1, 0); + return resultDate.getDate(); +} + +const getViewUp = function(typeView) { + switch(typeView) { + case 'month': + return 'year'; + case 'year': + return 'decade'; + case 'decade': + return 'century'; + default: + break; + } +}; + +const getViewDown = function(typeView) { + switch(typeView) { + case 'century': + return 'decade'; + case 'decade': + return 'year'; + case 'year': + return 'month'; + default: + break; + } +}; + +const getDifferenceInMonth = function(typeView) { + let difference = 1; + + if(typeView === 'year') { difference = 12; } + if(typeView === 'decade') { difference = 12 * 10; } + if(typeView === 'century') { difference = 12 * 100; } + + return difference; +}; + +const getDifferenceInMonthForCells = function(typeView) { + let difference = 1; + + if(typeView === 'decade') { difference = 12; } + if(typeView === 'century') { difference = 12 * 10; } + + return difference; +}; + +function getDateIntervalByString(intervalString) { + const result = {}; + switch(intervalString) { + case 'year': + result.years = 1; + break; + case 'month': + result.months = 1; + break; + case 'quarter': + result.months = 3; + break; + case 'week': + result.weeks = 1; + break; + case 'day': + result.days = 1; + break; + case 'hour': + result.hours = 1; + break; + case 'minute': + result.minutes = 1; + break; + case 'second': + result.seconds = 1; + break; + case 'millisecond': + result.milliseconds = 1; + break; + } + return result; +} + +function sameDate(date1, date2) { + return sameMonthAndYear(date1, date2) && date1.getDate() === date2.getDate(); +} + +function sameMonthAndYear(date1, date2) { + return sameYear(date1, date2) && date1.getMonth() === date2.getMonth(); +} + +function sameYear(date1, date2) { + return date1 && date2 && date1.getFullYear() === date2.getFullYear(); +} + +const sameDecade = function(date1, date2) { + if(!isDefined(date1) || !isDefined(date2)) return; + + const startDecadeDate1 = date1.getFullYear() - date1.getFullYear() % 10; + const startDecadeDate2 = date2.getFullYear() - date2.getFullYear() % 10; + + return date1 && date2 && startDecadeDate1 === startDecadeDate2; +}; + +const sameCentury = function(date1, date2) { + if(!isDefined(date1) || !isDefined(date2)) return; + + const startCenturyDate1 = date1.getFullYear() - date1.getFullYear() % 100; + const startCenturyDate2 = date2.getFullYear() - date2.getFullYear() % 100; + + return date1 && date2 && startCenturyDate1 === startCenturyDate2; +}; + +function getFirstDecadeInCentury(date) { + return date && date.getFullYear() - date.getFullYear() % 100; +} + +function getFirstYearInDecade(date) { + return date && date.getFullYear() - date.getFullYear() % 10; +} + +const getShortDateFormat = function() { + return 'yyyy/MM/dd'; +}; + +const getFirstMonthDate = function(date) { + if(!isDefined(date)) return; + return createDateWithFullYear(date.getFullYear(), date.getMonth(), 1); +}; + +const getLastMonthDate = function(date) { + if(!isDefined(date)) return; + return createDateWithFullYear(date.getFullYear(), date.getMonth() + 1, 0); +}; + +function getFirstWeekDate(date, firstDayOfWeek) { + const delta = (date.getDay() - firstDayOfWeek + 7) % 7; + + const result = new Date(date); + result.setDate(date.getDate() - delta); + + return result; +} + +const normalizeDateByWeek = function(date, currentDate) { + const differenceInDays = dateUtils.getDatesInterval(date, currentDate, 'day'); + let resultDate = new Date(date); + + if(differenceInDays >= 6) { + resultDate = new Date(resultDate.setDate(resultDate.getDate() + 7)); + } + + return resultDate; +}; + +const dateInRange = function(date, min, max, format) { + if(format === 'date') { + min = min && dateUtils.correctDateWithUnitBeginning(min, 'day'); + max = max && dateUtils.correctDateWithUnitBeginning(max, 'day'); + date = date && dateUtils.correctDateWithUnitBeginning(date, 'day'); + } + + return normalizeDate(date, min, max) === date; +}; + +const intervalsOverlap = function(options) { + const { + firstMin, + firstMax, + secondMin, + secondMax + } = options; + + return (firstMin <= secondMin && secondMin <= firstMax) || + (firstMin > secondMin && firstMin < secondMax) || + (firstMin < secondMax && firstMax > secondMax); +}; + +const dateTimeFromDecimal = function(number) { + const hours = Math.floor(number); + const minutes = (number % 1) * 60; + + return { + hours: hours, + minutes: minutes + }; +}; + +const roundDateByStartDayHour = function(date, startDayHour) { + const startTime = this.dateTimeFromDecimal(startDayHour); + const result = new Date(date); + + if(date.getHours() === startTime.hours && date.getMinutes() < startTime.minutes || date.getHours() < startTime.hours) { + result.setHours(startTime.hours, startTime.minutes, 0, 0); + } + + return result; +}; + +function normalizeDate(date, min, max) { + let normalizedDate = date; + + if(!isDefined(date)) { + return date; + } + + if(isDefined(min) && date < min) { + normalizedDate = min; + } + + if(isDefined(max) && date > max) { + normalizedDate = max; + } + + return normalizedDate; +} + +function fixTimezoneGap(oldDate, newDate) { + // NOTE: T182866 + if(!isDefined(oldDate)) { + return; + } + + const diff = newDate.getHours() - oldDate.getHours(); + + if(diff === 0) { + return; + } + + const sign = (diff === 1 || diff === -23) ? -1 : 1; + const trial = new Date(newDate.getTime() + sign * 3600000); + + if(sign > 0 || trial.getDate() === newDate.getDate()) { + newDate.setTime(trial.getTime()); + } +} + +const roundToHour = function(date) { + const result = new Date(date.getTime()); + + result.setHours(result.getHours() + 1); + result.setMinutes(0); + + return result; +}; + +function getTimezonesDifference(min, max) { + return (max.getTimezoneOffset() - min.getTimezoneOffset()) * 60 * 1000; +} + +const makeDate = function(date) { + // TODO: will be useful later for work with different timezones + return new Date(date); +}; + +const getDatesOfInterval = function(startDate, endDate, step) { + const result = []; + let currentDate = new Date(startDate.getTime()); + + while(currentDate < endDate) { + result.push(new Date(currentDate.getTime())); + + currentDate = this.addInterval(currentDate, step); + } + + return result; +}; + +const createDateWithFullYear = function(year) { + const result = new Date(...arguments); + result.setFullYear(year); + return result; +}; + +const dateUtils = { + dateUnitIntervals: dateUnitIntervals, + + convertMillisecondsToDateUnits: convertMillisecondsToDateUnits, + dateToMilliseconds: dateToMilliseconds, + getNextDateUnit: getNextDateUnit, + convertDateUnitToMilliseconds: convertDateUnitToMilliseconds, + getDateUnitInterval: getDateUnitInterval, + getDateFormatByTickInterval: getDateFormatByTickInterval, // T375972 + getDatesDifferences: getDatesDifferences, + correctDateWithUnitBeginning: correctDateWithUnitBeginning, + trimTime: trimTime, + setToDayEnd: setToDayEnd, + roundDateByStartDayHour: roundDateByStartDayHour, + dateTimeFromDecimal: dateTimeFromDecimal, + + addDateInterval: addDateInterval, + addInterval: addInterval, + getSequenceByInterval: getSequenceByInterval, + getDateIntervalByString: getDateIntervalByString, + sameDate: sameDate, + sameMonthAndYear: sameMonthAndYear, + sameMonth: sameMonthAndYear, + sameYear: sameYear, + sameDecade: sameDecade, + sameCentury: sameCentury, + getDifferenceInMonth: getDifferenceInMonth, + getDifferenceInMonthForCells: getDifferenceInMonthForCells, + getFirstYearInDecade: getFirstYearInDecade, + getFirstDecadeInCentury: getFirstDecadeInCentury, + getShortDateFormat: getShortDateFormat, + getViewFirstCellDate: getViewFirstCellDate, + getViewLastCellDate: getViewLastCellDate, + getViewDown: getViewDown, + getViewUp: getViewUp, + getLastMonthDay: getLastMonthDay, + getLastMonthDate: getLastMonthDate, + getFirstMonthDate: getFirstMonthDate, + getFirstWeekDate: getFirstWeekDate, + normalizeDateByWeek: normalizeDateByWeek, + getQuarter: getQuarter, + getFirstQuarterMonth: getFirstQuarterMonth, + dateInRange: dateInRange, + intervalsOverlap: intervalsOverlap, + roundToHour: roundToHour, + normalizeDate: normalizeDate, + getViewMinBoundaryDate: getViewMinBoundaryDate, + getViewMaxBoundaryDate: getViewMaxBoundaryDate, + + fixTimezoneGap: fixTimezoneGap, + getTimezonesDifference: getTimezonesDifference, + + makeDate: makeDate, + + getDatesInterval: getDatesInterval, + + getDatesOfInterval: getDatesOfInterval, + + createDateWithFullYear: createDateWithFullYear +}; + +dateUtils.sameView = function(view, date1, date2) { + return dateUtils[camelize('same ' + view)](date1, date2); +}; + +export default dateUtils; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/date_serialization.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/date_serialization.js new file mode 100644 index 0000000000000000000000000000000000000000..0b87f7bee468ccf383f4640d869525efd03caa9b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/date_serialization.js @@ -0,0 +1,181 @@ +import config from '../config'; +import { getFormatter as getLDMLFormatter } from '../../localization/ldml/date.formatter'; +import defaultDateNames from '../../localization/default_date_names'; +import { isString, isDate, isNumeric as isNumber } from './type'; + +const NUMBER_SERIALIZATION_FORMAT = 'number'; +const DATE_SERIALIZATION_FORMAT = 'yyyy/MM/dd'; +const DATETIME_SERIALIZATION_FORMAT = 'yyyy/MM/dd HH:mm:ss'; + +const ISO8601_PATTERN = /^(\d{4,})(-)?(\d{2})(-)?(\d{2})(?:T(\d{2})(:)?(\d{2})?(:)?(\d{2}(?:\.(\d{1,3})\d*)?)?)?(Z|([+-])(\d{2})(:)?(\d{2})?)?$/; +const ISO8601_TIME_PATTERN = /^(\d{2}):(\d{2})(:(\d{2}))?$/; + +const ISO8601_PATTERN_PARTS = ['', 'yyyy', '', 'MM', '', 'dd', 'THH', '', 'mm', '', 'ss', '.SSS']; +const DATE_SERIALIZATION_PATTERN = /^(\d{4})\/(\d{2})\/(\d{2})$/; + +const MILLISECOND_LENGHT = 3; + +const dateParser = function(text, skipISO8601Parsing) { + let result; + + if(isString(text) && !skipISO8601Parsing) { + result = parseISO8601String(text); + } + + return result || parseDate(text); +}; + +function getTimePart(part) { + return +part || 0; +} + +function parseDate(text) { + const isDefaultSerializationFormat = getDateSerializationFormat(text) === DATE_SERIALIZATION_FORMAT; + const parsedValue = !isDate(text) && Date.parse(text); + if(!parsedValue && isDefaultSerializationFormat) { + const parts = text.match(DATE_SERIALIZATION_PATTERN); + if(parts) { + const newDate = new Date(getTimePart(parts[1]), getTimePart(parts[2]), getTimePart(parts[3])); + newDate.setFullYear(getTimePart(parts[1])); + newDate.setMonth(getTimePart(parts[2]) - 1); + newDate.setDate(getTimePart(parts[3])); + return newDate; + } + } + + return isNumber(parsedValue) ? new Date(parsedValue) : text; +} + +function parseISO8601String(text) { + let parts = text.match(ISO8601_PATTERN); + + if(!parts) { + parts = text.match(ISO8601_TIME_PATTERN); + if(parts) { + return new Date(0, 0, 0, getTimePart(parts[1]), getTimePart(parts[2]), getTimePart(parts[4])); + } + + return; + } + + const year = getTimePart(parts[1]); + const month = --parts[3]; + const day = parts[5]; + let timeZoneHour = 0; + let timeZoneMinute = 0; + const correctYear = (d) => { + year < 100 && d.setFullYear(year); + return d; + }; + + timeZoneHour = getTimePart(parts[14]); + timeZoneMinute = getTimePart(parts[16]); + + if(parts[13] === '-') { + timeZoneHour = -timeZoneHour; + timeZoneMinute = -timeZoneMinute; + } + + const hour = getTimePart(parts[6]) - timeZoneHour; + const minute = getTimePart(parts[8]) - timeZoneMinute; + const second = getTimePart(parts[10]); + const parseMilliseconds = function(part) { + part = part || ''; + return getTimePart(part) * Math.pow(10, MILLISECOND_LENGHT - part.length); + }; + const millisecond = parseMilliseconds(parts[11]); + + if(parts[12]) { + return correctYear(new Date(Date.UTC(year, month, day, hour, minute, second, millisecond))); + } + + return correctYear(new Date(year, month, day, hour, minute, second, millisecond)); +} + +const getIso8601Format = function(text, useUtc) { + let parts = text.match(ISO8601_PATTERN); + let result = ''; + + if(!parts) { + parts = text.match(ISO8601_TIME_PATTERN); + if(parts) { + return parts[3] ? 'HH:mm:ss' : 'HH:mm'; + } + return; + } + + + for(let i = 1; i < ISO8601_PATTERN_PARTS.length; i++) { + if(parts[i]) { + result += ISO8601_PATTERN_PARTS[i] || parts[i]; + } + } + + if(parts[12] === 'Z') { + result += '\'Z\''; + } + + if(parts[14]) { + if(parts[15]) { + result += 'xxx'; + } else if(parts[16]) { + result += 'xx'; + } else { + result += 'x'; + } + } + + return result; +}; + +const deserializeDate = function(value) { + if(typeof value === 'number') { + return new Date(value); + } + + return dateParser(value, !config().forceIsoDateParsing); +}; + +const serializeDate = function(value, serializationFormat) { + if(!serializationFormat) { + return value; + } + + if(!isDate(value)) { + return null; + } + + if(serializationFormat === NUMBER_SERIALIZATION_FORMAT) { + return value && value.valueOf ? value.valueOf() : null; + } + + return getLDMLFormatter(serializationFormat, defaultDateNames)(value); +}; + +const getDateSerializationFormat = function(value) { + if(typeof value === 'number') { + return NUMBER_SERIALIZATION_FORMAT; + } else if(isString(value)) { + let format; + + if(config().forceIsoDateParsing) { + format = getIso8601Format(value); + } + if(format) { + return format; + } else if(value.indexOf(':') >= 0) { + return DATETIME_SERIALIZATION_FORMAT; + } else { + return DATE_SERIALIZATION_FORMAT; + } + } else if(value) { + return null; + } +}; + +export default { + dateParser: dateParser, + deserializeDate: deserializeDate, + serializeDate: serializeDate, + getDateSerializationFormat: getDateSerializationFormat +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..d48aa974bbebd088d2f757c5e0ea9b715a5446d6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.d.ts @@ -0,0 +1,33 @@ +interface Callback { + // eslint-disable-next-line @typescript-eslint/prefer-function-type + (value?: T, ...args: T[]): void; +} +declare class DeferredObj { + constructor(); + state(): 'pending' | 'rejected' | 'resolved'; + always(alwaysCallback?: Callback): DeferredObj; + catch(catchCallback?: Callback): DeferredObj; + then(resolveCallback?: Callback, rejectCallback?: Callback): DeferredObj; + done(doneCallback?: Callback): DeferredObj; + fail(failCallback?: Callback): DeferredObj; + progress(progressCallback?: Callback): DeferredObj; + notify(...args: T[]): DeferredObj; + notifyWith(context: DeferredObj, args?: T[]): DeferredObj; + reject(...args: T[]): DeferredObj; + rejectWith(context: DeferredObj, args?: T[]): DeferredObj; + resolve(...args: T[]): DeferredObj; + resolveWith(context: DeferredObj, args?: T[]): DeferredObj; + promise(target?: T): Promise; +} + +export function Deferred(): DeferredObj; + + // eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars +export interface PromiseType { } +/** + * @docid + * @type Promise + * @namespace DevExpress.core.utils + */ +// eslint-disable-next-line @typescript-eslint/no-invalid-void-type +export type DxPromise = {} extends PromiseType ? Promise : PromiseType; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.js new file mode 100644 index 0000000000000000000000000000000000000000..6519ce3e0f07448cad60d23ba4b1ea6ae261a000 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/deferred.js @@ -0,0 +1,175 @@ +import { isDeferred, isDefined, isPromise } from '../utils/type'; +import { extend } from '../utils/extend'; +import Callbacks from '../utils/callbacks'; + +const deferredConfig = [{ + method: 'resolve', + handler: 'done', + state: 'resolved' +}, { + method: 'reject', + handler: 'fail', + state: 'rejected' +}, { + method: 'notify', + handler: 'progress' +}]; + +let DeferredObj = function() { + const that = this; + this._state = 'pending'; + this._promise = {}; + + deferredConfig.forEach(function(config) { + const methodName = config.method; + this[methodName + 'Callbacks'] = new Callbacks(); + + this[methodName] = function() { + return this[methodName + 'With'](this._promise, arguments); + }.bind(this); + + this._promise[config.handler] = function(handler) { + if(!handler) return this; + + const callbacks = that[methodName + 'Callbacks']; + if(callbacks.fired()) { + handler.apply(that[methodName + 'Context'], that[methodName + 'Args']); + } else { + callbacks.add(function(context, args) { + handler.apply(context, args); + }.bind(this)); + } + return this; + }; + }.bind(this)); + + this._promise.always = function(handler) { + return this.done(handler).fail(handler); + }; + + this._promise.catch = function(handler) { + return this.then(null, handler); + }; + + this._promise.then = function(resolve, reject) { + const result = new DeferredObj(); + + ['done', 'fail'].forEach(function(method) { + const callback = method === 'done' ? resolve : reject; + + this[method](function() { + if(!callback) { + result[method === 'done' ? 'resolve' : 'reject'].apply(this, arguments); + return; + } + + const callbackResult = callback && callback.apply(this, arguments); + if(isDeferred(callbackResult)) { + callbackResult.done(result.resolve).fail(result.reject); + } else if(isPromise(callbackResult)) { + callbackResult.then(result.resolve, result.reject); + } else { + result.resolve.apply(this, isDefined(callbackResult) ? [callbackResult] : arguments); + } + }); + }.bind(this)); + + return result.promise(); + }; + + this._promise.state = function() { + return that._state; + }; + + this._promise.promise = function(args) { + return args ? extend(args, that._promise) : that._promise; + }; + + this._promise.promise(this); +}; + +deferredConfig.forEach(function(config) { + const methodName = config.method; + const state = config.state; + + DeferredObj.prototype[methodName + 'With'] = function(context, args) { + const callbacks = this[methodName + 'Callbacks']; + + if(this.state() === 'pending') { + this[methodName + 'Args'] = args; + this[methodName + 'Context'] = context; + if(state) this._state = state; + callbacks.fire(context, args); + } + + return this; + }; +}); + +export function fromPromise(promise, context) { + if(isDeferred(promise)) { + return promise; + } else if(isPromise(promise)) { + const d = new DeferredObj(); + promise.then(function() { + d.resolveWith.apply(d, [context].concat([[].slice.call(arguments)])); + }, function() { + d.rejectWith.apply(d, [context].concat([[].slice.call(arguments)])); + }); + return d; + } + + return new DeferredObj().resolveWith(context, [promise]); +} + +let whenFunc = function() { + if(arguments.length === 1) { + return fromPromise(arguments[0]); + } + + const values = [].slice.call(arguments); + const contexts = []; + let resolvedCount = 0; + const deferred = new DeferredObj(); + + const updateState = function(i) { + return function(value) { + contexts[i] = this; + values[i] = arguments.length > 1 ? [].slice.call(arguments) : value; + resolvedCount++; + if(resolvedCount === values.length) { + deferred.resolveWith(contexts, values); + } + }; + }; + + for(let i = 0; i < values.length; i++) { + if(isDeferred(values[i])) { + values[i].promise() + .done(updateState(i)) + .fail(deferred.reject); + } else { + resolvedCount++; + } + } + + if(resolvedCount === values.length) { + deferred.resolveWith(contexts, values); + } + + return deferred.promise(); +}; + +export function setStrategy(value) { + DeferredObj = value.Deferred; + whenFunc = value.when; +} + +export function Deferred() { + return new DeferredObj(); +} + +export function when() { + return whenFunc.apply(this, arguments); +} + diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/dependency_injector.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/dependency_injector.js new file mode 100644 index 0000000000000000000000000000000000000000..6b7da1a67e62b73ff1a577af24b256e6dcfbf50e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/dependency_injector.js @@ -0,0 +1,44 @@ +import { extend } from './extend'; +import { isFunction } from './type'; +import { each } from './iterator'; +import Class from '../class'; + +export default function(object) { + const BaseClass = Class.inherit(object); + let InjectedClass = BaseClass; + let instance = new InjectedClass(object); + const initialFields = {}; + + const injectFields = function(injectionObject, initial) { + each(injectionObject, function(key) { + if(isFunction(instance[key])) { + if(initial || !object[key]) { + object[key] = function() { + return instance[key].apply(object, arguments); + }; + } + } else { + if(initial) { + initialFields[key] = object[key]; + } + object[key] = instance[key]; + } + }); + }; + + injectFields(object, true); + + object.inject = function(injectionObject) { + InjectedClass = InjectedClass.inherit(injectionObject); + instance = new InjectedClass(); + injectFields(injectionObject); + }; + + object.resetInjection = function() { + extend(object, initialFields); + InjectedClass = BaseClass; + instance = new BaseClass(); + }; + + return object; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/dom.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/dom.js new file mode 100644 index 0000000000000000000000000000000000000000..fe610ca8356d255af11f662e2edf0bb701a20a1a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/dom.js @@ -0,0 +1,154 @@ +import domAdapter from '../../core/dom_adapter'; +import $ from '../../core/renderer'; +import { each } from './iterator'; +import { isDefined, isRenderer, isWindow } from './type'; +import { getWindow } from './window'; + +const window = getWindow(); + +export const resetActiveElement = () => { + const activeElement = domAdapter.getActiveElement(); + + if(activeElement && activeElement !== domAdapter.getBody()) { + activeElement.blur?.(); + } +}; + +export const clearSelection = () => { + const selection = window.getSelection(); + if(!selection) return; + if(selection.type === 'Caret') return; + + if(selection.empty) { + selection.empty(); + } else if(selection.removeAllRanges) { + // T522811 + try { + selection.removeAllRanges(); + } catch(e) {} + } +}; + +export const closestCommonParent = (startTarget, endTarget) => { + const $startTarget = $(startTarget); + const $endTarget = $(endTarget); + + if($startTarget[0] === $endTarget[0]) { + return $startTarget[0]; + } + + const $startParents = $startTarget.parents(); + const $endParents = $endTarget.parents(); + const startingParent = Math.min($startParents.length, $endParents.length); + + for(let i = -startingParent; i < 0; i++) { + if($startParents.get(i) === $endParents.get(i)) { + return $startParents.get(i); + } + } +}; + +export const extractTemplateMarkup = (element) => { + element = $(element); + + const templateTag = element.length && element.filter(function isNotExecutableScript() { + const $node = $(this); + return $node.is('script[type]') && ($node.attr('type').indexOf('script') < 0); + }); + + if(templateTag.length) { + return templateTag.eq(0).html(); + } else { + element = $('
').append(element); + return element.html(); + } +}; + +export const normalizeTemplateElement = (element) => { + let $element = isDefined(element) && (element.nodeType || isRenderer(element)) + ? $(element) + : $('
').html(element).contents(); + + if($element.length === 1) { + if($element.is('script')) { + $element = normalizeTemplateElement($element.html().trim()); + } else if($element.is('table')) { + $element = $element.children('tbody').contents(); + } + } + + return $element; +}; + +export const clipboardText = (event, text) => { + const clipboard = (event.originalEvent && event.originalEvent.clipboardData) || window.clipboardData; + if(!text) { + return clipboard && clipboard.getData('Text'); + } + + clipboard && clipboard.setData('Text', text); +}; + +export const contains = (container, element) => { + if(!element) { + return false; + } + + if(domAdapter.isTextNode(element)) { + element = element.parentNode; + } + + if(domAdapter.isDocument(container)) { + return container.documentElement.contains(element); + } + + if(isWindow(container)) { + return contains(container.document, element); + } + + return container.contains + ? container.contains(element) + : !!(element.compareDocumentPosition(container) & element.DOCUMENT_POSITION_CONTAINS); +}; + +export const createTextElementHiddenCopy = (element, text, options) => { + const elementStyles = window.getComputedStyle($(element).get(0)); + const includePaddings = options && options.includePaddings; + + return $('
').text(text).css({ + 'fontStyle': elementStyles.fontStyle, + 'fontVariant': elementStyles.fontVariant, + 'fontWeight': elementStyles.fontWeight, + 'fontSize': elementStyles.fontSize, + 'fontFamily': elementStyles.fontFamily, + 'letterSpacing': elementStyles.letterSpacing, + 'border': elementStyles.border, + 'paddingTop': includePaddings ? elementStyles.paddingTop : '', + 'paddingRight': includePaddings ? elementStyles.paddingRight : '', + 'paddingBottom': includePaddings ? elementStyles.paddingBottom : '', + 'paddingLeft': includePaddings ? elementStyles.paddingLeft : '', + 'visibility': 'hidden', + 'whiteSpace': 'pre', + 'position': 'absolute', + 'float': 'left' + }); +}; + +export const insertBefore = (element, newElement) => { + if(newElement) { + domAdapter.insertElement(element.parentNode, newElement, element); + } + return element; +}; + +export const replaceWith = (element, newElement) => { + if(!(newElement && newElement[0])) return; + if(newElement.is(element)) return element; + + each(newElement, (_, currentElement) => { + insertBefore(element[0], currentElement); + }); + element.remove(); + + return newElement; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/error.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/error.js new file mode 100644 index 0000000000000000000000000000000000000000..95935e8bc57df6f99823c49b2639b29f0d25d2db --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/error.js @@ -0,0 +1,67 @@ +/* eslint-disable import/no-commonjs */ +import { extend } from './extend'; +import { logger } from './console'; +import { format } from './string'; +import { version } from '../version'; + +const ERROR_URL = 'http://js.devexpress.com/error/' + version.split('.').slice(0, 2).join('_') + '/'; + +export default function(baseErrors, errors) { + + const exports = { + + ERROR_MESSAGES: extend(errors, baseErrors), + + Error: function() { + return makeError([].slice.call(arguments)); + }, + + log: function(id) { + let method = 'log'; + + if(/^E\d+$/.test(id)) { + method = 'error'; + } else if(/^W\d+$/.test(id)) { + method = 'warn'; + } + + logger[method](method === 'log' ? id : combineMessage([].slice.call(arguments))); + } + }; + + function combineMessage(args) { + const id = args[0]; + args = args.slice(1); + return formatMessage(id, formatDetails(id, args)); + } + + function formatDetails(id, args) { + args = [exports.ERROR_MESSAGES[id]].concat(args); + return format.apply(this, args).replace(/\.*\s*?$/, ''); + } + + function formatMessage(id, details) { + return format.apply(this, ['{0} - {1}. See:\n{2}', id, details, getErrorUrl(id)]); + } + + function makeError(args) { + const id = args[0]; + args = args.slice(1); + const details = formatDetails(id, args); + const url = getErrorUrl(id); + const message = formatMessage(id, details); + + return extend(new Error(message), { + __id: id, + __details: details, + url: url + }); + } + + function getErrorUrl(id) { + return ERROR_URL + id; + } + + return exports; + +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/extend.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/extend.js new file mode 100644 index 0000000000000000000000000000000000000000..77a64ea64e5ea608422b28cd09bab6cbfcc3a870 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/extend.js @@ -0,0 +1,62 @@ +import { isPlainObject } from './type'; + +export const extendFromObject = function(target, source, overrideExistingValues) { + target = target || {}; + for(const prop in source) { + if(Object.prototype.hasOwnProperty.call(source, prop)) { + const value = source[prop]; + if(!(prop in target) || overrideExistingValues) { + target[prop] = value; + } + } + } + return target; +}; + +export const extend = function(target) { + target = target || {}; + + let i = 1; + let deep = false; + + if(typeof target === 'boolean') { + deep = target; + target = arguments[1] || {}; + i++; + } + + for(; i < arguments.length; i++) { + const source = arguments[i]; + if(source == null) { + continue; + } + + for(const key in source) { + const targetValue = target[key]; + const sourceValue = source[key]; + let sourceValueIsArray = false; + let clone; + + if(key === '__proto__' || key === 'constructor' || target === sourceValue) { + continue; + } + + if(deep && sourceValue && (isPlainObject(sourceValue) || + (sourceValueIsArray = Array.isArray(sourceValue)))) { + + if(sourceValueIsArray) { + clone = targetValue && Array.isArray(targetValue) ? targetValue : []; + } else { + clone = targetValue && isPlainObject(targetValue) ? targetValue : {}; + } + + target[key] = extend(deep, clone, sourceValue); + + } else if(sourceValue !== undefined) { + target[key] = sourceValue; + } + } + } + + return target; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/html_parser.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/html_parser.js new file mode 100644 index 0000000000000000000000000000000000000000..0db33f8a23910fee51de08be2b9e6fccf915991d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/html_parser.js @@ -0,0 +1,60 @@ +import { merge } from './array'; +import domAdapter from '../dom_adapter'; + +const isTagName = (/<([a-z][^/\0>\x20\t\r\n\f]+)/i); + +const tagWrappers = { + default: { + tagsCount: 0, + startTags: '', + endTags: '' + }, + thead: { + tagsCount: 1, + startTags: '', + endTags: '
' + }, + td: { + tagsCount: 3, + startTags: '', + endTags: '
' + }, + col: { + tagsCount: 2, + startTags: '', + endTags: '
' + }, + tr: { + tagsCount: 2, + startTags: '', + endTags: '
' + }, +}; + +tagWrappers.tbody = tagWrappers.colgroup = tagWrappers.caption = tagWrappers.tfoot = tagWrappers.thead; +tagWrappers.th = tagWrappers.td; + +export const parseHTML = function(html) { + if(typeof html !== 'string') { + return null; + } + + const fragment = domAdapter.createDocumentFragment(); + let container = fragment.appendChild(domAdapter.createElement('div')); + const tags = isTagName.exec(html); + const firstRootTag = tags && tags[1].toLowerCase(); + const tagWrapper = tagWrappers[firstRootTag] || tagWrappers.default; + + container.innerHTML = tagWrapper.startTags + html + tagWrapper.endTags; + + for(let i = 0; i < tagWrapper.tagsCount; i++) { + container = container.lastChild; + } + + return merge([], container.childNodes); +}; + +export const isTablePart = function(html) { + const tags = isTagName.exec(html); + return tags && tags[1] in tagWrappers; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/icon.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/icon.js new file mode 100644 index 0000000000000000000000000000000000000000..0bebf7fdfbbb2abf92d4d19671bbd239ed363d97 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/icon.js @@ -0,0 +1,43 @@ +import $ from '../../core/renderer'; + +const ICON_CLASS = 'dx-icon'; +const SVG_ICON_CLASS = 'dx-svg-icon'; + +export const getImageSourceType = (source) => { + if(!source || typeof source !== 'string') { + return false; + } + + if(/^\s*]*>(.|\r?\n)*?<\/svg>\s*$/i.test(source)) { + return 'svg'; + } + + if(/data:.*base64|\.|[^<\s]\//.test(source)) { + return 'image'; + } + + if(/^[\w-_]+$/.test(source)) { + return 'dxIcon'; + } + + if(/^\s?([\w-_]\s?)+$/.test(source)) { + return 'fontIcon'; + } + + return false; +}; + +export const getImageContainer = (source) => { + switch(getImageSourceType(source)) { + case 'image': + return $('').attr('src', source).addClass(ICON_CLASS); + case 'fontIcon': + return $('').addClass(`${ICON_CLASS} ${source}`); + case 'dxIcon': + return $('').addClass(`${ICON_CLASS} ${ICON_CLASS}-${source}`); + case 'svg': + return $('').addClass(`${ICON_CLASS} ${SVG_ICON_CLASS}`).append(source); + default: + return null; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/inflector.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/inflector.js new file mode 100644 index 0000000000000000000000000000000000000000..eff346cdf3c4faee6b78efb387e5b00d8a74603a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/inflector.js @@ -0,0 +1,75 @@ +import { map } from './iterator'; + +const _normalize = function(text) { + if(text === undefined || text === null) { + return ''; + } + return String(text); +}; + +const _upperCaseFirst = function(text) { + return _normalize(text).charAt(0).toUpperCase() + text.substr(1); +}; + +const _chop = function(text) { + return _normalize(text) + .replace(/([a-z\d])([A-Z])/g, '$1 $2') + .split(/[\s_-]+/); +}; + +export const dasherize = function(text) { + return map(_chop(text), function(p) { return p.toLowerCase(); }).join('-'); +}; + +export const underscore = function(text) { + return dasherize(text).replace(/-/g, '_'); +}; + +export const camelize = function(text, upperFirst) { + return map(_chop(text), function(p, i) { + p = p.toLowerCase(); + if(upperFirst || i > 0) { + p = _upperCaseFirst(p); + } + return p; + }).join(''); +}; + +export const humanize = function(text) { + return _upperCaseFirst(dasherize(text).replace(/-/g, ' ')); +}; + +export const titleize = function(text) { + return map(_chop(text), function(p) { + return _upperCaseFirst(p.toLowerCase()); + }).join(' '); +}; + +const DIGIT_CHARS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; + +export const captionize = function(name) { + const captionList = []; + let i; + let char; + let isPrevCharNewWord = false; + let isNewWord = false; + + for(i = 0; i < name.length; i++) { + char = name.charAt(i); + isNewWord = (char === char.toUpperCase() && char !== '-' && char !== ')' && char !== '/') || (char in DIGIT_CHARS); + if(char === '_' || char === '.') { + char = ' '; + isNewWord = true; + } else if(i === 0) { + char = char.toUpperCase(); + isNewWord = true; + } else if(!isPrevCharNewWord && isNewWord) { + if(captionList.length > 0) { + captionList.push(' '); + } + } + captionList.push(char); + isPrevCharNewWord = isNewWord; + } + return captionList.join(''); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/iterator.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/iterator.js new file mode 100644 index 0000000000000000000000000000000000000000..81e906efd0594a14ab8d2191e043311763587dfd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/iterator.js @@ -0,0 +1,49 @@ +const map = (values, callback) => { + if(Array.isArray(values)) { + return values.map(callback); + } + + const result = []; + + for(const key in values) { + result.push(callback(values[key], key)); + } + + return result; +}; + +const each = (values, callback) => { + if(!values) return; + + if('length' in values) { + for(let i = 0; i < values.length; i++) { + if(callback.call(values[i], i, values[i]) === false) { + break; + } + } + } else { + for(const key in values) { + if(callback.call(values[key], key, values[key]) === false) { + break; + } + } + } + + return values; +}; + +const reverseEach = (array, callback) => { + if(!array || !('length' in array) || array.length === 0) return; + + for(let i = array.length - 1; i >= 0; i--) { + if(callback.call(array[i], i, array[i]) === false) { + break; + } + } +}; + +export { + map, + each, + reverseEach +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/locker.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/locker.js new file mode 100644 index 0000000000000000000000000000000000000000..a9ca993d7d4488282ad1c06e59792c4a493315df --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/locker.js @@ -0,0 +1,35 @@ +import errors from '../errors'; + +const Locker = function() { + const info = {}; + + const currentCount = function(lockName) { + return info[lockName] || 0; + }; + + return { + obtain: function(lockName) { + info[lockName] = currentCount(lockName) + 1; + }, + + release: function(lockName) { + const count = currentCount(lockName); + + if(count < 1) { + throw errors.Error('E0014'); + } + + if(count === 1) { + delete info[lockName]; + } else { + info[lockName] = count - 1; + } + }, + + locked: function(lockName) { + return currentCount(lockName) > 0; + } + }; +}; + +export default Locker; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/math.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/math.js new file mode 100644 index 0000000000000000000000000000000000000000..4faca94ff724fd7c17b91b8ee786bcac66dc6444 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/math.js @@ -0,0 +1,181 @@ +import { isExponential } from './type'; + +const sign = function(value) { + if(value === 0) { + return 0; + } + + return value / Math.abs(value); +}; + +const fitIntoRange = function(value, minValue, maxValue) { + const isMinValueUndefined = !minValue && minValue !== 0; + const isMaxValueUndefined = !maxValue && maxValue !== 0; + + isMinValueUndefined && (minValue = !isMaxValueUndefined ? Math.min(value, maxValue) : value); + isMaxValueUndefined && (maxValue = !isMinValueUndefined ? Math.max(value, minValue) : value); + + return Math.min(Math.max(value, minValue), maxValue); +}; + +const inRange = function(value, minValue, maxValue) { + return value >= minValue && value <= maxValue; +}; + +function getExponent(value) { + return Math.abs(parseInt(value.toExponential().split('e')[1])); +} + +// T570217 +function _isEdgeBug() { + const value = 0.0003; + const correctValue = '0.000300'; + const precisionValue = 3; + return correctValue !== value.toPrecision(precisionValue); +} + +function adjust(value, interval) { + let precision = getPrecision(interval || 0) + 2; + const separatedValue = value.toString().split('.'); + const sourceValue = value; + const absValue = Math.abs(value); + let separatedAdjustedValue; + const isExponentValue = isExponential(value); + const integerPart = absValue > 1 ? 10 : 0; + + if(separatedValue.length === 1) { + return value; + } + + if(!isExponentValue) { + if(isExponential(interval)) { + precision = separatedValue[0].length + getExponent(interval); + } + value = absValue; + value = value - Math.floor(value) + integerPart; + } + + precision = ((_isEdgeBug() && (getExponent(value) > 6)) || precision > 7) ? 15 : 7; // fix toPrecision() bug in Edge (T570217) + + if(!isExponentValue) { + separatedAdjustedValue = parseFloat(value.toPrecision(precision)).toString().split('.'); + if(separatedAdjustedValue[0] === integerPart.toString()) { + return parseFloat(separatedValue[0] + '.' + separatedAdjustedValue[1]); + } + } + return parseFloat(sourceValue.toPrecision(precision)); +} + +function getPrecision(value) { + const str = value.toString(); + + if(str.indexOf('.') < 0) { + return 0; + } + + const mantissa = str.split('.'); + const positionOfDelimiter = mantissa[1].indexOf('e'); + + return positionOfDelimiter >= 0 ? positionOfDelimiter : mantissa[1].length; +} + +function getRoot(x, n) { + if(x < 0 && n % 2 !== 1) { + return NaN; + } + + const y = Math.pow(Math.abs(x), 1 / n); + return n % 2 === 1 && x < 0 ? -y : y; +} + +function solveCubicEquation(a, b, c, d) { + const min = 1e-8; + if(Math.abs(a) < min) { + a = b; b = c; c = d; + if(Math.abs(a) < min) { + a = b; b = c; + if(Math.abs(a) < min) { + return []; + } + return [-b / a]; + } + + const D2 = b * b - 4 * a * c; + if(Math.abs(D2) < min) { + return [-b / (2 * a)]; + } else if(D2 > 0) { + return [(-b + Math.sqrt(D2)) / (2 * a), (-b - Math.sqrt(D2)) / (2 * a)]; + } + return []; + } + + const p = (3 * a * c - b * b) / (3 * a * a); + const q = (2 * b * b * b - 9 * a * b * c + 27 * a * a * d) / (27 * a * a * a); + let roots; + let u; + + if(Math.abs(p) < min) { + roots = [getRoot(-q, 3)]; + } else if(Math.abs(q) < min) { + roots = [0].concat(p < 0 ? [Math.sqrt(-p), -Math.sqrt(-p)] : []); + } else { + const D3 = q * q / 4 + p * p * p / 27; + if(Math.abs(D3) < min) { + roots = [-1.5 * q / p, 3 * q / p]; + } else if(D3 > 0) { + u = getRoot(-q / 2 - Math.sqrt(D3), 3); + roots = [u - p / (3 * u)]; + } else { + u = 2 * Math.sqrt(-p / 3); + const t = Math.acos(3 * q / p / u) / 3; + const k = 2 * Math.PI / 3; + roots = [u * Math.cos(t), u * Math.cos(t - k), u * Math.cos(t - 2 * k)]; + } + } + + for(let i = 0; i < roots.length; i++) { + roots[i] -= b / (3 * a); + } + + return roots; +} + +function trunc(value) { + return Math.trunc ? Math.trunc(value) : (value > 0 ? Math.floor(value) : Math.ceil(value)); +} + +function getRemainderByDivision(dividend, divider, digitsCount) { + if(divider === parseInt(divider)) { + return dividend % divider; + } + + const quotient = roundFloatPart(dividend / divider, digitsCount); + return (quotient - parseInt(quotient)) * divider; +} + +function getExponentLength(value) { + const valueString = value.toString(); + + return valueString.split('.')[1]?.length + || parseInt(valueString.split('e-')[1]) + || 0; +} + +function roundFloatPart(value, digitsCount = 0) { + return parseFloat(value.toFixed(digitsCount)); +} + +export { + sign, + fitIntoRange, + inRange, + adjust, + getPrecision, + getExponent, + getRoot, + solveCubicEquation, + trunc, + roundFloatPart, + getExponentLength, + getRemainderByDivision +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/object.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/object.js new file mode 100644 index 0000000000000000000000000000000000000000..a86f93e70dff740d6e2019d6d3f1c7bf5b1982f9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/object.js @@ -0,0 +1,80 @@ +import { isNumeric, isPlainObject, isObject } from './type'; +import variableWrapper from './variable_wrapper'; + +const clone = (function() { + function Clone() { } + + return function(obj) { + Clone.prototype = obj; + return new Clone(); + }; +})(); + +const orderEach = function(map, func) { + const keys = []; + let key; + let i; + + for(key in map) { + if(Object.prototype.hasOwnProperty.call(map, key)) { + keys.push(key); + } + } + + keys.sort(function(x, y) { + const isNumberX = isNumeric(x); + const isNumberY = isNumeric(y); + + if(isNumberX && isNumberY) return x - y; + if(isNumberX && !isNumberY) return -1; + if(!isNumberX && isNumberY) return 1; + if(x < y) return -1; + if(x > y) return 1; + return 0; + }); + + for(i = 0; i < keys.length; i++) { + key = keys[i]; + func(key, map[key]); + } +}; + +const assignValueToProperty = function(target, property, value, assignByReference) { + if(!assignByReference && variableWrapper.isWrapped(target[property])) { + variableWrapper.assign(target[property], value); + } else { + target[property] = value; + } +}; + +// B239679, http://bugs.jquery.com/ticket/9477 +const deepExtendArraySafe = function(target, changes, extendComplexObject, assignByReference) { + let prevValue; + let newValue; + + for(const name in changes) { + prevValue = target[name]; + newValue = changes[name]; + + if(name === '__proto__' || name === 'constructor' || target === newValue) { + continue; + } + + if(isPlainObject(newValue)) { + const goDeeper = extendComplexObject ? isObject(prevValue) : isPlainObject(prevValue); + newValue = deepExtendArraySafe(goDeeper ? prevValue : {}, newValue, extendComplexObject, assignByReference); + } + + if(newValue !== undefined && prevValue !== newValue) { + assignValueToProperty(target, name, newValue, assignByReference); + } + } + + return target; +}; + +export { + clone, + orderEach, + deepExtendArraySafe +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/position.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/position.js new file mode 100644 index 0000000000000000000000000000000000000000..4a8adffcb46dc092b1a9841d04a9bedaf29abc48 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/position.js @@ -0,0 +1,24 @@ +import config from '../config'; +import { isWindow } from '../utils/type'; + +const getDefaultAlignment = (isRtlEnabled) => { + const rtlEnabled = isRtlEnabled ?? config().rtlEnabled; + + return rtlEnabled ? 'right' : 'left'; +}; + +const getBoundingRect = (element) => { + if(isWindow(element)) { + return { + width: element.outerWidth, + height: element.outerHeight + }; + } + + return element.getBoundingClientRect(); +}; + +export { + getBoundingRect, + getDefaultAlignment +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/public_component.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/public_component.js new file mode 100644 index 0000000000000000000000000000000000000000..534486f4e3d85411f0d0ecb9bc89d6f4a3b61db8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/public_component.js @@ -0,0 +1,53 @@ +import { data as elementData } from '../../core/element_data'; +import eventsEngine from '../../events/core/events_engine'; +import WeakMap from '../polyfills/weak_map'; +import { isDefined } from './type'; +import { removeEvent } from '../../events/remove'; + +const COMPONENT_NAMES_DATA_KEY = 'dxComponents'; +const ANONYMOUS_COMPONENT_DATA_KEY = 'dxPrivateComponent'; + +const componentNames = new WeakMap(); +let nextAnonymousComponent = 0; + +const getName = function(componentClass, newName) { + if(isDefined(newName)) { + componentNames.set(componentClass, newName); + return; + } + + if(!componentNames.has(componentClass)) { + const generatedName = ANONYMOUS_COMPONENT_DATA_KEY + nextAnonymousComponent++; + componentNames.set(componentClass, generatedName); + return generatedName; + } + + return componentNames.get(componentClass); +}; + +export function attachInstanceToElement($element, componentInstance, disposeFn) { + const data = elementData($element.get(0)); + const name = getName(componentInstance.constructor); + + data[name] = componentInstance; + + if(disposeFn) { + eventsEngine.one($element, removeEvent, function() { + disposeFn.call(componentInstance); + }); + } + + if(!data[COMPONENT_NAMES_DATA_KEY]) { + data[COMPONENT_NAMES_DATA_KEY] = []; + } + + data[COMPONENT_NAMES_DATA_KEY].push(name); +} + +export function getInstanceByElement($element, componentClass) { + const name = getName(componentClass); + + return elementData($element.get(0), name); +} + +export { getName as name }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/queue.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/queue.js new file mode 100644 index 0000000000000000000000000000000000000000..70338e1a75a8f6b792d753d6badf2b74eca2c93f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/queue.js @@ -0,0 +1,57 @@ +import errors from '../errors'; +import { when } from '../../core/utils/deferred'; + +function createQueue(discardPendingTasks) { + let _tasks = []; + let _busy = false; + + function exec() { + while(_tasks.length) { + _busy = true; + + const task = _tasks.shift(); + const result = task(); + + if(result === undefined) { + continue; + } + + if(result.then) { + // NOTE: immediate "then" on the next line can reset it back to false + when(result).always(exec); + return; + } + + throw errors.Error('E0015'); + } + + _busy = false; + } + + function add(task, removeTaskCallback) { + if(!discardPendingTasks) { + _tasks.push(task); + } else { + if(_tasks[0] && removeTaskCallback) { + removeTaskCallback(_tasks[0]); + } + _tasks = [task]; + } + if(!_busy) { + exec(); + } + } + + function busy() { + return _busy; + } + + return { + add: add, + busy: busy + }; +} + + +export { createQueue as create }; +export const enqueue = createQueue().add; // Default global queue for UI sync, consider renaming diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/ready_callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/ready_callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..faceec92ea2e02fed5dfd95924ee079e4693dde3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/ready_callbacks.js @@ -0,0 +1,30 @@ +import domAdapter from '../dom_adapter'; +import injector from './dependency_injector'; +import { hasWindow } from './window'; +import callOnce from './call_once'; +let callbacks = []; + +const subscribeReady = callOnce(() => { + const removeListener = domAdapter.listen(domAdapter.getDocument(), 'DOMContentLoaded', () => { + readyCallbacks.fire(); + removeListener(); + }); +}); + +const readyCallbacks = { + add: callback => { + const windowExists = hasWindow(); + if(windowExists && domAdapter.getReadyState() !== 'loading') { + callback(); + } else { + callbacks.push(callback); + windowExists && subscribeReady(); + } + }, + fire: () => { + callbacks.forEach(callback => callback()); + callbacks = []; + } +}; + +export default injector(readyCallbacks); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/resize_callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/resize_callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..b5c96e3effb53367d9f45cd3b8c4cac09637bb45 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/resize_callbacks.js @@ -0,0 +1,77 @@ +import { hasWindow, getWindow } from './window'; +import domAdapter from '../dom_adapter'; +import Callbacks from './callbacks'; +import readyCallbacks from './ready_callbacks'; +import callOnce from './call_once'; + +const resizeCallbacks = (function() { + let prevSize; + const callbacks = Callbacks(); + const originalCallbacksAdd = callbacks.add; + const originalCallbacksRemove = callbacks.remove; + + if(!hasWindow()) { + return callbacks; + } + + const formatSize = function() { + const window = getWindow(); + return { + width: window.innerWidth, + height: window.innerHeight, + }; + }; + + const handleResize = function() { + const now = formatSize(); + if(now.width === prevSize.width && now.height === prevSize.height) { + return; + } + + let changedDimension; + if(now.width === prevSize.width) { + changedDimension = 'height'; + } + if(now.height === prevSize.height) { + changedDimension = 'width'; + } + + prevSize = now; + + callbacks.fire(changedDimension); + }; + + const setPrevSize = callOnce(function() { + prevSize = formatSize(); + }); + + let removeListener; + + callbacks.add = function() { + const result = originalCallbacksAdd.apply(callbacks, arguments); + + setPrevSize(); + + readyCallbacks.add(function() { + if(!removeListener && callbacks.has()) { + removeListener = domAdapter.listen(getWindow(), 'resize', handleResize); + } + }); + + return result; + }; + + callbacks.remove = function() { + const result = originalCallbacksRemove.apply(callbacks, arguments); + + if(!callbacks.has() && removeListener) { + removeListener(); + removeListener = undefined; + } + return result; + }; + + return callbacks; +})(); + +export default resizeCallbacks; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..811f631a7b60bd432feadfdfd9aca980516977f7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.d.ts @@ -0,0 +1,6 @@ +declare const getScrollRtlBehavior: () => { + decreasing: boolean; + positive: boolean; +}; + +export default getScrollRtlBehavior; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.js new file mode 100644 index 0000000000000000000000000000000000000000..cbd9b8c9937687768af33bf72d7569b4ee137c72 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/scroll_rtl_behavior.js @@ -0,0 +1,28 @@ +import domAdapter from '../dom_adapter'; +import callOnce from './call_once'; + +const getScrollRtlBehavior = callOnce(function() { + const document = domAdapter.getDocument(); + + /* Append a RTL scrollable 1px square containing a 2px-wide child and check + the initial scrollLeft and whether it's possible to set a negative one.*/ + document.body.insertAdjacentHTML('beforeend', `
`); + + const scroller = document.body.lastElementChild; + const initiallyPositive = scroller.scrollLeft > 0; + scroller.scrollLeft = -1; + const hasNegative = scroller.scrollLeft < 0; + + const result = { + 'decreasing': hasNegative || initiallyPositive, + 'positive': !hasNegative + }; + + document.body.removeChild(scroller); + + return result; +}); + +export default getScrollRtlBehavior; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/selection_filter.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/selection_filter.js new file mode 100644 index 0000000000000000000000000000000000000000..01488255085a2038d6a6bd48a39f89fde1ed68ee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/selection_filter.js @@ -0,0 +1,129 @@ +import { getKeyHash, equalByValue } from './common'; +import { isString, isObject } from './type'; + +export const SelectionFilterCreator = function(selectedItemKeys, isSelectAll) { + + this.getLocalFilter = function(keyGetter, equalKeys, equalByReference, keyExpr) { + equalKeys = equalKeys === undefined ? equalByValue : equalKeys; + return functionFilter.bind(this, equalKeys, keyGetter, equalByReference, keyExpr); + }; + + this.getExpr = function(keyExpr) { + if(!keyExpr) { + return; + } + + let filterExpr; + + selectedItemKeys.forEach(function(key, index) { + filterExpr = filterExpr || []; + + let filterExprPart; + + if(index > 0) { + filterExpr.push(isSelectAll ? 'and' : 'or'); + } + + if(isString(keyExpr)) { + filterExprPart = getFilterForPlainKey(keyExpr, key); + } else { + filterExprPart = getFilterForCompositeKey(keyExpr, key); + } + + filterExpr.push(filterExprPart); + }); + + if(filterExpr && filterExpr.length === 1) { + filterExpr = filterExpr[0]; + } + + return filterExpr; + }; + + this.getCombinedFilter = function(keyExpr, dataSourceFilter) { + const filterExpr = this.getExpr(keyExpr); + let combinedFilter = filterExpr; + + if(isSelectAll && dataSourceFilter) { + if(filterExpr) { + combinedFilter = []; + combinedFilter.push(filterExpr); + combinedFilter.push(dataSourceFilter); + } else { + combinedFilter = dataSourceFilter; + } + } + + return combinedFilter; + }; + + let selectedItemKeyHashesMap; + + const getSelectedItemKeyHashesMap = function(keyOf, keyExpr) { + if(!selectedItemKeyHashesMap) { + selectedItemKeyHashesMap = {}; + const normalizedKeys = normalizeKeys(selectedItemKeys, keyOf, keyExpr); + for(let i = 0; i < normalizedKeys.length; i++) { + selectedItemKeyHashesMap[getKeyHash(normalizedKeys[i])] = true; + } + } + return selectedItemKeyHashesMap; + }; + + const normalizeKeys = function(keys, keyOf, keyExpr) { + return Array.isArray(keyExpr) ? keys.map(key => keyOf(key)) : keys; + }; + + function functionFilter(equalKeys, keyOf, equalByReference, keyExpr, item) { + const key = keyOf(item); + let keyHash; + let i; + + if(!equalByReference) { + keyHash = getKeyHash(key); + if(!isObject(keyHash)) { + const selectedKeyHashesMap = getSelectedItemKeyHashesMap(keyOf, keyExpr); + if(selectedKeyHashesMap[keyHash]) { + return !isSelectAll; + } + return !!isSelectAll; + } + } + + for(i = 0; i < selectedItemKeys.length; i++) { + if(equalKeys(selectedItemKeys[i], key)) { + return !isSelectAll; + } + } + return !!isSelectAll; + } + + function getFilterForPlainKey(keyExpr, keyValue) { + if(keyValue === undefined) { + return; + } + return [keyExpr, isSelectAll ? '<>' : '=', keyValue]; + } + + function getFilterForCompositeKey(keyExpr, itemKeyValue) { + const filterExpr = []; + + for(let i = 0, length = keyExpr.length; i < length; i++) { + const currentKeyExpr = keyExpr[i]; + const currentKeyValue = itemKeyValue && itemKeyValue[currentKeyExpr]; + const filterExprPart = getFilterForPlainKey(currentKeyExpr, currentKeyValue); + + if(!filterExprPart) { + break; + } + + if(i > 0) { + filterExpr.push(isSelectAll ? 'or' : 'and'); + } + + filterExpr.push(filterExprPart); + } + + return filterExpr; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/size.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/size.js new file mode 100644 index 0000000000000000000000000000000000000000..557911e4b1aeaf562e65a4f8fe8a4f1a4c3f00a6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/size.js @@ -0,0 +1,318 @@ +import { getWindow } from '../../core/utils/window'; +import domAdapter from '../../core/dom_adapter'; +import { isWindow, isString, isNumeric, isRenderer } from '../utils/type'; + +const window = getWindow(); + +const SPECIAL_HEIGHT_VALUES = ['auto', 'none', 'inherit', 'initial']; + +const getSizeByStyles = function(elementStyles, styles) { + let result = 0; + + styles.forEach(function(style) { + result += (parseFloat(elementStyles[style]) || 0); + }); + + return result; +}; + +export const getElementBoxParams = function(name, elementStyles) { + const beforeName = name === 'width' ? 'Left' : 'Top'; + const afterName = name === 'width' ? 'Right' : 'Bottom'; + + return { + padding: getSizeByStyles(elementStyles, ['padding' + beforeName, 'padding' + afterName]), + border: getSizeByStyles(elementStyles, ['border' + beforeName + 'Width', 'border' + afterName + 'Width']), + margin: getSizeByStyles(elementStyles, ['margin' + beforeName, 'margin' + afterName]), + }; +}; + +const getElementComputedStyle = function(element) { + const view = element?.ownerDocument?.defaultView || window; + return view.getComputedStyle && view.getComputedStyle(element); +}; +const getCSSProperty = function(element, styles, name, defaultValue) { + return styles?.[name] || element.style?.[name] || defaultValue; +}; + + +const boxIndices = { + content: 0, + padding: 1, + border: 2, + margin: 3, + 'content-box': 0, + 'border-box': 2, +}; +const dimensionComponents = { + width: ['left', 'right'], + height: ['top', 'bottom'] +}; +function getComponentThickness(elem, dimension, component, styles) { + const get = (elem, styles, field) => parseFloat(getCSSProperty(elem, styles, field, '0')) || 0; + const suffix = component === 'border' ? '-width' : ''; + return get(elem, styles, `${component}-${dimensionComponents[dimension][0]}${suffix}`) + + get(elem, styles, `${component}-${dimensionComponents[dimension][1]}${suffix}`); +} + +export const getSize = function(element, dimension, box) { + const offsetFieldName = dimension === 'width' ? 'offsetWidth' : 'offsetHeight'; + + const styles = getElementComputedStyle(element); + let result = getCSSProperty(element, styles, dimension); + if(result === '' || result === 'auto') { + result = element[offsetFieldName]; + } + result = parseFloat(result) || 0; + + const currentBox = getCSSProperty(element, styles, 'boxSizing', 'content-box'); + const targetBox = box || currentBox; + + let targetBoxIndex = boxIndices[targetBox]; + let currentBoxIndex = boxIndices[currentBox]; + + if(targetBoxIndex === undefined || currentBoxIndex === undefined) { + throw new Error(); + } + + if(currentBoxIndex === targetBoxIndex) { + return result; + } + + const coeff = Math.sign(targetBoxIndex - currentBoxIndex); + let padding = false; + let border = false; + let margin = false; + let scrollThickness = false; + + if(coeff === 1) { + targetBoxIndex += 1; + currentBoxIndex += 1; + } + + for(let boxPart = currentBoxIndex; boxPart !== targetBoxIndex; boxPart += coeff) { + + switch(boxPart) { + case boxIndices.content: + break; + case boxIndices.padding: + padding = coeff * getComponentThickness(element, dimension, 'padding', styles); + break; + case boxIndices.border: + border = coeff * getComponentThickness(element, dimension, 'border', styles); + break; + case boxIndices.margin: + margin = coeff * getComponentThickness(element, dimension, 'margin', styles); + break; + } + } + + if(padding || border) { + const paddingAndBorder = + (padding === false ? coeff * getComponentThickness(element, dimension, 'padding', styles) : padding) + + (border === false ? coeff * getComponentThickness(element, dimension, 'border', styles) : border); + + scrollThickness = coeff * Math.max(0, Math.floor( + element[offsetFieldName] - + result - + (coeff * paddingAndBorder) + )) || 0; + } + + return result + margin + padding + border + scrollThickness; +}; + +const getContainerHeight = function(container) { + return isWindow(container) ? container.innerHeight : container.offsetHeight; +}; + +export const parseHeight = function(value, container) { + if(value.indexOf('px') > 0) { + value = parseInt(value.replace('px', '')); + } else if(value.indexOf('%') > 0) { + value = parseInt(value.replace('%', '')) * getContainerHeight(container) / 100; + } else if(!isNaN(value)) { + value = parseInt(value); + } + + return value; +}; + +const getHeightWithOffset = function(value, offset, container) { + if(!value) { + return null; + } + + if(SPECIAL_HEIGHT_VALUES.indexOf(value) > -1) { + return offset ? null : value; + } + + if(isString(value)) { + value = parseHeight(value, container); + } + + if(isNumeric(value)) { + return Math.max(0, value + offset); + } + + const operationString = offset < 0 ? ' - ' : ' '; + + return 'calc(' + value + operationString + Math.abs(offset) + 'px)'; +}; + +export const addOffsetToMaxHeight = function(value, offset, container) { + const maxHeight = getHeightWithOffset(value, offset, container); + return maxHeight !== null ? maxHeight : 'none'; +}; + +export const addOffsetToMinHeight = function(value, offset, container) { + const minHeight = getHeightWithOffset(value, offset, container); + return minHeight !== null ? minHeight : 0; +}; + +export const getVerticalOffsets = function(element, withMargins) { + if(!element) { + return 0; + } + + const boxParams = getElementBoxParams('height', window.getComputedStyle(element)); + + return boxParams.padding + + boxParams.border + + (withMargins ? boxParams.margin : 0); +}; + +export const getVisibleHeight = function(element) { + if(element) { + const boundingClientRect = element.getBoundingClientRect(); + + if(boundingClientRect.height) { + return boundingClientRect.height; + } + } + + return 0; +}; + +// TODO: remove when we'll start mocking named exports +export const implementationsMap = { + getWidth: (...args) => elementSizeHelper('width', ...args), + setWidth: (...args) => elementSizeHelper('width', ...args), + getHeight: (...args) => elementSizeHelper('height', ...args), + setHeight: (...args) => elementSizeHelper('height', ...args), + getOuterWidth: (...args) => elementSizeHelper('outerWidth', ...args), + setOuterWidth: (...args) => elementSizeHelper('outerWidth', ...args), + getOuterHeight: (...args) => elementSizeHelper('outerHeight', ...args), + setOuterHeight: (...args) => elementSizeHelper('outerHeight', ...args), + getInnerWidth: (...args) => elementSizeHelper('innerWidth', ...args), + setInnerWidth: (...args) => elementSizeHelper('innerWidth', ...args), + getInnerHeight: (...args) => elementSizeHelper('innerHeight', ...args), + setInnerHeight: (...args) => elementSizeHelper('innerHeight', ...args), +}; +function elementSizeHelper(sizeProperty, el, value) { + return arguments.length === 2 ? elementSize(el, sizeProperty) : elementSize(el, sizeProperty, value); +} + +export const getWidth = (el) => implementationsMap.getWidth(el); +export const setWidth = (el, value) => implementationsMap.setWidth(el, value); +export const getHeight = (el) => implementationsMap.getHeight(el); +export const setHeight = (el, value) => implementationsMap.setHeight(el, value); +export const getOuterWidth = (el, includeMargin) => implementationsMap.getOuterWidth(el, includeMargin || false); +export const setOuterWidth = (el, value) => implementationsMap.setOuterWidth(el, value); +export const getOuterHeight = (el, includeMargin) => implementationsMap.getOuterHeight(el, includeMargin || false); +export const setOuterHeight = (el, value) => implementationsMap.setOuterHeight(el, value); +export const getInnerWidth = (el) => implementationsMap.getInnerWidth(el); +export const setInnerWidth = (el, value) => implementationsMap.setInnerWidth(el, value); +export const getInnerHeight = (el) => implementationsMap.getInnerHeight(el); +export const setInnerHeight = (el, value) => implementationsMap.setInnerHeight(el, value); + +const elementSize = function(el, sizeProperty, value) { + const partialName = sizeProperty.toLowerCase().indexOf('width') >= 0 ? 'Width' : 'Height'; + const propName = partialName.toLowerCase(); + const isOuter = sizeProperty.indexOf('outer') === 0; + const isInner = sizeProperty.indexOf('inner') === 0; + const isGetter = arguments.length === 2 || typeof value === 'boolean'; + + if(isRenderer(el)) { + if(el.length > 1 && !isGetter) { + for(let i = 0; i < el.length; i++) { + elementSize(el[i], sizeProperty, value); + } + return; + } + el = el[0]; + } + + if(!el) return; + + if(isWindow(el)) { + return isOuter ? el['inner' + partialName] : domAdapter.getDocumentElement()['client' + partialName]; + } + + if(domAdapter.isDocument(el)) { + const documentElement = domAdapter.getDocumentElement(); + const body = domAdapter.getBody(); + + return Math.max( + body['scroll' + partialName], + body['offset' + partialName], + documentElement['scroll' + partialName], + documentElement['offset' + partialName], + documentElement['client' + partialName] + ); + } + + if(isGetter) { + let box = 'content'; + if(isOuter) { + box = value ? 'margin' : 'border'; + } + if(isInner) { + box = 'padding'; + } + + return getSize(el, propName, box); + } + + if(isNumeric(value)) { + const elementStyles = getElementComputedStyle(el); + const sizeAdjustment = getElementBoxParams(propName, elementStyles); + const isBorderBox = elementStyles.boxSizing === 'border-box'; + value = Number(value); + + if(isOuter) { + value -= isBorderBox ? 0 : (sizeAdjustment.border + sizeAdjustment.padding); + } else if(isInner) { + value += isBorderBox ? sizeAdjustment.border : -sizeAdjustment.padding; + } else if(isBorderBox) { + value += sizeAdjustment.border + sizeAdjustment.padding; + } + } + value += isNumeric(value) ? 'px' : ''; + + domAdapter.setStyle(el, propName, value); + + return null; +}; + +export const getWindowByElement = (el) => { + return isWindow(el) ? el : el.defaultView; +}; + +export const getOffset = (el) => { + if(!el.getClientRects().length) { + return { + top: 0, + left: 0 + }; + } + + const rect = el.getBoundingClientRect(); + const win = getWindowByElement(el.ownerDocument); + const docElem = el.ownerDocument.documentElement; + + return { + top: rect.top + win.pageYOffset - docElem.clientTop, + left: rect.left + win.pageXOffset - docElem.clientLeft + }; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/storage.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/storage.js new file mode 100644 index 0000000000000000000000000000000000000000..d8cc55cd89425db0c9e88956ee3ccd1a7ecae5b8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/storage.js @@ -0,0 +1,14 @@ +import { getWindow } from '../../core/utils/window'; +const window = getWindow(); + +const getSessionStorage = function() { + let sessionStorage; + + try { + sessionStorage = window.sessionStorage; + } catch(e) { } + + return sessionStorage; +}; + +export { getSessionStorage as sessionStorage }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/string.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/string.js new file mode 100644 index 0000000000000000000000000000000000000000..0e43bdff178933d260669797474ca55675c1f269 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/string.js @@ -0,0 +1,91 @@ +import { isFunction, isString } from './type'; + +export const encodeHtml = (function() { + const encodeRegExp = [new RegExp('&', 'g'), new RegExp('"', 'g'), new RegExp('\'', 'g'), new RegExp('<', 'g'), new RegExp('>', 'g')]; + + return function(str) { + return String(str) + .replace(encodeRegExp[0], '&') + .replace(encodeRegExp[1], '"') + .replace(encodeRegExp[2], ''') + .replace(encodeRegExp[3], '<') + .replace(encodeRegExp[4], '>'); + }; +})(); + + +const splitQuad = function(raw) { + switch(typeof raw) { + case 'string': + return raw.split(/\s+/, 4); + case 'object': + return [ + raw.x || raw.h || raw.left, + raw.y || raw.v || raw.top, + raw.x || raw.h || raw.right, + raw.y || raw.v || raw.bottom]; + case 'number': + return [raw]; + default: + return raw; + } +}; + +export const quadToObject = function(raw) { + const quad = splitQuad(raw); + let left = parseInt(quad && quad[0], 10); + let top = parseInt(quad && quad[1], 10); + let right = parseInt(quad && quad[2], 10); + let bottom = parseInt(quad && quad[3], 10); + + if(!isFinite(left)) { + left = 0; + } + if(!isFinite(top)) { + top = left; + } + if(!isFinite(right)) { + right = left; + } + if(!isFinite(bottom)) { + bottom = top; + } + + return { top: top, right: right, bottom: bottom, left: left }; +}; + +export function format(template, ...values) { + if(isFunction(template)) { + return template(...values); + } + + values.forEach((value, index) => { + if(isString(value)) { + value = value.replace(/\$/g, '$$$$'); + } + + const placeholderReg = new RegExp('\\{' + index + '\\}', 'gm'); + template = template.replace(placeholderReg, value); + }); + + return template; +} + +export const replaceAll = (function() { + const quote = function(str) { + return (str + '').replace(/([+*?.[^\]$(){}><|=!:])/g, '\\$1'); // lgtm[js/incomplete-sanitization] + }; + + return function(text, searchToken, replacementToken) { + return text.replace(new RegExp('(' + quote(searchToken) + ')', 'gi'), replacementToken); + }; +})(); + +export const isEmpty = (function() { + const SPACE_REGEXP = /\s/g; + + return function(text) { + return !text || !text.replace(SPACE_REGEXP, ''); + }; +})(); + diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/stubs.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/stubs.js new file mode 100644 index 0000000000000000000000000000000000000000..780fd01108c3d6c972f79ee5b26ae302deef93da --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/stubs.js @@ -0,0 +1,10 @@ +export function stubComponent(componentName) { + return class NoComponent { + constructor() { + // TODO: make correct exceptions here and in decorators + throw new Error(`Module '${componentName}' not found`); + } + + static getInstance() {} + }; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/style.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/style.js new file mode 100644 index 0000000000000000000000000000000000000000..e21dc226ffee4462413e6f05b2900c55af20834a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/style.js @@ -0,0 +1,120 @@ +import { camelize } from './inflector'; +import callOnce from './call_once'; +import { isNumeric, isString } from './type'; +import domAdapter from '../dom_adapter'; + +const jsPrefixes = ['', 'Webkit', 'Moz', 'O', 'Ms']; +const cssPrefixes = { + '': '', + 'Webkit': '-webkit-', + 'Moz': '-moz-', + 'O': '-o-', + 'ms': '-ms-' +}; +const getStyles = callOnce(function() { + return domAdapter.createElement('dx').style; +}); + +const forEachPrefixes = function(prop, callBack) { + prop = camelize(prop, true); + + let result; + + for(let i = 0, cssPrefixesCount = jsPrefixes.length; i < cssPrefixesCount; i++) { + const jsPrefix = jsPrefixes[i]; + const prefixedProp = jsPrefix + prop; + const lowerPrefixedProp = camelize(prefixedProp); + + result = callBack(lowerPrefixedProp, jsPrefix); + + if(result === undefined) { + result = callBack(prefixedProp, jsPrefix); + } + + if(result !== undefined) { + break; + } + } + + return result || ''; +}; + +const styleProp = function(name) { + if(name in getStyles()) { + return name; + } + + const originalName = name; + name = name.charAt(0).toUpperCase() + name.substr(1); + for(let i = 1; i < jsPrefixes.length; i++) { + const prefixedProp = jsPrefixes[i].toLowerCase() + name; + if(prefixedProp in getStyles()) { + return prefixedProp; + } + } + + return originalName; +}; + +const stylePropPrefix = function(prop) { + return forEachPrefixes(prop, function(specific, jsPrefix) { + if(specific in getStyles()) { + return cssPrefixes[jsPrefix]; + } + }); +}; + + +const pxExceptions = [ + 'fillOpacity', + 'columnCount', + 'flexGrow', + 'flexShrink', + 'fontWeight', + 'lineHeight', + 'opacity', + 'zIndex', + 'zoom' +]; + +const parsePixelValue = function(value) { + if(isNumeric(value)) { + return value; + } else if(isString(value)) { + return Number(value.replace('px', '')); + } + return NaN; +}; + +const normalizeStyleProp = function(prop, value) { + if(isNumeric(value) && pxExceptions.indexOf(prop) === -1) { + value += 'px'; + } + + return value; +}; + +const setDimensionProperty = function(elements, propertyName, value) { + if(elements) { + value = isNumeric(value) ? value += 'px' : value; + for(let i = 0; i < elements.length; ++i) { + elements[i].style[propertyName] = value; + } + } +}; + +const setWidth = function(elements, value) { + setDimensionProperty(elements, 'width', value); +}; + +const setHeight = function(elements, value) { + setDimensionProperty(elements, 'height', value); +}; + +export { + styleProp, + stylePropPrefix, + normalizeStyleProp, + parsePixelValue, + setWidth, + setHeight }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/support.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/support.js new file mode 100644 index 0000000000000000000000000000000000000000..1e622d09d858eb32f93032f2389bdcf4f9c7da4c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/support.js @@ -0,0 +1,76 @@ +import { inArray } from './array'; +import domAdapter from '../dom_adapter'; +import callOnce from './call_once'; +import { getNavigator, hasProperty } from './window'; +import devices from '../devices'; +import { stylePropPrefix, styleProp } from './style'; + +const { + maxTouchPoints, +} = getNavigator(); +const transitionEndEventNames = { + 'webkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' +}; + +const supportProp = function(prop) { + return !!styleProp(prop); +}; + +const isNativeScrollingSupported = function() { + const { platform, version, mac: isMac } = devices.real(); + const isObsoleteAndroid = (version && version[0] < 4 && platform === 'android'); + const isNativeScrollDevice = !isObsoleteAndroid && inArray(platform, ['ios', 'android']) > -1 || isMac; + + return isNativeScrollDevice; +}; + +const inputType = function(type) { + if(type === 'text') { + return true; + } + + const input = domAdapter.createElement('input'); + try { + input.setAttribute('type', type); + input.value = 'wrongValue'; + return !input.value; + } catch(e) { + return false; + } +}; + +const detectTouchEvents = function(hasWindowProperty, maxTouchPoints) { + return (hasWindowProperty('ontouchstart') || !!maxTouchPoints) && !hasWindowProperty('callPhantom'); +}; + +const detectPointerEvent = function(hasWindowProperty) { + return hasWindowProperty('PointerEvent'); +}; + +const touchEvents = detectTouchEvents(hasProperty, maxTouchPoints); +const pointerEvents = detectPointerEvent(hasProperty); +const touchPointersPresent = !!maxTouchPoints; + +///#DEBUG +export { + detectTouchEvents, + detectPointerEvent +}; +///#ENDDEBUG +export { + touchEvents, + pointerEvents, + styleProp, + stylePropPrefix, + supportProp, + inputType +}; + +export const touch = touchEvents || pointerEvents && touchPointersPresent; +export const transition = callOnce(function() { return supportProp('transition'); }); +export const transitionEndEventName = callOnce(function() { return transitionEndEventNames[styleProp('transition')]; }); +export const animation = callOnce(function() { return supportProp('animation'); }); +export const nativeScrolling = isNativeScrollingSupported(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/svg.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/svg.js new file mode 100644 index 0000000000000000000000000000000000000000..01b518ddca13a90ba3a6a69a75b1d32c787e0c9a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/svg.js @@ -0,0 +1,58 @@ +import domAdapter from '../../core/dom_adapter'; +import { getWindow } from './window'; +import $ from '../../core/renderer'; + +const window = getWindow(); + +function getMarkup(element, backgroundColor) { + const temp = domAdapter.createElement('div'); + const clone = element.cloneNode(true); + if(backgroundColor) { + $(clone).css('backgroundColor', backgroundColor); + } + temp.appendChild(clone); + return temp.innerHTML; +} + +function fixNamespaces(markup) { + let first = true; + + if(markup.indexOf('xmlns:xlink') === -1) { + markup = markup.replace(' { + const optionsAttributeName = 'data-options'; + const templates = $(element).contents().filter(`[${optionsAttributeName}*="${name}"]`); + + return [].slice.call(templates).map((element) => { + const optionsString = $(element).attr(optionsAttributeName) || ''; + return { + element, + options: config().optionsParser(optionsString)[name] + }; + }).filter(template => !!template.options); +}; + +export const suitableTemplatesByName = (rawTemplates) => { + const templatesMap = groupBy(rawTemplates, (template) => template.options.name); + + if(templatesMap[undefined]) { + throw Errors.Error('E0023'); + } + + const result = {}; + + Object.keys(templatesMap).forEach((name) => { + const suitableTemplate = findBestMatches( + devices.current(), + templatesMap[name], + template => template.options + )[0]?.element; + + if(suitableTemplate) { + result[name] = suitableTemplate; + } + }); + + return result; +}; + +export const addOneRenderedCall = (template) => { + const render = template.render.bind(template); + return extend({}, template, { + render(options) { + const templateResult = render(options); + options && options.onRendered && options.onRendered(); + return templateResult; + } + }); +}; + +export const getNormalizedTemplateArgs = (options) => { + const args = []; + + if('model' in options) { + args.push(options.model); + } + if('index' in options) { + args.push(options.index); + } + args.push(options.container); + + return args; +}; + +export const validateTemplateSource = (templateSource) => { + return typeof templateSource === 'string' + ? normalizeTemplateElement(templateSource) + : templateSource; +}; + +export const templateKey = (templateSource) => { + return (isRenderer(templateSource) && templateSource[0]) || templateSource; +}; + +export const defaultCreateElement = element => new Template(element); + +export const acquireIntegrationTemplate = (templateSource, templates, isAsyncTemplate, skipTemplates) => { + let integrationTemplate = null; + + if(!skipTemplates || skipTemplates.indexOf(templateSource) === -1) { + integrationTemplate = templates[templateSource]; + if(integrationTemplate && !(integrationTemplate instanceof TemplateBase) && !isAsyncTemplate) { + integrationTemplate = addOneRenderedCall(integrationTemplate); + } + } + + return integrationTemplate; +}; + +export const acquireTemplate = (templateSource, createTemplate, templates, isAsyncTemplate, skipTemplates, defaultTemplates) => { + if(templateSource == null) { + return new EmptyTemplate(); + } + + if(templateSource instanceof ChildDefaultTemplate) { + return defaultTemplates[templateSource.name]; + } + + if(templateSource instanceof TemplateBase) { + return templateSource; + } + + // TODO: templateSource.render is needed for angular2 integration. Try to remove it after supporting TypeScript modules. + if(isFunction(templateSource.render) && !isRenderer(templateSource)) { + return isAsyncTemplate ? templateSource : addOneRenderedCall(templateSource); + } + + if(templateSource.nodeType || isRenderer(templateSource)) { + return createTemplate($(templateSource)); + } + + return acquireIntegrationTemplate(templateSource, templates, isAsyncTemplate, skipTemplates) + || defaultTemplates[templateSource] + || createTemplate(templateSource); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..16071363779a2c1eb290bbad28d7eb138bc42f3e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.d.ts @@ -0,0 +1,34 @@ +export declare function isBoolean(object: any): object is boolean; + +export declare function isDate(object: any): object is Date; + +export declare function isString(object: any): object is string; + +export declare function type(object: any): 'object' | 'array' | 'string' | 'date' | 'null' | string; + +export declare function isNumeric(object: any): object is number; + +export declare function isFunction(object: any): object is Function; + +export declare function isExponential(object: any): object is number; + +export declare function isDefined(object: T): object is NonNullable; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars +export declare function isObject(object: unknown): object is object; + +export declare function isEmptyObject(object: any): boolean; + +export declare function isPlainObject(object: any): object is { [key: string]: any }; + +export declare function isPrimitive(value: any): value is string | number | boolean | undefined | symbol | null; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error +// @ts-ignore: globalThis was introduced in TypeScript 3.4 +export declare function isWindow(object: any): object is (Window & typeof globalThis); + +export declare function isRenderer(object: any): boolean; + +export declare function isPromise(object: any): object is Promise; + +export declare function isDeferred(object: any): boolean; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.js new file mode 100644 index 0000000000000000000000000000000000000000..383a958a87cededc4e579fa707ca43f7d5ffcc77 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/type.js @@ -0,0 +1,110 @@ +const types = { + '[object Array]': 'array', + '[object Date]': 'date', + '[object Object]': 'object', + '[object String]': 'string', + '[object Null]': 'null' }; + +const type = function(object) { + const typeOfObject = Object.prototype.toString.call(object); + + return typeof object === 'object' ? + types[typeOfObject] || 'object' : typeof object; +}; + +const isBoolean = function(object) { + return typeof object === 'boolean'; +}; + +const isExponential = function(value) { + return isNumeric(value) && value.toString().indexOf('e') !== -1; +}; + +const isDate = function(object) { + return type(object) === 'date'; +}; + +const isDefined = function(object) { + return (object !== null) && (object !== undefined); +}; + +const isFunction = function(object) { + return typeof object === 'function'; +}; + +const isString = function(object) { + return typeof object === 'string'; +}; + +const isNumeric = function(object) { + return ((typeof object === 'number') && isFinite(object) || !isNaN(object - parseFloat(object))); +}; + +const isObject = function(object) { + return type(object) === 'object'; +}; + +const isEmptyObject = function(object) { + let property; + + for(property in object) { + return false; + } + + return true; +}; + +const isPlainObject = function(object) { + if(!object || Object.prototype.toString.call(object) !== '[object Object]') { + return false; + } + const proto = Object.getPrototypeOf(object); + const ctor = Object.hasOwnProperty.call(proto, 'constructor') && proto.constructor; + + return typeof ctor === 'function' + && Object.toString.call(ctor) === Object.toString.call(Object); +}; + +const isPrimitive = function(value) { + return ['object', 'array', 'function'].indexOf(type(value)) === -1; +}; + +const isWindow = function(object) { + return object != null && object === object.window; +}; + +const isRenderer = function(object) { + return !!object && !!(object.jquery || object.dxRenderer); +}; + +const isPromise = function(object) { + return !!object && isFunction(object.then); +}; + +const isDeferred = function(object) { + return !!object && isFunction(object.done) && isFunction(object.fail); +}; + +const isEvent = function(object) { + return !!(object && object.preventDefault); +}; + +export { + isBoolean, + isExponential, + isDate, + isDefined, + isFunction, + isString, + isNumeric, + isObject, + isEmptyObject, + isPlainObject, + isPrimitive, + isWindow, + isRenderer, + isPromise, + isDeferred, + type, + isEvent +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/variable_wrapper.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/variable_wrapper.js new file mode 100644 index 0000000000000000000000000000000000000000..0833812102723f2edf7ed831ebb00080d8d67fcb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/variable_wrapper.js @@ -0,0 +1,20 @@ +import { logger } from './console'; +import dependencyInjector from './dependency_injector'; + +export default dependencyInjector({ + isWrapped: function() { + return false; + }, + isWritableWrapped: function() { + return false; + }, + wrap: function(value) { + return value; + }, + unwrap: function(value) { + return value; + }, + assign: function() { + logger.error('Method \'assign\' should not be used for not wrapped variables. Use \'isWrapped\' method for ensuring.'); + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/version.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/version.js new file mode 100644 index 0000000000000000000000000000000000000000..f8535e0be6bc52be69576a95a9423649438c3f72 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/version.js @@ -0,0 +1,35 @@ +export function compare(x, y, maxLevel) { + + function normalizeArg(value) { + if(typeof value === 'string') { + return value.split('.'); + } + if(typeof value === 'number') { + return [value]; + } + return value; + } + + x = normalizeArg(x); + y = normalizeArg(y); + + let length = Math.max(x.length, y.length); + + if(isFinite(maxLevel)) { + length = Math.min(length, maxLevel); + } + + for(let i = 0; i < length; i++) { + const xItem = parseInt(x[i] || 0, 10); + const yItem = parseInt(y[i] || 0, 10); + + if(xItem < yItem) { + return -1; + } + if(xItem > yItem) { + return 1; + } + } + + return 0; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/view_port.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/view_port.js new file mode 100644 index 0000000000000000000000000000000000000000..f9296f0b502c4ebbf850acc9d4883956d7780325 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/view_port.js @@ -0,0 +1,36 @@ +import $ from '../renderer'; +import readyCallbacks from './ready_callbacks'; +const ready = readyCallbacks.add; +import callbacks from './callbacks'; +const changeCallback = callbacks(); +let $originalViewPort = $(); + +const value = (function() { + let $current; + + return function(element) { + if(!arguments.length) { + return $current; + } + + const $element = $(element); + $originalViewPort = $element; + const isNewViewportFound = !!$element.length; + const prevViewPort = value(); + $current = isNewViewportFound ? $element : $('body'); + changeCallback.fire(isNewViewportFound ? value() : $(), prevViewPort); + }; +})(); + +ready(function() { + value('.dx-viewport'); +}); + +export { + value, + changeCallback +}; + +export function originalViewPort() { + return $originalViewPort; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.d.ts b/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..82197559ba05c42526c0d53b3cbe064939fbc20c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.d.ts @@ -0,0 +1,7 @@ +export declare function getWindow(): Window; +export declare function hasWindow(): boolean; +export declare function setWindow( + newWindowObject: Window | Record, + // eslint-disable-next-line @typescript-eslint/no-shadow + hasWindow?: boolean +): void; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.js b/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.js new file mode 100644 index 0000000000000000000000000000000000000000..49c14fbd78935e28a91f3e8a54a9ce4b15418ee0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/utils/window.js @@ -0,0 +1,58 @@ +/* global window */ + +import domAdapter from '../dom_adapter'; + +let hasWindowValue = typeof window !== 'undefined'; + +const hasWindow = () => hasWindowValue; + +let windowObject = hasWindow() ? window : undefined; + +if(!windowObject) { + windowObject = {}; + windowObject.window = windowObject; +} + +const getWindow = () => windowObject; + +const setWindow = (newWindowObject, hasWindow) => { + if(hasWindow === undefined) { + hasWindowValue = typeof window !== 'undefined' && window === newWindowObject; + } else { + hasWindowValue = hasWindow; + } + windowObject = newWindowObject; +}; + +const hasProperty = (prop) => hasWindow() && prop in windowObject; + +const defaultScreenFactorFunc = (width) => { + if(width < 768) { + return 'xs'; + } else if(width < 992) { + return 'sm'; + } else if(width < 1200) { + return 'md'; + } else { + return 'lg'; + } +}; + +const getCurrentScreenFactor = (screenFactorCallback) => { + const screenFactorFunc = screenFactorCallback || defaultScreenFactorFunc; + const windowWidth = domAdapter.getDocumentElement()['clientWidth']; + + return screenFactorFunc(windowWidth); +}; + +const getNavigator = () => hasWindow() ? windowObject.navigator : { userAgent: '' }; + +export { + hasWindow, + getWindow, + setWindow, + hasProperty, + defaultScreenFactorFunc, + getCurrentScreenFactor, + getNavigator +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/core/version.js b/packages/f-theme-editor/farris-theme-editor/js/core/version.js new file mode 100644 index 0000000000000000000000000000000000000000..e416ef510c96a5e166c74f529bd1158adde0de0d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/core/version.js @@ -0,0 +1 @@ +export const version = '%VERSION%'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ca7741d8dff12836eaa2349e7100809b692e03f9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.d.ts @@ -0,0 +1,230 @@ +import { DxPromise } from '../core/utils/deferred'; +import { DeepPartial } from '../core/index'; +import { FilterDescriptor, GroupDescriptor, LoadOptions } from './index'; + +export type Options< + TItem = any, + TKey = any, +> = StoreOptions; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface StoreOptions< + TItem = any, + TKey = any, +> { + /** + * @docid + * @public + */ + errorHandler?: Function; + /** + * @docid + * @public + */ + key?: string | Array; + /** + * @docid + * @type_function_param1 values:object + * @type_function_param2 key:object|string|number + * @action + * @public + */ + onInserted?: ((values: TItem, key: TKey) => void); + /** + * @docid + * @type_function_param1 values:object + * @action + * @public + */ + onInserting?: ((values: TItem) => void); + /** + * @docid + * @type_function_param2 loadOptions:LoadOptions + * @action + * @public + */ + onLoaded?: ((result: Array, loadOptions: LoadOptions) => void); + /** + * @docid + * @type_function_param1 loadOptions:LoadOptions + * @action + * @public + */ + onLoading?: ((loadOptions: LoadOptions) => void); + /** + * @docid + * @action + * @public + */ + onModified?: Function; + /** + * @docid + * @action + * @public + */ + onModifying?: Function; + /** + * @docid + * @action + * @public + */ + onPush?: ((changes: Array) => void); + /** + * @docid + * @type_function_param1 key:object|string|number + * @action + * @public + */ + onRemoved?: ((key: TKey) => void); + /** + * @docid + * @type_function_param1 key:object|string|number + * @action + * @public + */ + onRemoving?: ((key: TKey) => void); + /** + * @docid + * @type_function_param1 key:object|string|number + * @type_function_param2 values:object + * @action + * @public + */ + onUpdated?: ((key: TKey, values: TItem) => void); + /** + * @docid + * @type_function_param1 key:object|string|number + * @type_function_param2 values:object + * @action + * @public + */ + onUpdating?: ((key: TKey, values: TItem) => void); +} + +type EventName = 'loaded' | 'loading' | 'inserted' | 'inserting' | 'updated' | 'updating' | 'push' | 'removed' | 'removing' | 'modified' | 'modifying'; + +/** + * @docid + * @hidden + * @namespace DevExpress.data + */ +export default class Store< + TItem = any, + TKey = any, +> { + constructor(options?: Options) + /** + * @docid + * @publicName byKey(key) + * @param1 key:object|string|number + * @param2 extraOptions:LoadOptions + * @return Promise + * @public + */ + byKey(key: TKey, extraOptions?: LoadOptions): DxPromise; + /** + * @docid + * @publicName insert(values) + * @param1 values:object + * @return Promise + * @public + */ + insert(values: TItem): DxPromise; + /** + * @docid + * @publicName key() + * @public + */ + key(): string | Array; + /** + * @docid + * @publicName keyOf(obj) + * @param1 obj:object + * @return any|string|number + * @public + */ + keyOf(obj: TItem): TKey; + /** + * @docid + * @publicName load() + * @return Promise + * @public + */ + load(): DxPromise>; + /** + * @docid + * @publicName load(options) + * @param1 options:LoadOptions + * @return Promise + * @public + */ + load(options: LoadOptions): DxPromise>; + /** + * @docid + * @publicName off(eventName) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName): this; + /** + * @docid + * @publicName off(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + on(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(events) + * @param1 events:object + * @return this + * @public + */ + on(events: { [key in EventName]?: Function }): this; + /** + * @docid + * @publicName push(changes) + * @param1 changes:Array + * @public + */ + push(changes: Array<{ type: 'insert' | 'update' | 'remove'; data?: DeepPartial; key?: TKey; index?: number }>): void; + /** + * @docid + * @publicName remove(key) + * @param1 key:object|string|number + * @return Promise + * @public + */ + remove(key: TKey): DxPromise; + /** + * @docid + * @publicName totalCount(options) + * @param1_field1 filter:object + * @param1_field2 group:object + * @return Promise + * @public + */ + totalCount(obj: { filter?: FilterDescriptor | Array; group?: GroupDescriptor | Array> }): DxPromise; + /** + * @docid + * @publicName update(key, values) + * @param1 key:object|string|number + * @param2 values:object + * @return Promise + * @public + */ + update(key: TKey, values: DeepPartial): DxPromise; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.js b/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.js new file mode 100644 index 0000000000000000000000000000000000000000..97528eae1f7c0a782b2aee9a75a62251d5848b91 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/abstract_store.js @@ -0,0 +1,228 @@ +import Class from '../core/class'; +const abstract = Class.abstract; +import { EventsStrategy } from '../core/events_strategy'; +import { each } from '../core/utils/iterator'; +import { errors, handleError } from './errors'; +import { processRequestResultLock } from './utils'; +import { compileGetter } from '../core/utils/data'; +import storeHelper from './store_helper'; +const queryByOptions = storeHelper.queryByOptions; +import { Deferred, when } from '../core/utils/deferred'; +import { noop } from '../core/utils/common'; + +const storeImpl = {}; + +const Store = Class.inherit({ + + ctor: function(options) { + const that = this; + options = options || {}; + this._eventsStrategy = new EventsStrategy(this); + + each( + [ + 'onLoaded', + + 'onLoading', + + 'onInserted', + + 'onInserting', + + 'onUpdated', + + 'onUpdating', + + 'onPush', + + 'onRemoved', + + 'onRemoving', + + 'onModified', + + 'onModifying' + ], + function(_, optionName) { + if(optionName in options) { + that.on(optionName.slice(2).toLowerCase(), options[optionName]); + } + }); + + this._key = options.key; + + this._errorHandler = options.errorHandler; + + this._useDefaultSearch = true; + }, + + _customLoadOptions: function() { + return null; + }, + + key: function() { + return this._key; + }, + + keyOf: function(obj) { + if(!this._keyGetter) { + this._keyGetter = compileGetter(this.key()); + } + + return this._keyGetter(obj); + }, + + _requireKey: function() { + if(!this.key()) { + throw errors.Error('E4005'); + } + }, + load: function(options) { + const that = this; + + options = options || {}; + + this._eventsStrategy.fireEvent('loading', [options]); + + return this._withLock(this._loadImpl(options)).done(function(result) { + that._eventsStrategy.fireEvent('loaded', [result, options]); + }); + }, + + _loadImpl: function(options) { + return queryByOptions(this.createQuery(options), options).enumerate(); + }, + + _withLock: function(task) { + const result = new Deferred(); + + task.done(function() { + const that = this; + const args = arguments; + + processRequestResultLock + .promise() + .done(function() { + result.resolveWith(that, args); + }); + + }).fail(function() { + result.rejectWith(this, arguments); + }); + + return result; + }, + + createQuery: abstract, + + totalCount: function(options) { + return this._totalCountImpl(options); + }, + + _totalCountImpl: function(options) { + return queryByOptions(this.createQuery(options), options, true).count(); + }, + + byKey: function(key, extraOptions) { + return this._addFailHandlers(this._withLock(this._byKeyImpl(key, extraOptions))); + }, + + _byKeyImpl: abstract, + + insert: function(values) { + const that = this; + + that._eventsStrategy.fireEvent('modifying'); + that._eventsStrategy.fireEvent('inserting', [values]); + + return that._addFailHandlers(that._insertImpl(values).done(function(callbackValues, callbackKey) { + that._eventsStrategy.fireEvent('inserted', [callbackValues, callbackKey]); + that._eventsStrategy.fireEvent('modified'); + })); + }, + + _insertImpl: abstract, + + update: function(key, values) { + const that = this; + + that._eventsStrategy.fireEvent('modifying'); + that._eventsStrategy.fireEvent('updating', [key, values]); + + return that._addFailHandlers(that._updateImpl(key, values).done(function() { + that._eventsStrategy.fireEvent('updated', [key, values]); + that._eventsStrategy.fireEvent('modified'); + })); + }, + + _updateImpl: abstract, + + push: function(changes) { + const beforePushArgs = { + changes, + waitFor: [] + }; + + this._eventsStrategy.fireEvent('beforePush', [beforePushArgs]); + + when(...beforePushArgs.waitFor).done(() => { + this._pushImpl(changes); + this._eventsStrategy.fireEvent('push', [changes]); + }); + }, + + _pushImpl: noop, + + remove: function(key) { + const that = this; + + that._eventsStrategy.fireEvent('modifying'); + that._eventsStrategy.fireEvent('removing', [key]); + + return that._addFailHandlers(that._removeImpl(key).done(function(callbackKey) { + that._eventsStrategy.fireEvent('removed', [callbackKey]); + that._eventsStrategy.fireEvent('modified'); + })); + }, + + _removeImpl: abstract, + + _addFailHandlers: function(deferred) { + return deferred.fail(this._errorHandler).fail(handleError); + }, + + on(eventName, eventHandler) { + this._eventsStrategy.on(eventName, eventHandler); + return this; + }, + + off(eventName, eventHandler) { + this._eventsStrategy.off(eventName, eventHandler); + return this; + } +}); + +Store.create = function(alias, options) { + if(!(alias in storeImpl)) { + throw errors.Error('E4020', alias); + } + + return new storeImpl[alias](options); +}; + +Store.registerClass = function(type, alias) { + if(alias) { + storeImpl[alias] = type; + } + return type; +}; + +Store.inherit = function(inheritor) { + return function(members, alias) { + const type = inheritor.apply(this, [members]); + Store.registerClass(type, alias); + return type; + }; +}(Store.inherit); + +export default Store; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..726aab4f8a7286b5e8e94d96dfab51afb73441eb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.d.ts @@ -0,0 +1,12 @@ +/** + * @docid Utils.applyChanges + * @publicName applyChanges(data, changes, options) + * @param3 options?:any + * @param3_field1 keyExpr:String|Array + * @param3_field2 immutable:Boolean + * @namespace DevExpress.data + * @public + */ +declare function applyChanges(data: Array, changes: Array, options?: { keyExpr?: string | Array; immutable?: boolean }): Array; + +export default applyChanges; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.js b/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.js new file mode 100644 index 0000000000000000000000000000000000000000..b853ad713ae086bb13439cc07015defd582763dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/apply_changes.js @@ -0,0 +1,3 @@ +import { applyChanges } from './array_utils'; + +export default applyChanges; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/array_query.js b/packages/f-theme-editor/farris-theme-editor/js/data/array_query.js new file mode 100644 index 0000000000000000000000000000000000000000..0c75a3cf495eaa351f51196901a0e645ee81aaf9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/array_query.js @@ -0,0 +1,664 @@ +import Class from '../core/class'; +import { isFunction, isDefined } from '../core/utils/type'; +import { each, map } from '../core/utils/iterator'; +import { compileGetter, toComparable } from '../core/utils/data'; +import { Deferred } from '../core/utils/deferred'; +import { errors, handleError as handleDataError } from './errors'; +import { + aggregators, + isGroupCriterion, + isUnaryOperation, + normalizeBinaryCriterion, + isConjunctiveOperator as isConjunctiveOperatorChecker +} from './utils'; + +const Iterator = Class.inherit({ + + toArray: function() { + const result = []; + + this.reset(); + while(this.next()) { + result.push(this.current()); + } + + return result; + }, + + countable: function() { + return false; + } +}); + +const ArrayIterator = Iterator.inherit({ + + ctor: function(array) { + this.array = array; + this.index = -1; + }, + + next: function() { + if(this.index + 1 < this.array.length) { + this.index++; + return true; + } + return false; + }, + + current: function() { + return this.array[this.index]; + }, + + reset: function() { + this.index = -1; + }, + + toArray: function() { + return this.array.slice(0); + }, + + countable: function() { + return true; + }, + + count: function() { + return this.array.length; + } + +}); + +const WrappedIterator = Iterator.inherit({ + ctor: function(iter) { + this.iter = iter; + }, + + next: function() { return this.iter.next(); }, + current: function() { return this.iter.current(); }, + reset: function() { return this.iter.reset(); } +}); + + +const MapIterator = WrappedIterator.inherit({ + ctor: function(iter, mapper) { + this.callBase(iter); + this.index = -1; + this.mapper = mapper; + }, + + current: function() { + return this.mapper(this.callBase(), this.index); + }, + + next: function() { + const hasNext = this.callBase(); + if(hasNext) { + this.index++; + } + return hasNext; + } +}); + +const defaultCompare = function(xValue, yValue) { + xValue = toComparable(xValue); + yValue = toComparable(yValue); + + if(xValue === null && yValue !== null) { + return -1; + } + + if(xValue !== null && yValue === null) { + return 1; + } + + if(xValue === undefined && yValue !== undefined) { + return 1; + } + + if(xValue !== undefined && yValue === undefined) { + return -1; + } + + if(xValue < yValue) { + return -1; + } + + if(xValue > yValue) { + return 1; + } + + return 0; +}; + +const SortIterator = Iterator.inherit({ + + ctor: function(iter, getter, desc, compare) { + if(!(iter instanceof MapIterator)) { + iter = new MapIterator(iter, this._wrap); + } + this.iter = iter; + this.rules = [{ getter: getter, desc: desc, compare: compare }]; + }, + + thenBy: function(getter, desc, compare) { + const result = new SortIterator(this.sortedIter || this.iter, getter, desc, compare); + if(!this.sortedIter) { + result.rules = this.rules.concat(result.rules); + } + return result; + }, + + next: function() { + this._ensureSorted(); + return this.sortedIter.next(); + }, + + current: function() { + this._ensureSorted(); + return this.sortedIter.current(); + }, + + reset: function() { + delete this.sortedIter; + }, + + countable: function() { + return this.sortedIter || this.iter.countable(); + }, + + count: function() { + if(this.sortedIter) { + return this.sortedIter.count(); + } + return this.iter.count(); + }, + _ensureSorted: function() { + const that = this; + + if(that.sortedIter) { + return; + } + + each(that.rules, function() { + this.getter = compileGetter(this.getter); + }); + + that.sortedIter = new MapIterator( + new ArrayIterator(this.iter.toArray().sort(function(x, y) { + return that._compare(x, y); + })), + that._unwrap + ); + }, + _wrap: function(record, index) { + return { + index: index, + value: record + }; + }, + _unwrap: function(wrappedItem) { + return wrappedItem.value; + }, + _compare: function(x, y) { + const xIndex = x.index; + const yIndex = y.index; + + x = x.value; + y = y.value; + + if(x === y) { + return xIndex - yIndex; + } + + for(let i = 0, rulesCount = this.rules.length; i < rulesCount; i++) { + const rule = this.rules[i]; + const xValue = rule.getter(x); + const yValue = rule.getter(y); + const compare = rule.compare || defaultCompare; + const compareResult = compare(xValue, yValue); + + if(compareResult) { + return rule.desc ? -compareResult : compareResult; + } + } + + return xIndex - yIndex; + } +}); + + +const compileCriteria = (function() { + + const compileGroup = function(crit) { + const ops = []; + + let isConjunctiveOperator = false; + let isConjunctiveNextOperator = false; + + each(crit, function() { + if(Array.isArray(this) || isFunction(this)) { + if(ops.length > 1 && isConjunctiveOperator !== isConjunctiveNextOperator) { + throw new errors.Error('E4019'); + } + + ops.push(compileCriteria(this)); + + isConjunctiveOperator = isConjunctiveNextOperator; + isConjunctiveNextOperator = true; + } else { + isConjunctiveNextOperator = isConjunctiveOperatorChecker(this); + } + }); + + return function(d) { + let result = isConjunctiveOperator; + + for(let i = 0; i < ops.length; i++) { + if(ops[i](d) !== isConjunctiveOperator) { + result = !isConjunctiveOperator; + break; + } + } + + return result; + }; + }; + + const toString = function(value) { + return isDefined(value) ? value.toString() : ''; + }; + + const compileBinary = function(crit) { + crit = normalizeBinaryCriterion(crit); + const getter = compileGetter(crit[0]); + const op = crit[1]; + let value = crit[2]; + + value = toComparable(value); + + switch(op.toLowerCase()) { + case '=': + return compileEquals(getter, value); + case '<>': + return compileEquals(getter, value, true); + case '>': + return function(obj) { return toComparable(getter(obj)) > value; }; + case '<': + return function(obj) { return toComparable(getter(obj)) < value; }; + case '>=': + return function(obj) { return toComparable(getter(obj)) >= value; }; + case '<=': + return function(obj) { return toComparable(getter(obj)) <= value; }; + case 'startswith': + return function(obj) { return toComparable(toString(getter(obj))).indexOf(value) === 0; }; + case 'endswith': + return function(obj) { + const getterValue = toComparable(toString(getter(obj))); + const searchValue = toString(value); + + if(getterValue.length < searchValue.length) { + return false; + } + + const index = getterValue.lastIndexOf(value); + return index !== -1 && index === getterValue.length - value.length; + }; + case 'contains': + return function(obj) { return toComparable(toString(getter(obj))).indexOf(value) > -1; }; + case 'notcontains': + return function(obj) { return toComparable(toString(getter(obj))).indexOf(value) === -1; }; + } + + throw errors.Error('E4003', op); + }; + + function compileEquals(getter, value, negate) { + return function(obj) { + obj = toComparable(getter(obj)); + // eslint-disable-next-line eqeqeq + let result = useStrictComparison(value) ? obj === value : obj == value; + if(negate) { + result = !result; + } + return result; + }; + } + + function useStrictComparison(value) { + return value === '' || value === 0 || value === false; + } + + function compileUnary(crit) { + const op = crit[0]; + const criteria = compileCriteria(crit[1]); + + if(op === '!') { + return function(obj) { return !criteria(obj); }; + } + + throw errors.Error('E4003', op); + } + + return function(crit) { + if(isFunction(crit)) { + return crit; + } + if(isGroupCriterion(crit)) { + return compileGroup(crit); + } + if(isUnaryOperation(crit)) { + return compileUnary(crit); + } + return compileBinary(crit); + }; + +})(); + +const FilterIterator = WrappedIterator.inherit({ + + ctor: function(iter, criteria) { + this.callBase(iter); + this.criteria = compileCriteria(criteria); + }, + + next: function() { + while(this.iter.next()) { + if(this.criteria(this.current())) { + return true; + } + } + return false; + } +}); + +const GroupIterator = Iterator.inherit({ + ctor: function(iter, getter) { + this.iter = iter; + this.getter = getter; + }, + + next: function() { + this._ensureGrouped(); + return this.groupedIter.next(); + }, + + current: function() { + this._ensureGrouped(); + return this.groupedIter.current(); + }, + + reset: function() { + delete this.groupedIter; + }, + + countable: function() { + return !!this.groupedIter; + }, + + count: function() { + return this.groupedIter.count(); + }, + + _ensureGrouped: function() { + if(this.groupedIter) { + return; + } + + const hash = {}; + const keys = []; + const iter = this.iter; + const getter = compileGetter(this.getter); + + iter.reset(); + while(iter.next()) { + const current = iter.current(); + const key = getter(current); + + if(key in hash) { + hash[key].push(current); + } else { + hash[key] = [current]; + keys.push(key); + } + } + + this.groupedIter = new ArrayIterator( + map( + keys, + function(key) { + return { key: key, items: hash[key] }; + } + ) + ); + } + +}); + +const SelectIterator = WrappedIterator.inherit({ + + ctor: function(iter, getter) { + this.callBase(iter); + this.getter = compileGetter(getter); + }, + + current: function() { + return this.getter(this.callBase()); + }, + + countable: function() { + return this.iter.countable(); + }, + + count: function() { + return this.iter.count(); + } + +}); + +const SliceIterator = WrappedIterator.inherit({ + ctor: function(iter, skip, take) { + this.callBase(iter); + this.skip = Math.max(0, skip); + this.take = Math.max(0, take); + this.pos = 0; + }, + + next: function() { + if(this.pos >= this.skip + this.take) { + return false; + } + + while(this.pos < this.skip && this.iter.next()) { + this.pos++; + } + + this.pos++; + return this.iter.next(); + }, + + reset: function() { + this.callBase(); + this.pos = 0; + }, + + countable: function() { + return this.iter.countable(); + }, + + count: function() { + return Math.min(this.iter.count() - this.skip, this.take); + } + +}); + +const arrayQueryImpl = function(iter, queryOptions) { + queryOptions = queryOptions || {}; + + if(!(iter instanceof Iterator)) { + iter = new ArrayIterator(iter); + } + + const handleError = function(error) { + const handler = queryOptions.errorHandler; + if(handler) { + handler(error); + } + + handleDataError(error); + }; + + const aggregateCore = function(aggregator) { + const d = new Deferred().fail(handleError); + let seed; + const step = aggregator.step; + const finalize = aggregator.finalize; + + try { + iter.reset(); + if('seed' in aggregator) { + seed = aggregator.seed; + } else { + seed = iter.next() ? iter.current() : NaN; + } + + let accumulator = seed; + while(iter.next()) { + accumulator = step(accumulator, iter.current()); + } + d.resolve(finalize ? finalize(accumulator) : accumulator); + } catch(x) { + d.reject(x); + } + + return d.promise(); + }; + + const aggregate = function(seed, step, finalize) { + if(arguments.length < 2) { + return aggregateCore({ step: arguments[0] }); + } + return aggregateCore({ + seed: seed, + step: step, + finalize: finalize + }); + }; + + const standardAggregate = function(name) { + return aggregateCore(aggregators[name]); + }; + + const select = function(getter) { + if(!isFunction(getter) && !Array.isArray(getter)) { + getter = [].slice.call(arguments); + } + + return chainQuery(new SelectIterator(iter, getter)); + }; + + const selectProp = function(name) { + return select(compileGetter(name)); + }; + + function chainQuery(iter) { + return arrayQueryImpl(iter, queryOptions); + } + + return { + toArray: function() { + return iter.toArray(); + }, + + enumerate: function() { + const d = new Deferred().fail(handleError); + + try { + d.resolve(iter.toArray()); + } catch(x) { + d.reject(x); + } + + return d.promise(); + }, + + sortBy: function(getter, desc, compare) { + return chainQuery(new SortIterator(iter, getter, desc, compare)); + }, + + thenBy: function(getter, desc, compare) { + if(iter instanceof SortIterator) { + return chainQuery(iter.thenBy(getter, desc, compare)); + } + + throw errors.Error('E4004'); + }, + + filter: function(criteria) { + if(!Array.isArray(criteria)) { + criteria = [].slice.call(arguments); + } + return chainQuery(new FilterIterator(iter, criteria)); + }, + + slice: function(skip, take) { + if(take === undefined) { + take = Number.MAX_VALUE; + } + return chainQuery(new SliceIterator(iter, skip, take)); + }, + + select: select, + + groupBy: function(getter) { + return chainQuery(new GroupIterator(iter, getter)); + }, + + aggregate: aggregate, + + count: function() { + if(iter.countable()) { + const d = new Deferred().fail(handleError); + + try { + d.resolve(iter.count()); + } catch(x) { + d.reject(x); + } + + return d.promise(); + } + + return standardAggregate('count'); + }, + + sum: function(getter) { + if(getter) { + return selectProp(getter).sum(); + } + return standardAggregate('sum'); + }, + + min: function(getter) { + if(getter) { + return selectProp(getter).min(); + } + return standardAggregate('min'); + }, + + max: function(getter) { + if(getter) { + return selectProp(getter).max(); + } + return standardAggregate('max'); + }, + + avg: function(getter) { + if(getter) { + return selectProp(getter).avg(); + } + return standardAggregate('avg'); + } + + }; +}; + +export default arrayQueryImpl; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/array_store.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/array_store.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ebc79affbe51d3a13bc92650ad9494ac05dbb879 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/array_store.d.ts @@ -0,0 +1,49 @@ +import Store, { + Options as StoreOptions, +} from './abstract_store'; +import { Query } from './query'; + +/** @public */ +export type Options< + TItem = any, + TKey = any, +> = ArrayStoreOptions; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface ArrayStoreOptions< + TItem = any, + TKey = any, +> extends StoreOptions { + /** + * @docid + * @public + */ + data?: Array; +} +/** + * @docid + * @inherits Store + * @public + */ +export default class ArrayStore< + TItem = any, + TKey = any, +> extends Store { + constructor(options?: Options) + /** + * @docid + * @publicName clear() + * @public + */ + clear(): void; + /** + * @docid + * @publicName createQuery() + * @return object + * @public + */ + createQuery(): Query; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/array_store.js b/packages/f-theme-editor/farris-theme-editor/js/data/array_store.js new file mode 100644 index 0000000000000000000000000000000000000000..22e78487da61aa58fc645cdbc1205bd844f38d72 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/array_store.js @@ -0,0 +1,68 @@ +import { rejectedPromise, trivialPromise } from './utils'; +import Query from './query'; +import { errors } from './errors'; +import Store from './abstract_store'; +import { indexByKey, insert, applyBatch, update, remove } from './array_utils'; + +const ArrayStore = Store.inherit({ + ctor: function(options) { + if(Array.isArray(options)) { + options = { data: options }; + } else { + options = options || {}; + } + + this.callBase(options); + + const initialArray = options.data; + if(initialArray && !Array.isArray(initialArray)) { + throw errors.Error('E4006'); + } + + this._array = initialArray || []; + }, + + createQuery: function() { + return Query(this._array, { + errorHandler: this._errorHandler + }); + }, + + _byKeyImpl: function(key) { + const index = indexByKey(this, this._array, key); + + if(index === -1) { + return rejectedPromise(errors.Error('E4009')); + } + + return trivialPromise(this._array[index]); + }, + + _insertImpl: function(values) { + return insert(this, this._array, values); + }, + + _pushImpl: function(changes) { + applyBatch({ + keyInfo: this, + data: this._array, + changes + }); + }, + + _updateImpl: function(key, values) { + return update(this, this._array, key, values); + }, + + _removeImpl: function(key) { + return remove(this, this._array, key); + }, + + clear: function() { + this._eventsStrategy.fireEvent('modifying'); + this._array = []; + this._eventsStrategy.fireEvent('modified'); + } +}, 'array'); + +export default ArrayStore; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/array_utils.js b/packages/f-theme-editor/farris-theme-editor/js/data/array_utils.js new file mode 100644 index 0000000000000000000000000000000000000000..565d71ffe076dc11ba77b7b5d40fab9f16b53d6f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/array_utils.js @@ -0,0 +1,254 @@ +import { isPlainObject, isEmptyObject, isDefined, isObject } from '../core/utils/type'; +import config from '../core/config'; +import Guid from '../core/guid'; +import { extend, extendFromObject } from '../core/utils/extend'; +import { errors } from './errors'; +import { deepExtendArraySafe } from '../core/utils/object'; +import { compileGetter } from '../core/utils/data'; +import { keysEqual, rejectedPromise, trivialPromise } from './utils'; + +function hasKey(target, keyOrKeys) { + let key; + const keys = typeof keyOrKeys === 'string' ? keyOrKeys.split() : keyOrKeys.slice(); + + while(keys.length) { + key = keys.shift(); + if(key in target) { + return true; + } + } + + return false; +} + +function findItems(keyInfo, items, key, groupCount) { + let childItems; + let result; + + if(groupCount) { + for(let i = 0; i < items.length; i++) { + childItems = items[i].items || items[i].collapsedItems || []; + result = findItems(keyInfo, childItems || [], key, groupCount - 1); + if(result) { + return result; + } + } + } else if(indexByKey(keyInfo, items, key) >= 0) { + return items; + } +} + +function getItems(keyInfo, items, key, groupCount) { + if(groupCount) { + return findItems(keyInfo, items, key, groupCount) || []; + } + + return items; +} + +function generateDataByKeyMap(keyInfo, array) { + if(keyInfo.key() && (!array._dataByKeyMap || array._dataByKeyMapLength !== array.length)) { + const dataByKeyMap = {}; + const arrayLength = array.length; + for(let i = 0; i < arrayLength; i++) { + dataByKeyMap[JSON.stringify(keyInfo.keyOf(array[i]))] = array[i]; + } + + array._dataByKeyMap = dataByKeyMap; + array._dataByKeyMapLength = arrayLength; + } +} + +function getCacheValue(array, key) { + if(array._dataByKeyMap) { + return array._dataByKeyMap[JSON.stringify(key)]; + } +} + +function getHasKeyCacheValue(array, key) { + if(array._dataByKeyMap) { + return array._dataByKeyMap[JSON.stringify(key)]; + } + + return true; +} + +function setDataByKeyMapValue(array, key, data) { + if(array._dataByKeyMap) { + array._dataByKeyMap[JSON.stringify(key)] = data; + array._dataByKeyMapLength += (data ? 1 : -1); + } +} + +function cloneInstance(instance) { + const result = instance ? Object.create(Object.getPrototypeOf(instance)) : {}; + const instanceWithoutPrototype = extendFromObject({}, instance); + + for(const name in instanceWithoutPrototype) { + const prop = instanceWithoutPrototype[name]; + + if(isObject(prop) && !isPlainObject(prop)) { + instanceWithoutPrototype[name] = cloneInstance(prop); + } + } + + deepExtendArraySafe(result, instanceWithoutPrototype, true, true); + + return result; +} + +function createObjectWithChanges(target, changes) { + const result = cloneInstance(target); + + return deepExtendArraySafe(result, changes, true, true); +} + +function applyBatch({ keyInfo, data, changes, groupCount, useInsertIndex, immutable, disableCache, logError }) { + const resultItems = immutable === true ? [...data] : data; + + changes.forEach(item => { + const items = item.type === 'insert' ? resultItems : getItems(keyInfo, resultItems, item.key, groupCount); + + !disableCache && generateDataByKeyMap(keyInfo, items); + + switch(item.type) { + case 'update': update(keyInfo, items, item.key, item.data, true, immutable, logError); break; + case 'insert': insert(keyInfo, items, item.data, useInsertIndex && isDefined(item.index) ? item.index : -1, true, logError); break; + case 'remove': remove(keyInfo, items, item.key, true, logError); break; + } + }); + return resultItems; +} + +function getErrorResult(isBatch, logError, errorCode) { + return !isBatch ? rejectedPromise(errors.Error(errorCode)) : logError && errors.log(errorCode); +} + +function applyChanges(data, changes, options = {}) { + const { keyExpr = 'id', immutable = true } = options; + const keyGetter = compileGetter(keyExpr); + const keyInfo = { + key: () => keyExpr, + keyOf: (obj) => keyGetter(obj) + }; + + return applyBatch({ + keyInfo, + data, + changes, + immutable, + disableCache: true, + logError: true + }); +} + +function update(keyInfo, array, key, data, isBatch, immutable, logError) { + let target; + const extendComplexObject = true; + const keyExpr = keyInfo.key(); + + if(keyExpr) { + if(hasKey(data, keyExpr) && !keysEqual(keyExpr, key, keyInfo.keyOf(data))) { + return getErrorResult(isBatch, logError, 'E4017'); + } + + target = getCacheValue(array, key); + if(!target) { + const index = indexByKey(keyInfo, array, key); + if(index < 0) { + return getErrorResult(isBatch, logError, 'E4009'); + } + + target = array[index]; + + if(immutable === true && isDefined(target)) { + const newTarget = createObjectWithChanges(target, data); + array[index] = newTarget; + return !isBatch && trivialPromise(newTarget, key); + } + } + } else { + target = key; + } + + deepExtendArraySafe(target, data, extendComplexObject); + if(!isBatch) { + if(config().useLegacyStoreResult) { + return trivialPromise(key, data); + } else { + return trivialPromise(target, key); + } + } +} + +function insert(keyInfo, array, data, index, isBatch, logError) { + let keyValue; + const keyExpr = keyInfo.key(); + + const obj = isPlainObject(data) ? extend({}, data) : data; + + if(keyExpr) { + keyValue = keyInfo.keyOf(obj); + if(keyValue === undefined || typeof keyValue === 'object' && isEmptyObject(keyValue)) { + if(Array.isArray(keyExpr)) { + throw errors.Error('E4007'); + } + keyValue = obj[keyExpr] = String(new Guid()); + } else { + if(array[indexByKey(keyInfo, array, keyValue)] !== undefined) { + return getErrorResult(isBatch, logError, 'E4008'); + } + } + } else { + keyValue = obj; + } + if(index >= 0) { + array.splice(index, 0, obj); + } else { + array.push(obj); + } + + setDataByKeyMapValue(array, keyValue, obj); + + if(!isBatch) { + return trivialPromise(config().useLegacyStoreResult ? data : obj, keyValue); + } +} + +function remove(keyInfo, array, key, isBatch, logError) { + const index = indexByKey(keyInfo, array, key); + if(index > -1) { + array.splice(index, 1); + setDataByKeyMapValue(array, key, null); + } + if(!isBatch) { + return trivialPromise(key); + } else if(index < 0) { + return getErrorResult(isBatch, logError, 'E4009'); + } +} + +function indexByKey(keyInfo, array, key) { + const keyExpr = keyInfo.key(); + + if(!getHasKeyCacheValue(array, key)) { + return -1; + } + + for(let i = 0, arrayLength = array.length; i < arrayLength; i++) { + if(keysEqual(keyExpr, keyInfo.keyOf(array[i]), key)) { + return i; + } + } + return -1; +} + +export { + applyBatch, + createObjectWithChanges, + update, + insert, + remove, + indexByKey, + applyChanges +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..5430725d1ca35ced03f28e9b720a3960f95844d4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.d.ts @@ -0,0 +1,114 @@ +import { FilterDescriptor, GroupDescriptor, LoadOptions } from './index'; +import Store, { Options as StoreOptions } from './abstract_store'; +import { DxPromise } from '../core/utils/deferred'; + +/** @public */ +export type Options< + TItem = any, + TKey = any, +> = CustomStoreOptions; + +/** @public */ +export type GroupItem< + TItem = any, +> = { key: any | string | number; items: Array | Array | null; count?: number; summary?: Array }; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface CustomStoreOptions< + TItem = any, + TKey = any, +> extends StoreOptions { + /** + * @docid + * @type_function_param1 key:object|string|number + * @type_function_return Promise + * @public + */ + byKey?: ((key: TKey) => PromiseLike); + /** + * @docid + * @default true + * @public + */ + cacheRawData?: boolean; + /** + * @docid + * @type_function_param1 values:object + * @type_function_return Promise + * @public + */ + insert?: ((values: TItem) => PromiseLike); + /** + * @docid + * @type_function_param1 options:LoadOptions + * @type_function_return Promise|object>|Array + * @public + */ + load: ((options: LoadOptions) => + | DxPromise< + | Array + | Array + | { + data: Array | Array; + totalCount?: number; + summary?: Array; + groupCount?: number; + }> + | Array + | Array); + /** + * @docid + * @default 'processed' + * @public + */ + loadMode?: 'processed' | 'raw'; + /** + * @docid + * @type_function_param1 key:object|string|number + * @type_function_return Promise + * @public + */ + remove?: ((key: TKey) => PromiseLike); + /** + * @docid + * @type_function_param1_field1 filter:object + * @type_function_param1_field2 group:object + * @type_function_return Promise + * @public + */ + totalCount?: ((loadOptions: { filter?: FilterDescriptor | Array; group?: GroupDescriptor | Array> }) => PromiseLike); + /** + * @docid + * @type_function_param1 key:object|string|number + * @type_function_param2 values:object + * @type_function_return Promise + * @public + */ + update?: ((key: TKey, values: TItem) => PromiseLike); + /** + * @docid + * @default undefined + * @public + */ + useDefaultSearch?: boolean; +} +/** + * @docid + * @inherits Store + * @public + */ +export default class CustomStore< + TItem = any, + TKey = any, +> extends Store { + constructor(options?: Options) + /** + * @docid + * @publicName clearRawDataCache() + * @public + */ + clearRawDataCache(): void; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.js b/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.js new file mode 100644 index 0000000000000000000000000000000000000000..df71fd5e81e79ffb42a2316408c27c6c9ce412d6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/custom_store.js @@ -0,0 +1,382 @@ +import $ from '../core/renderer'; +import { + keysEqual, + XHR_ERROR_UNLOAD, + errorMessageFromXhr as errorMessageFromXhrUtility +} from './utils'; +import { applyBatch } from './array_utils'; +import { isFunction } from '../core/utils/type'; +import config from '../core/config'; +import { errors } from './errors'; +import Store from './abstract_store'; +import arrayQuery from './array_query'; +import storeHelper from './store_helper'; +import { Deferred, when, fromPromise } from '../core/utils/deferred'; + +const TOTAL_COUNT = 'totalCount'; +const LOAD = 'load'; +const BY_KEY = 'byKey'; +const INSERT = 'insert'; +const UPDATE = 'update'; +const REMOVE = 'remove'; + +function isPromise(obj) { + return obj && isFunction(obj.then); +} + +function trivialPromise(value) { + return new Deferred().resolve(value).promise(); +} + +function ensureRequiredFuncOption(name, obj) { + if(!isFunction(obj)) { + throw errors.Error('E4011', name); + } +} + +function throwInvalidUserFuncResult(name) { + throw errors.Error('E4012', name); +} + +function createUserFuncFailureHandler(pendingDeferred) { + function errorMessageFromXhr(promiseArguments) { + const xhr = promiseArguments[0]; + const textStatus = promiseArguments[1]; + + if(!xhr || !xhr.getResponseHeader) { + return null; + } + + return errorMessageFromXhrUtility(xhr, textStatus); + } + + return function(arg) { + let error; + + if(arg instanceof Error) { + error = arg; + } else { + error = new Error(errorMessageFromXhr(arguments) || arg && String(arg) || 'Unknown error'); + } + + if(error.message !== XHR_ERROR_UNLOAD) { + pendingDeferred.reject(error); + } + }; +} + +function invokeUserLoad(store, options) { + const userFunc = store._loadFunc; + let userResult; + + ensureRequiredFuncOption(LOAD, userFunc); + userResult = userFunc.apply(store, [options]); + + if(Array.isArray(userResult)) { + userResult = trivialPromise(userResult); + } else if(userResult === null || userResult === undefined) { + userResult = trivialPromise([]); + } else { + if(!isPromise(userResult)) { + throwInvalidUserFuncResult(LOAD); + } + } + + return fromPromise(userResult); +} + +function invokeUserTotalCountFunc(store, options) { + const userFunc = store._totalCountFunc; + let userResult; + + if(!isFunction(userFunc)) { + throw errors.Error('E4021'); + } + + userResult = userFunc.apply(store, [options]); + + if(!isPromise(userResult)) { + userResult = Number(userResult); + if(!isFinite(userResult)) { + throwInvalidUserFuncResult(TOTAL_COUNT); + } + userResult = trivialPromise(userResult); + } + + return fromPromise(userResult); +} + +function invokeUserByKeyFunc(store, key, extraOptions) { + const userFunc = store._byKeyFunc; + let userResult; + + ensureRequiredFuncOption(BY_KEY, userFunc); + userResult = userFunc.apply(store, [key, extraOptions]); + + if(!isPromise(userResult)) { + userResult = trivialPromise(userResult); + } + + return fromPromise(userResult); +} + +function runRawLoad(pendingDeferred, store, userFuncOptions, continuation) { + if(store.__rawData) { + continuation(store.__rawData); + } else { + const loadPromise = store.__rawDataPromise || invokeUserLoad(store, userFuncOptions); + + if(store._cacheRawData) { + store.__rawDataPromise = loadPromise; + } + + loadPromise + .always(function() { + delete store.__rawDataPromise; + }) + .done(function(rawData) { + if(store._cacheRawData) { + store.__rawData = rawData; + } + continuation(rawData); + }) + .fail(createUserFuncFailureHandler(pendingDeferred)); + } +} + +function runRawLoadWithQuery(pendingDeferred, store, options, countOnly) { + options = options || { }; + + const userFuncOptions = { }; + if('userData' in options) { + userFuncOptions.userData = options.userData; + } + + runRawLoad(pendingDeferred, store, userFuncOptions, function(rawData) { + const rawDataQuery = arrayQuery(rawData, { errorHandler: store._errorHandler }); + let itemsQuery; + let totalCountQuery; + const waitList = []; + + let items; + let totalCount; + + if(!countOnly) { + itemsQuery = storeHelper.queryByOptions(rawDataQuery, options); + if(itemsQuery === rawDataQuery) { + items = rawData.slice(0); + } else { + waitList.push(itemsQuery.enumerate().done(function(asyncResult) { + items = asyncResult; + })); + } + } + + if(options.requireTotalCount || countOnly) { + totalCountQuery = storeHelper.queryByOptions(rawDataQuery, options, true); + if(totalCountQuery === rawDataQuery) { + totalCount = rawData.length; + } else { + waitList.push(totalCountQuery.count().done(function(asyncResult) { + totalCount = asyncResult; + })); + } + } + + when.apply($, waitList) + .done(function() { + if(countOnly) { + pendingDeferred.resolve(totalCount); + } else if(options.requireTotalCount) { + pendingDeferred.resolve(items, { totalCount: totalCount }); + } else { + pendingDeferred.resolve(items); + } + }) + .fail(function(x) { + pendingDeferred.reject(x); + }); + }); +} + +function runRawLoadWithKey(pendingDeferred, store, key) { + runRawLoad(pendingDeferred, store, {}, function(rawData) { + const keyExpr = store.key(); + let item; + + for(let i = 0, len = rawData.length; i < len; i++) { + item = rawData[i]; + if(keysEqual(keyExpr, store.keyOf(rawData[i]), key)) { + pendingDeferred.resolve(item); + return; + } + } + + pendingDeferred.reject(errors.Error('E4009')); + }); +} + +const CustomStore = Store.inherit({ + ctor: function(options) { + options = options || {}; + + this.callBase(options); + + this._useDefaultSearch = !!options.useDefaultSearch || options.loadMode === 'raw'; + + this._loadMode = options.loadMode; + + this._cacheRawData = options.cacheRawData !== false; + + this._loadFunc = options[LOAD]; + + this._totalCountFunc = options[TOTAL_COUNT]; + + this._byKeyFunc = options[BY_KEY]; + + this._insertFunc = options[INSERT]; + + this._updateFunc = options[UPDATE]; + + this._removeFunc = options[REMOVE]; + }, + + createQuery: function() { + throw errors.Error('E4010'); + }, + + clearRawDataCache: function() { + delete this.__rawData; + }, + + _totalCountImpl: function(options) { + let d = new Deferred(); + + if(this._loadMode === 'raw' && !this._totalCountFunc) { + runRawLoadWithQuery(d, this, options, true); + } else { + invokeUserTotalCountFunc(this, options) + .done(function(count) { d.resolve(Number(count)); }) + .fail(createUserFuncFailureHandler(d)); + d = this._addFailHandlers(d); + } + + return d.promise(); + }, + + _pushImpl: function(changes) { + if(this.__rawData) { + applyBatch({ + keyInfo: this, + data: this.__rawData, + changes + }); + } + }, + + _loadImpl: function(options) { + let d = new Deferred(); + + if(this._loadMode === 'raw') { + runRawLoadWithQuery(d, this, options, false); + } else { + invokeUserLoad(this, options) + .done(function(data, extra) { d.resolve(data, extra); }) + .fail(createUserFuncFailureHandler(d)); + d = this._addFailHandlers(d); + } + + return d.promise(); + }, + + _byKeyImpl: function(key, extraOptions) { + const d = new Deferred(); + + if(this._byKeyViaLoad()) { + this._requireKey(); + runRawLoadWithKey(d, this, key); + } else { + invokeUserByKeyFunc(this, key, extraOptions) + .done(function(obj) { d.resolve(obj); }) + .fail(createUserFuncFailureHandler(d)); + } + + return d.promise(); + }, + + _byKeyViaLoad: function() { + return this._loadMode === 'raw' && !this._byKeyFunc; + }, + + _insertImpl: function(values) { + const that = this; + const userFunc = that._insertFunc; + let userResult; + const d = new Deferred(); + + ensureRequiredFuncOption(INSERT, userFunc); + userResult = userFunc.apply(that, [values]); // should return key or data + + if(!isPromise(userResult)) { + userResult = trivialPromise(userResult); + } + + fromPromise(userResult) + .done(function(serverResponse) { + if(config().useLegacyStoreResult) { + d.resolve(values, serverResponse); + } else { + d.resolve(serverResponse || values, that.keyOf(serverResponse)); + } + }) + .fail(createUserFuncFailureHandler(d)); + + return d.promise(); + }, + + _updateImpl: function(key, values) { + const userFunc = this._updateFunc; + let userResult; + const d = new Deferred(); + + ensureRequiredFuncOption(UPDATE, userFunc); + userResult = userFunc.apply(this, [key, values]); + + if(!isPromise(userResult)) { + userResult = trivialPromise(userResult); + } + + fromPromise(userResult) + .done(function(serverResponse) { + if(config().useLegacyStoreResult) { + d.resolve(key, values); + } else { + d.resolve(serverResponse || values, key); + } + }) + .fail(createUserFuncFailureHandler(d)); + + return d.promise(); + }, + + _removeImpl: function(key) { + const userFunc = this._removeFunc; + let userResult; + const d = new Deferred(); + + ensureRequiredFuncOption(REMOVE, userFunc); + userResult = userFunc.apply(this, [key]); + + if(!isPromise(userResult)) { + userResult = trivialPromise(); + } + + fromPromise(userResult) + .done(function() { d.resolve(key); }) + .fail(createUserFuncFailureHandler(d)); + + return d.promise(); + } +}); + +export default CustomStore; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/data_source.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/data_source.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6192cdad6605303ddd65942daba528dbb3511f2f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/data_source.d.ts @@ -0,0 +1,471 @@ +import { + FilterDescriptor, GroupDescriptor, SelectDescriptor, SortDescriptor, LoadOptions, SearchOperation, +} from './index'; +import { DxPromise } from '../core/utils/deferred'; +import Store from './abstract_store'; +import { Options as CustomStoreOptions } from './custom_store'; +import { Options as ArrayStoreOptions } from './array_store'; +import { Options as LocalStoreOptions } from './local_store'; +import { Options as ODataStoreOptions } from './odata/store'; + +/** @public */ +export type Options< + TStoreItem = any, + TMappedItem = TStoreItem, + TItem = TMappedItem, + TKey = any, +> = DataSourceOptions; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface DataSourceOptions< + TStoreItem = any, + TMappedItem = TStoreItem, + TItem = TMappedItem, + TKey = any, +> { + /** + * @docid + * @public + */ + customQueryParams?: any; + /** + * @docid + * @public + */ + expand?: Array | string; + /** + * @docid + * @type Filter expression + * @public + */ + filter?: FilterDescriptor | Array; + /** + * @docid + * @type Group expression + * @public + */ + group?: GroupDescriptor | Array>; + /** + * @docid + * @type_function_param1 dataItem:object + * @type_function_return object + * @public + */ + map?: ((dataItem: TStoreItem) => TMappedItem); + /** + * @docid + * @type_function_param1 e:Object + * @type_function_param1_field1 changes:Array + * @action + * @public + */ + onChanged?: ((e: { readonly changes?: Array }) => void); + /** + * @docid + * @type_function_param1 error:Object + * @action + * @public + */ + onLoadError?: ((error: { readonly message?: string }) => void); + /** + * @docid + * @action + * @public + */ + onLoadingChanged?: ((isLoading: boolean) => void); + /** + * @docid + * @default 20 + * @public + */ + pageSize?: number; + /** + * @docid + * @default undefined + * @public + */ + paginate?: boolean; + /** + * @docid + * @type_function_param1 data:Array + * @type_function_return Array + * @public + */ + postProcess?: ((data: Array) => Array); + /** + * @docid + * @default undefined + * @public + */ + pushAggregationTimeout?: number; + /** + * @docid + * @public + */ + requireTotalCount?: boolean; + /** + * @docid + * @default false + * @public + */ + reshapeOnPush?: boolean; + /** + * @docid + * @type getter|Array + * @public + */ + searchExpr?: string | Function | Array; + /** + * @docid + * @default "contains" + * @public + */ + searchOperation?: SearchOperation; + /** + * @docid + * @default null + * @public + */ + searchValue?: any; + /** + * @docid + * @type Select expression + * @public + */ + select?: SelectDescriptor; + /** + * @docid + * @type Sort expression + * @public + */ + sort?: SortDescriptor | Array>; + /** + * @docid + * @public + * @type Store|StoreOptions|Array + */ + store?: Array | + Store | + ArrayStoreOptions & { type: 'array' } | + LocalStoreOptions & { type: 'local' } | + ODataStoreOptions & { type: 'odata' } | + CustomStoreOptions; +} +/** + * @docid + * @public + */ +export default class DataSource< + TItem = any, + TKey = any, +> { + constructor(data: Array); + constructor(options: CustomStoreOptions | Options); + constructor(store: Store); + constructor(url: string); + /** + * @docid + * @publicName cancel(operationId) + * @public + */ + cancel(operationId: number): boolean; + /** + * @docid + * @publicName dispose() + * @public + */ + dispose(): void; + /** + * @docid + * @publicName filter() + * @return object + * @public + */ + filter(): FilterDescriptor | Array; + /** + * @docid + * @publicName filter(filterExpr) + * @param1 filterExpr:object + * @public + */ + filter(filterExpr: FilterDescriptor | Array): void; + /** + * @docid + * @publicName group() + * @return object + * @public + */ + group(): GroupDescriptor | Array>; + /** + * @docid + * @publicName group(groupExpr) + * @param1 groupExpr:object + * @public + */ + group(groupExpr: GroupDescriptor | Array>): void; + /** + * @docid + * @publicName isLastPage() + * @public + */ + isLastPage(): boolean; + /** + * @docid + * @publicName isLoaded() + * @public + */ + isLoaded(): boolean; + /** + * @docid + * @publicName isLoading() + * @public + */ + isLoading(): boolean; + /** + * @docid + * @publicName items() + * @public + */ + items(): Array; + /** + * @docid + * @publicName key() + * @public + */ + key(): string | Array; + /** + * @docid + * @publicName load() + * @return Promise + * @public + */ + load(): DxPromise; + /** + * @docid + * @publicName loadOptions() + * @return object + * @public + */ + loadOptions(): LoadOptions; + /** + * @docid + * @publicName off(eventName) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName): this; + /** + * @docid + * @publicName off(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + off(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(eventName, eventHandler) + * @param1 eventName:string + * @return this + * @public + */ + on(eventName: EventName, eventHandler: Function): this; + /** + * @docid + * @publicName on(events) + * @param1 events:object + * @return this + * @public + */ + on(events: { [key in EventName]?: Function }): this; + /** + * @docid + * @publicName pageIndex() + * @return numeric + * @public + */ + pageIndex(): number; + /** + * @docid + * @publicName pageIndex(newIndex) + * @param1 newIndex:numeric + * @public + */ + pageIndex(newIndex: number): void; + /** + * @docid + * @publicName pageSize() + * @return numeric + * @public + */ + pageSize(): number; + /** + * @docid + * @publicName pageSize(value) + * @param1 value:numeric + * @public + */ + pageSize(value: number): void; + /** + * @docid + * @publicName paginate() + * @return Boolean + * @public + */ + paginate(): boolean; + /** + * @docid + * @publicName paginate(value) + * @param1 value:Boolean + * @public + */ + paginate(value: boolean): void; + /** + * @docid + * @publicName reload() + * @return Promise + * @public + */ + reload(): DxPromise; + /** + * @docid + * @publicName requireTotalCount() + * @public + */ + requireTotalCount(): boolean; + /** + * @docid + * @publicName requireTotalCount(value) + * @public + */ + requireTotalCount(value: boolean): void; + /** + * @docid + * @publicName searchExpr() + * @return getter|Array + * @public + */ + searchExpr(): string & Function & Array; + /** + * @docid + * @publicName searchExpr(expr) + * @param1 expr:getter|Array + * @public + */ + searchExpr(expr: string | Function | Array): void; + /** + * @docid + * @publicName searchOperation() + * @public + */ + searchOperation(): string; + /** + * @docid + * @publicName searchOperation(op) + * @public + */ + searchOperation(op: string): void; + /** + * @docid + * @publicName searchValue() + * @public + */ + searchValue(): any; + /** + * @docid + * @publicName searchValue(value) + * @public + */ + searchValue(value: any): void; + /** + * @docid + * @publicName select() + * @return any + * @public + */ + select(): SelectDescriptor; + /** + * @docid + * @publicName select(expr) + * @param1 expr:any + * @public + */ + select(expr: SelectDescriptor): void; + /** + * @docid + * @publicName sort() + * @return any + * @public + */ + sort(): SortDescriptor | Array>; + /** + * @docid + * @publicName sort(sortExpr) + * @param1 sortExpr:any + * @public + */ + sort(sortExpr: SortDescriptor | Array>): void; + /** + * @docid + * @publicName store() + * @return object + * @public + */ + store(): Store; + /** + * @docid + * @publicName totalCount() + * @return numeric + * @public + */ + totalCount(): number; +} + +/** + * @docid + * @type Store|DataSource|DataSourceOptions|string|Array + * */ +export type DataSourceLike = + string | + Array | + Store | + DataSourceOptionsStub | + DataSource; + + interface DataSourceOptionsStub< + TStoreItem = any, + TMappedItem = TStoreItem, + TItem = TMappedItem, +> { + customQueryParams?: any; + expand?: Array | string; + filter?: FilterDescriptor | Array; + group?: GroupDescriptor | Array>; + map?: ((dataItem: TStoreItem) => TMappedItem); + onChanged?: ((e: { readonly changes?: Array }) => void); + onLoadError?: ((error: { readonly message?: string }) => void); + onLoadingChanged?: ((isLoading: boolean) => void); + pageSize?: number; + paginate?: boolean; + postProcess?: ((data: Array) => Array); + pushAggregationTimeout?: number; + requireTotalCount?: boolean; + reshapeOnPush?: boolean; + searchExpr?: string | Function | Array; + searchOperation?: SearchOperation; + searchValue?: any; + select?: SelectDescriptor; + sort?: SortDescriptor | Array>; + store?: Array | + Store | + ArrayStoreOptions & { type: 'array' } | + LocalStoreOptions & { type: 'local' } | + ODataStoreOptions & { type: 'odata' } | + CustomStoreOptions; +} + +type EventName = 'changed' | 'loadError' | 'loadingChanged'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/data_source.js b/packages/f-theme-editor/farris-theme-editor/js/data/data_source.js new file mode 100644 index 0000000000000000000000000000000000000000..fcf080056c7a7bb965847215331538d0ba434496 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/data_source.js @@ -0,0 +1,3 @@ + +import { DataSource } from './data_source/data_source'; +export default DataSource; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/data_source/data_source.js b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/data_source.js new file mode 100644 index 0000000000000000000000000000000000000000..15638e51330a74ad8b078db4169d4ab442b26353 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/data_source.js @@ -0,0 +1,685 @@ +import Class from '../../core/class'; +import { extend } from '../../core/utils/extend'; +import { executeAsync } from '../../core/utils/common'; +import { each } from '../../core/utils/iterator'; +import { isString, isNumeric, isBoolean, isDefined, isPlainObject } from '../../core/utils/type'; +import { throttleChanges } from '../utils'; +import { applyBatch } from '../array_utils'; +import CustomStore from '../custom_store'; +import { EventsStrategy } from '../../core/events_strategy'; +import { errors } from '../errors'; +import { isEmpty } from '../../core/utils/array'; +import { create } from '../../core/utils/queue'; +import { Deferred, when } from '../../core/utils/deferred'; +import OperationManager from './operation_manager'; +import { + normalizeDataSourceOptions, + normalizeStoreLoadOptionAccessorArguments, + CANCELED_TOKEN, + isPending, + normalizeLoadResult, + mapDataRespectingGrouping +} from './utils'; + +export const DataSource = Class.inherit({ + /** + * @name DataSource.ctor + * @publicName ctor(url) + * @param1 url:string + * @hidden + */ + /** + * @name DataSource.ctor + * @publicName ctor(data) + * @param1 data:Array + * @hidden + */ + /** + * @name DataSource.ctor + * @publicName ctor(store) + * @param1 store:Store + * @hidden + */ + /** + * @name DataSource.ctor + * @publicName ctor(options) + * @param1 options:CustomStoreOptions|DataSourceOptions + * @hidden + */ + ctor(options) { + options = normalizeDataSourceOptions(options); + this._eventsStrategy = new EventsStrategy(this, { + syncStrategy: true + }); + + /** + * @name DataSourceOptions.store.type + * @type Enums.DataSourceStoreType + */ + + this._store = options.store; + this._changedTime = 0; + + const needThrottling = options.pushAggregationTimeout !== 0; + + if(needThrottling) { + const throttlingTimeout = options.pushAggregationTimeout === undefined + ? () => this._changedTime * 5 + : options.pushAggregationTimeout; + + let pushDeferred; + let lastPushWaiters; + + const throttlingPushHandler = throttleChanges((changes) => { + pushDeferred.resolve(); + const storePushPending = when(...lastPushWaiters); + storePushPending.done(() => this._onPush(changes)); + + lastPushWaiters = undefined; + pushDeferred = undefined; + }, throttlingTimeout); + + this._onPushHandler = (args) => { + this._aggregationTimeoutId = throttlingPushHandler(args.changes); + + if(!pushDeferred) { + pushDeferred = new Deferred(); + } + + lastPushWaiters = args.waitFor; + args.waitFor.push(pushDeferred.promise()); + }; + this._store.on('beforePush', this._onPushHandler); + } else { + this._onPushHandler = (changes) => this._onPush(changes); + this._store.on('push', this._onPushHandler); + } + + this._storeLoadOptions = this._extractLoadOptions(options); + + this._mapFunc = options.map; + + this._postProcessFunc = options.postProcess; + + this._pageIndex = (options.pageIndex !== undefined) ? options.pageIndex : 0; + + this._pageSize = (options.pageSize !== undefined) ? options.pageSize : 20; + + this._loadingCount = 0; + this._loadQueue = this._createLoadQueue(); + + this._searchValue = ('searchValue' in options) ? options.searchValue : null; + + this._searchOperation = options.searchOperation || 'contains'; + + this._searchExpr = options.searchExpr; + + this._paginate = options.paginate; + + this._reshapeOnPush = options.reshapeOnPush ?? false; + + each( + [ + 'onChanged', + + 'onLoadError', + + 'onLoadingChanged', + + 'onCustomizeLoadResult', + 'onCustomizeStoreLoadOptions' + ], + (_, optionName) => { + if(optionName in options) { + this.on(optionName.substr(2, 1).toLowerCase() + optionName.substr(3), options[optionName]); + } + }); + + this._operationManager = new OperationManager(); + this._init(); + }, + + _init() { + this._items = []; + this._userData = {}; + this._totalCount = -1; + this._isLoaded = false; + + if(!isDefined(this._paginate)) { + this._paginate = !this.group(); + } + + this._isLastPage = !this._paginate; + }, + + dispose() { + this._store.off('beforePush', this._onPushHandler); + this._store.off('push', this._onPushHandler); + this._eventsStrategy.dispose(); + clearTimeout(this._aggregationTimeoutId); + + delete this._store; + + this._delayedLoadTask?.abort(); + + this._operationManager.cancelAll(); + + this._disposed = true; + }, + + _extractLoadOptions(options) { + const result = {}; + let names = ['sort', 'filter', 'select', 'group', 'requireTotalCount']; + const customNames = this._store._customLoadOptions(); + + if(customNames) { + names = names.concat(customNames); + } + + each(names, function() { + result[this] = options[this]; + }); + return result; + }, + + loadOptions() { + return this._storeLoadOptions; + }, + + items() { + return this._items; + }, + + pageIndex(newIndex) { + if(!isNumeric(newIndex)) { + return this._pageIndex; + } + + this._pageIndex = newIndex; + this._isLastPage = !this._paginate; + }, + + paginate(value) { + if(!isBoolean(value)) { + return this._paginate; + } + + if(this._paginate !== value) { + this._paginate = value; + this.pageIndex(0); + } + }, + + pageSize(value) { + if(!isNumeric(value)) { + return this._pageSize; + } + + this._pageSize = value; + }, + + isLastPage() { + return this._isLastPage; + }, + + generateStoreLoadOptionAccessor(optionName) { + return (args) => { + const normalizedArgs = normalizeStoreLoadOptionAccessorArguments(args); + if(normalizedArgs === undefined) { + return this._storeLoadOptions[optionName]; + } + + this._storeLoadOptions[optionName] = normalizedArgs; + }; + }, + + sort(...args) { + return this.generateStoreLoadOptionAccessor('sort')(args); + }, + + filter() { + const newFilter = normalizeStoreLoadOptionAccessorArguments(arguments); + if(newFilter === undefined) { + return this._storeLoadOptions.filter; + } + + this._storeLoadOptions.filter = newFilter; + this.pageIndex(0); + }, + + group(...args) { + return this.generateStoreLoadOptionAccessor('group')(args); + }, + + select(...args) { + return this.generateStoreLoadOptionAccessor('select')(args); + }, + + requireTotalCount(value) { + if(!isBoolean(value)) { + return this._storeLoadOptions.requireTotalCount; + } + + this._storeLoadOptions.requireTotalCount = value; + }, + + searchValue(value) { + if(arguments.length < 1) { + return this._searchValue; + } + + this._searchValue = value; + this.pageIndex(0); + }, + + searchOperation(op) { + if(!isString(op)) { + return this._searchOperation; + } + + this._searchOperation = op; + this.pageIndex(0); + }, + + searchExpr(expr) { + const argc = arguments.length; + + if(argc === 0) { + return this._searchExpr; + } + + if(argc > 1) { + expr = [].slice.call(arguments); + } + + this._searchExpr = expr; + this.pageIndex(0); + }, + + store() { + return this._store; + }, + + key() { + return this._store?.key(); + }, + + totalCount() { + return this._totalCount; + }, + + isLoaded() { + return this._isLoaded; + }, + + isLoading() { + return this._loadingCount > 0; + }, + + beginLoading() { + this._changeLoadingCount(1); + }, + + endLoading() { + this._changeLoadingCount(-1); + }, + + _createLoadQueue() { + return create(); + }, + + _changeLoadingCount(increment) { + const oldLoading = this.isLoading(); + + this._loadingCount += increment; + const newLoading = this.isLoading(); + + if(oldLoading ^ newLoading) { + this._eventsStrategy.fireEvent('loadingChanged', [newLoading]); + } + }, + + _scheduleLoadCallbacks(deferred) { + this.beginLoading(); + + deferred.always(() => { + this.endLoading(); + }); + }, + + _scheduleFailCallbacks(deferred) { + deferred.fail((...args) => { + if(args[0] === CANCELED_TOKEN) { + return; + } + + this._eventsStrategy.fireEvent('loadError', args); + }); + }, + + _fireChanged(args) { + const date = new Date(); + this._eventsStrategy.fireEvent('changed', args); + this._changedTime = new Date() - date; + }, + + _scheduleChangedCallbacks(deferred) { + deferred.done(() => this._fireChanged()); + }, + + loadSingle(propName, propValue) { + const d = new Deferred(); + const key = this.key(); + const store = this._store; + const options = this._createStoreLoadOptions(); + const handleDone = (data) => { + if(!isDefined(data) || isEmpty(data)) { + d.reject(new errors.Error('E4009')); + } else { + if(!Array.isArray(data)) { + data = [data]; + } + d.resolve(this._applyMapFunction(data)[0]); + } + }; + + this._scheduleFailCallbacks(d); + + if(arguments.length < 2) { + propValue = propName; + propName = key; + } + + delete options.skip; + delete options.group; + delete options.refresh; + delete options.pageIndex; + delete options.searchString; + + const shouldForceByKey = () => (store instanceof CustomStore) && !store._byKeyViaLoad(); + + (() => { + + // NOTE for CustomStore always using byKey for backward compatibility with "old user datasource" + if(propName === key || shouldForceByKey()) { + return store.byKey(propValue, options); + } + + options.take = 1; + options.filter = options.filter + ? [options.filter, [propName, propValue]] + : [propName, propValue]; + + return store.load(options); + + })().fail(d.reject).done(handleDone); + + return d.promise(); + }, + + load() { + const d = new Deferred(); + + const loadTask = () => { + if(this._disposed) { + return undefined; + } + + if(!isPending(d)) { + return; + } + + return this._loadFromStore(loadOperation, d); + }; + + this._scheduleLoadCallbacks(d); + this._scheduleFailCallbacks(d); + this._scheduleChangedCallbacks(d); + + const loadOperation = this._createLoadOperation(d); + + this._eventsStrategy.fireEvent('customizeStoreLoadOptions', [loadOperation]); + + this._loadQueue.add(() => { + if(typeof loadOperation.delay === 'number') { + this._delayedLoadTask = executeAsync(loadTask, loadOperation.delay); + } else { + loadTask(); + } + return d.promise(); + }); + + return d.promise({ + operationId: loadOperation.operationId + }); + }, + + _onPush(changes) { + if(this._reshapeOnPush) { + this.load(); + } else { + this._eventsStrategy.fireEvent('changing', [{ changes }]); + + const group = this.group(); + const items = this.items(); + let groupLevel = 0; + const dataSourceChanges = this.paginate() || group ? changes.filter(item => item.type === 'update') : changes; + + if(group) { + groupLevel = Array.isArray(group) ? group.length : 1; + } + + if(this._mapFunc) { + dataSourceChanges.forEach((item) => { + if(item.type === 'insert') { + item.data = this._mapFunc(item.data); + } + }); + } + + applyBatch({ + keyInfo: this.store(), + data: items, + changes: dataSourceChanges, + groupCount: groupLevel, + useInsertIndex: true + }); + this._fireChanged([{ changes: changes }]); + } + }, + + _createLoadOperation(deferred) { + const operationId = this._operationManager.add(deferred); + const storeLoadOptions = this._createStoreLoadOptions(); + + deferred.always(() => this._operationManager.remove(operationId)); + + return { + operationId, + storeLoadOptions + }; + }, + + reload() { + const store = this.store(); + if(store instanceof CustomStore) { + store.clearRawDataCache(); + } + + this._init(); + return this.load(); + }, + + cancel(operationId) { + return this._operationManager.cancel(operationId); + }, + + cancelAll() { + return this._operationManager.cancelAll(); + }, + + _addSearchOptions(storeLoadOptions) { + if(this._disposed) { + return; + } + + if(this.store()._useDefaultSearch) { + this._addSearchFilter(storeLoadOptions); + } else { + storeLoadOptions.searchOperation = this._searchOperation; + storeLoadOptions.searchValue = this._searchValue; + storeLoadOptions.searchExpr = this._searchExpr; + } + }, + + _createStoreLoadOptions() { + const result = extend({}, this._storeLoadOptions); + this._addSearchOptions(result); + + if(this._paginate) { + if(this._pageSize) { + result.skip = this._pageIndex * this._pageSize; + result.take = this._pageSize; + } + } + + result.userData = this._userData; + + return result; + }, + + _addSearchFilter(storeLoadOptions) { + const value = this._searchValue; + const op = this._searchOperation; + let selector = this._searchExpr; + const searchFilter = []; + + if(!value) { + return; + } + + if(!selector) { + selector = 'this'; + } + + if(!Array.isArray(selector)) { + selector = [selector]; + } + + // TODO optimize for byKey case + + each(selector, function(i, item) { + if(searchFilter.length) { + searchFilter.push('or'); + } + + searchFilter.push([item, op, value]); + }); + + if(storeLoadOptions.filter) { + storeLoadOptions.filter = [searchFilter, storeLoadOptions.filter]; + } else { + storeLoadOptions.filter = searchFilter; + } + }, + + _loadFromStore(loadOptions, pendingDeferred) { + const handleSuccess = (data, extra) => { + if(this._disposed) { + return; + } + + if(!isPending(pendingDeferred)) { + return; + } + + // Process result + const loadResult = extend(normalizeLoadResult(data, extra), loadOptions); + + this._eventsStrategy.fireEvent('customizeLoadResult', [loadResult]); + when(loadResult.data).done((data) => { + loadResult.data = data; + this._processStoreLoadResult(loadResult, pendingDeferred); + }).fail(pendingDeferred.reject); + }; + + if(loadOptions.data) { + return new Deferred().resolve(loadOptions.data).done(handleSuccess); + } + + return this.store().load(loadOptions.storeLoadOptions) + .done(handleSuccess) + .fail(pendingDeferred.reject); + }, + + _processStoreLoadResult(loadResult, pendingDeferred) { + let data = loadResult.data; + let extra = loadResult.extra; + const storeLoadOptions = loadResult.storeLoadOptions; + + const resolvePendingDeferred = () => { + this._isLoaded = true; + this._totalCount = isFinite(extra.totalCount) ? extra.totalCount : -1; + return pendingDeferred.resolve(data, extra); + }; + + const proceedLoadingTotalCount = () => { + this.store().totalCount(storeLoadOptions) + .done(function(count) { + extra.totalCount = count; + resolvePendingDeferred(); + }) + .fail(pendingDeferred.reject); + }; + + if(this._disposed) { + return; + } + + // todo: if operation is canceled there is no need to do data transformation + + data = this._applyPostProcessFunction(this._applyMapFunction(data)); + + if(!isPlainObject(extra)) { + extra = {}; + } + + this._items = data; + + if(!data.length || !this._paginate || (this._pageSize && (data.length < this._pageSize))) { + this._isLastPage = true; + } + + if(storeLoadOptions.requireTotalCount && !isFinite(extra.totalCount)) { + proceedLoadingTotalCount(); + } else { + resolvePendingDeferred(); + } + }, + + _applyMapFunction(data) { + if(this._mapFunc) { + return mapDataRespectingGrouping(data, this._mapFunc, this.group()); + } + + return data; + }, + + _applyPostProcessFunction(data) { + if(this._postProcessFunc) { + return this._postProcessFunc(data); + } + + return data; + }, + + on(eventName, eventHandler) { + this._eventsStrategy.on(eventName, eventHandler); + return this; + }, + + off(eventName, eventHandler) { + this._eventsStrategy.off(eventName, eventHandler); + return this; + }, +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/data_source/operation_manager.js b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/operation_manager.js new file mode 100644 index 0000000000000000000000000000000000000000..210055ffb5a6653fd175ae753e3d435c57db8ca4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/operation_manager.js @@ -0,0 +1,34 @@ +import { CANCELED_TOKEN } from './utils'; + +export default class OperationManager { + constructor() { + this._counter = -1; + this._deferreds = {}; + } + + add(deferred) { + this._counter++; + this._deferreds[this._counter] = deferred; + return this._counter; + } + + remove(operationId) { + return delete this._deferreds[operationId]; + } + + cancel(operationId) { + if(operationId in this._deferreds) { + this._deferreds[operationId].reject(CANCELED_TOKEN); + return true; + } + + return false; + } + + cancelAll() { + while(this._counter > -1) { + this.cancel(this._counter); + this._counter--; + } + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/data_source/utils.js b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..15420c8a90061d061edeb3444cbb0e025663f1ef --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/data_source/utils.js @@ -0,0 +1,121 @@ +import ajaxUtils from '../../core/utils/ajax'; +import Store from '../abstract_store'; +import ArrayStore from '../array_store'; +import { each, map } from '../../core/utils/iterator'; +import CustomStore from '../custom_store'; +import { extend } from '../../core/utils/extend'; +import { isPlainObject } from '../../core/utils/type'; +import { normalizeSortingInfo } from '../utils'; + +export const CANCELED_TOKEN = 'canceled'; + +export const isPending = deferred => deferred.state() === 'pending'; + +export const normalizeStoreLoadOptionAccessorArguments = (originalArguments) => { + switch(originalArguments.length) { + case 0: + return undefined; + case 1: + return originalArguments[0]; + } + return [].slice.call(originalArguments); +}; + +const mapGroup = (group, level, mapper) => map(group, item => { + const { items, ...restItem } = item; + return { + ...restItem, + items: mapRecursive(item.items, level - 1, mapper) + }; +}); + +const mapRecursive = (items, level, mapper) => { + if(!Array.isArray(items)) return items; + return level ? mapGroup(items, level, mapper) : map(items, mapper); +}; + +export const mapDataRespectingGrouping = (items, mapper, groupInfo) => { + const level = groupInfo ? normalizeSortingInfo(groupInfo).length : 0; + + return mapRecursive(items, level, mapper); +}; + +export const normalizeLoadResult = (data, extra) => { + if(data?.data) { + extra = data; + data = data.data; + } + + if(!Array.isArray(data)) { + data = [data]; + } + + return { + data, + extra + }; +}; + +const createCustomStoreFromLoadFunc = (options) => { + const storeConfig = {}; + + each(['useDefaultSearch', 'key', 'load', 'loadMode', 'cacheRawData', 'byKey', 'lookup', 'totalCount', 'insert', 'update', 'remove'], function() { + storeConfig[this] = options[this]; + delete options[this]; + }); + + return new CustomStore(storeConfig); +}; + +const createStoreFromConfig = (storeConfig) => { + const alias = storeConfig.type; + + delete storeConfig.type; + + return Store.create(alias, storeConfig); +}; + +const createCustomStoreFromUrl = (url, normalizationOptions) => + new CustomStore({ + load: () => ajaxUtils.sendRequest({ url, dataType: 'json' }), + loadMode: normalizationOptions?.fromUrlLoadMode + }); + +export const normalizeDataSourceOptions = (options, normalizationOptions) => { + let store; + + if(typeof options === 'string') { + options = { + paginate: false, + store: createCustomStoreFromUrl(options, normalizationOptions) + }; + } + + if(options === undefined) { + options = []; + } + + if(Array.isArray(options) || options instanceof Store) { + options = { store: options }; + } else { + options = extend({}, options); + } + + if(options.store === undefined) { + options.store = []; + } + + store = options.store; + + if('load' in options) { + store = createCustomStoreFromLoadFunc(options); + } else if(Array.isArray(store)) { + store = new ArrayStore(store); + } else if(isPlainObject(store)) { + store = createStoreFromConfig(extend({}, store)); + } + + options.store = store; + + return options; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..19c601d6eec408a8a5b48dd66a534184069db80f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.d.ts @@ -0,0 +1,14 @@ +/** + * @docid + * @namespace DevExpress + * @public + */ +export default class EndpointSelector { + constructor(options: any); + /** + * @docid + * @publicName urlFor(key) + * @public + */ + urlFor(key: string): string; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.js b/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.js new file mode 100644 index 0000000000000000000000000000000000000000..8bfbbef6665e9e81f1821f19ab34832009c5e700 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/endpoint_selector.js @@ -0,0 +1,44 @@ +/* global Debug*/ +import errors from '../core/errors'; + +import { getWindow } from '../core/utils/window'; +const window = getWindow(); + +let IS_WINJS_ORIGIN; +let IS_LOCAL_ORIGIN; + +function isLocalHostName(url) { + return /^(localhost$|127\.)/i.test(url); // TODO more precise check for 127.x.x.x IP +} + +/** +* @name EndpointSelector.ctor +* @publicName ctor(options) +* @param1 options:Object +* @hidden +*/ +const EndpointSelector = function(config) { + this.config = config; + IS_WINJS_ORIGIN = window.location.protocol === 'ms-appx:'; + IS_LOCAL_ORIGIN = isLocalHostName(window.location.hostname); +}; + +EndpointSelector.prototype = { + urlFor: function(key) { + const bag = this.config[key]; + if(!bag) { + throw errors.Error('E0006'); + } + + if(bag.production) { + if(IS_WINJS_ORIGIN && !Debug.debuggerEnabled || !IS_WINJS_ORIGIN && !IS_LOCAL_ORIGIN) { + return bag.production; + } + } + + return bag.local; + } + +}; + +export default EndpointSelector; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/errors.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/errors.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a51ecdc208e5f86bf35fb82519e840f3022b12b0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/errors.d.ts @@ -0,0 +1,16 @@ +/** + * @docid Utils.errorHandler + * @type function(e) + * @namespace DevExpress.data + * @deprecated Utils.setErrorHandler + * @public + */ +export function errorHandler(e: Error): void; + +/** + * @docid Utils.setErrorHandler + * @type function(handler) + * @namespace DevExpress.data + * @public + */ +export function setErrorHandler(handler: (e: Error) => void): void; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/errors.js b/packages/f-theme-editor/farris-theme-editor/js/data/errors.js new file mode 100644 index 0000000000000000000000000000000000000000..0b2ee0c1cbc2987592f0c7f06150111b20d04fbe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/errors.js @@ -0,0 +1,161 @@ +import errorUtils from '../core/utils/error'; +import coreErrors from '../core/errors'; + +/** +* @docid +* @name ErrorsData +*/ +export const errors = errorUtils(coreErrors.ERROR_MESSAGES, { + + /** + * @name ErrorsData.E4000 + */ + E4000: '[DevExpress.data]: {0}', + + /** + * @name ErrorsData.E4001 + */ + E4001: 'Unknown aggregating function is detected: \'{0}\'', + + /** + * @name ErrorsData.E4002 + */ + E4002: 'Unsupported OData protocol version is used', + + /** + * @name ErrorsData.E4003 + */ + E4003: 'Unknown filter operation is used: {0}', + + /** + * @name ErrorsData.E4004 + */ + E4004: 'The thenby() method is called before the sortby() method', + + /** + * @name ErrorsData.E4005 + */ + E4005: 'Store requires a key expression for this operation', + + /** + * @name ErrorsData.E4006 + */ + E4006: 'ArrayStore \'data\' option must be an array', + + /** + * @name ErrorsData.E4007 + */ + E4007: 'Compound keys cannot be auto-generated', + + /** + * @name ErrorsData.E4008 + */ + E4008: 'Attempt to insert an item with a duplicated key', + + /** + * @name ErrorsData.E4009 + */ + E4009: 'Data item cannot be found', + + /** + * @name ErrorsData.E4010 + */ + E4010: 'CustomStore does not support creating queries', + + /** + * @name ErrorsData.E4011 + */ + E4011: 'Custom Store method is not implemented or is not a function: {0}', + + /** + * @name ErrorsData.E4012 + */ + E4012: 'Custom Store method returns an invalid value: {0}', + + /** + * @name ErrorsData.E4013 + */ + E4013: 'Local Store requires the \'name\' configuration option is specified', + + /** + * @name ErrorsData.E4014 + */ + E4014: 'Unknown data type is specified for ODataStore: {0}', + + /** + * @name ErrorsData.E4015 + */ + E4015: 'Unknown entity name or alias is used: {0}', + + /** + * @name ErrorsData.E4016 + */ + E4016: 'The compileSetter(expr) method is called with \'self\' passed as a parameter', + + /** + * @name ErrorsData.E4017 + */ + E4017: 'Keys cannot be modified', + + /** + * @name ErrorsData.E4018 + */ + E4018: 'The server has returned a non-numeric value in a response to an item count request', + + /** + * @name ErrorsData.E4019 + */ + E4019: 'Mixing of group operators inside a single group of filter expression is not allowed', + + /** + * @name ErrorsData.E4020 + */ + E4020: 'Unknown store type is detected: {0}', + + /** + * @name ErrorsData.E4021 + */ + E4021: 'The server response does not provide the totalCount value', + + /** + * @name ErrorsData.E4022 + */ + E4022: 'The server response does not provide the groupCount value', + + /** + * @name ErrorsData.E4023 + */ + E4023: 'Could not parse the following XML: {0}', + + /** + * @name ErrorsData.E4024 + */ + E4024: 'String function {0} cannot be used with the data field {1} of type {2}.', + + /** + * @name ErrorsData.W4000 + */ + W4000: 'Data returned from the server has an incorrect structure', + + /** + * @name ErrorsData.W4001 + */ + W4001: 'The {0} field is listed in both "keyType" and "fieldTypes". The value of "fieldTypes" is used.', + + /** + * @name ErrorsData.W4002 + */ + W4002: 'Data loading has failed for some cells due to the following error: {0}' +}); + +export let errorHandler = null; +export const handleError = function(error) { + ///#DEBUG + const id = error && '__id' in error ? error.__id : 'E4000'; + errors.log(id, error); + ///#ENDDEBUG + + errorHandler?.(error); +}; + +export const setErrorHandler = (handler) => errorHandler = handler; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/index.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..1c6b24a1e33bfcbd2021f68fb15889b657b07cd9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/index.d.ts @@ -0,0 +1,149 @@ +/** + * @docid + * @public + */ +export type SearchOperation = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'startswith' | 'endswith' | 'contains' | 'notcontains'; + +type KeySelector = string | ((source: T) => string | number | Date | Object); + +type BaseGroupDescriptor = { + selector: KeySelector; +}; + +/** + * @docid + * @public + * @type object + */ +export type GroupDescriptor = KeySelector | BaseGroupDescriptor & { + desc?: boolean; +}; + +/** + * @docid + * @public + * @type object + */ +export type SortDescriptor = GroupDescriptor; + +/** + * @docid + * @public + * @type object + */ +export type SelectDescriptor = string | Array | ((source: T) => any); +/** + * @docid + * @public + */ + export type FilterDescriptor = any; + + /** + * @docid + * @public + * @type object + */ +export type SummaryDescriptor = KeySelector | BaseGroupDescriptor & { + summaryType?: 'sum' | 'avg' | 'min' | 'max' | 'count'; +}; + +/** + * @public + * @docid + * @namespace DevExpress.data + * @type object + */ + export interface LoadOptions { + /** + * @docid + * @public + */ + customQueryParams?: any; + /** + * @docid + * @public + */ + expand?: Array; + /** + * @docid + * @public + * @type object + */ + filter?: FilterDescriptor | Array; + /** + * @docid + * @public + * @type object + */ + group?: GroupDescriptor | Array>; + /** + * @docid + * @public + * @type object + */ + groupSummary?: SummaryDescriptor | Array>; + /** + * @docid + * @public + */ + parentIds?: Array; + /** + * @docid + * @public + */ + requireGroupCount?: boolean; + /** + * @docid + * @public + */ + requireTotalCount?: boolean; + /** + * @docid + * @type getter|Array + * @public + */ + searchExpr?: string | Function | Array; + /** + * @docid + * @public + */ + searchOperation?: SearchOperation; + /** + * @docid + * @public + */ + searchValue?: any; + /** + * @docid + * @public + * @type object + */ + select?: SelectDescriptor; + /** + * @docid + * @public + */ + skip?: number; + /** + * @docid + * @public + * @type object + */ + sort?: SortDescriptor | Array>; + /** + * @docid + * @public + */ + take?: number; + /** + * @docid + * @public + * @type object + */ + totalSummary?: SummaryDescriptor | Array>; + /** + * @docid + * @public + */ + userData?: any; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/load_options.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/load_options.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..27306760f1183df6ff6b1406f85825799a41baf9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/load_options.d.ts @@ -0,0 +1,4 @@ +import { LoadOptions as BaseLoadOptions } from './index'; + +/** @deprecated Use LoadOptions from 'devextreme/data' instead */ +export interface LoadOptions extends BaseLoadOptions { } diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/local_store.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/local_store.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9e72f37d38f3f116d48f56a488966d86f29676c9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/local_store.d.ts @@ -0,0 +1,53 @@ +import ArrayStore, { + ArrayStoreOptions, +} from './array_store'; + +/** @public */ +export type Options< + TItem = any, + TKey = any, +> = LocalStoreOptions; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface LocalStoreOptions< + TItem = any, + TKey = any, +> extends ArrayStoreOptions { + /** + * @docid + * @default 10000 + * @public + */ + flushInterval?: number; + /** + * @docid + * @default false + * @public + */ + immediate?: boolean; + /** + * @docid + * @public + */ + name?: string; +} +/** + * @docid + * @inherits ArrayStore + * @public + */ +export default class LocalStore< + TItem = any, + TKey = any, +> extends ArrayStore { + constructor(options?: Options) + /** + * @docid + * @publicName clear() + * @public + */ + clear(): void; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/local_store.js b/packages/f-theme-editor/farris-theme-editor/js/data/local_store.js new file mode 100644 index 0000000000000000000000000000000000000000..71b96f9907b33d49ff09a34414d189ee704bef95 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/local_store.js @@ -0,0 +1,126 @@ +import eventsEngine from '../events/core/events_engine'; +import domAdapter from '../core/dom_adapter'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import Class from '../core/class'; +const abstract = Class.abstract; +import { errors } from './errors'; +import ArrayStore from './array_store'; + +const LocalStoreBackend = Class.inherit({ + + ctor: function(store, storeOptions) { + this._store = store; + this._dirty = !!storeOptions.data; + this.save(); + + const immediate = this._immediate = storeOptions.immediate; + const flushInterval = Math.max(100, storeOptions.flushInterval || 10 * 1000); + + if(!immediate) { + const saveProxy = this.save.bind(this); + setInterval(saveProxy, flushInterval); + eventsEngine.on(window, 'beforeunload', saveProxy); + if(window.cordova) { + domAdapter.listen(domAdapter.getDocument(), 'pause', saveProxy, false); + } + } + }, + + notifyChanged: function() { + this._dirty = true; + if(this._immediate) { + this.save(); + } + }, + + load: function() { + this._store._array = this._loadImpl(); + this._dirty = false; + }, + + save: function() { + if(!this._dirty) { + return; + } + + this._saveImpl(this._store._array); + this._dirty = false; + }, + + _loadImpl: abstract, + _saveImpl: abstract +}); + +const DomLocalStoreBackend = LocalStoreBackend.inherit({ + + ctor: function(store, storeOptions) { + const name = storeOptions.name; + if(!name) { + throw errors.Error('E4013'); + } + this._key = 'dx-data-localStore-' + name; + + this.callBase(store, storeOptions); + }, + + _loadImpl: function() { + const raw = window.localStorage.getItem(this._key); + if(raw) { + return JSON.parse(raw); + } + return []; + }, + + _saveImpl: function(array) { + if(!array.length) { + window.localStorage.removeItem(this._key); + } else { + window.localStorage.setItem(this._key, JSON.stringify(array)); + } + } + +}); + +const localStoreBackends = { + 'dom': DomLocalStoreBackend +}; + + +const LocalStore = ArrayStore.inherit({ + + ctor: function(options) { + if(typeof options === 'string') { + options = { name: options }; + } else { + options = options || {}; + } + + this.callBase(options); + + this._backend = new localStoreBackends[options.backend || 'dom'](this, options); + this._backend.load(); + }, + + clear: function() { + this.callBase(); + this._backend.notifyChanged(); + }, + + _insertImpl: function(values) { + const b = this._backend; + return this.callBase(values).done(b.notifyChanged.bind(b)); + }, + + _updateImpl: function(key, values) { + const b = this._backend; + return this.callBase(key, values).done(b.notifyChanged.bind(b)); + }, + + _removeImpl: function(key) { + const b = this._backend; + return this.callBase(key).done(b.notifyChanged.bind(b)); + } +}, 'local'); + +export default LocalStore; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a01d77ea95d1b7369f9afeec93344a05c7d9c688 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.d.ts @@ -0,0 +1,110 @@ +import { + DxPromise, +} from '../../core/utils/deferred'; + +export interface ODataRequestOptions { + accepts: any; + async: boolean; + contentType: string | boolean; + data: any; + dataType: string; + headers: any; + jsonp?: boolean; + method: string; + timeout: number; + url: string; + xhrFields: any; +} + +/** @namespace DevExpress.data */ +export interface ODataContextOptions { + /** + * @docid + * @type_function_param1_field5 params:object + * @type_function_param1_field6 payload:object + * @type_function_param1_field7 headers:object + * @public + */ + beforeSend?: ((options: { url: string; async: boolean; method: string; timeout: number; params: any; payload: any; headers: any }) => void); + /** + * @docid + * @public + */ + deserializeDates?: boolean; + /** + * @docid + * @public + */ + entities?: any; + /** + * @docid + * @type_function_param1 e:Error + * @type_function_param1_field2 errorDetails:object + * @type_function_param1_field3 requestOptions:object + * @public + */ + errorHandler?: ((e: { httpStatus: number; errorDetails: any; requestOptions: ODataRequestOptions }) => void); + /** + * @docid + * @public + */ + filterToLower?: boolean; + /** + * @docid + * @default false + * @public + */ + jsonp?: boolean; + /** + * @docid + * @public + */ + url?: string; + /** + * @docid + * @default 2 + * @acceptValues 2|3|4 + * @public + */ + version?: number; + /** + * @docid + * @default false + * @public + */ + withCredentials?: boolean; +} +/** + * @docid + * @public + */ +export default class ODataContext { + constructor(options?: ODataContextOptions) + /** + * @docid + * @publicName get(operationName, params) + * @param2 params:object + * @return Promise + * @public + */ + get(operationName: string, params: any): DxPromise; + /** + * @docid + * @publicName invoke(operationName, params, httpMethod) + * @param2 params:object + * @param3 httpMethod:string + * @return Promise + * @public + */ + invoke(operationName: string, params: any, httpMethod: HttpMethod): DxPromise; + /** + * @docid + * @publicName objectLink(entityAlias, key) + * @param2 key:object|string|number + * @return object + * @public + */ + objectLink(entityAlias: string, key: any | string | number): any; +} + +type HttpMethod = 'GET' | 'POST' | 'PATCH' | 'MERGE'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.js b/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.js new file mode 100644 index 0000000000000000000000000000000000000000..63f7adad43fb8c7ca26df136f5de2b0639dfb5e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/context.js @@ -0,0 +1,88 @@ +import Class from '../../core/class'; +import { extend } from '../../core/utils/extend'; +import { isDefined, isPlainObject } from '../../core/utils/type'; +import { each } from '../../core/utils/iterator'; +import { errors, handleError } from '../errors'; +import ODataStore from './store'; +import RequestDispatcher from './request_dispatcher'; +import { escapeServiceOperationParams, formatFunctionInvocationUrl } from './utils'; +import { when, Deferred } from '../../core/utils/deferred'; +import './query_adapter'; + +const ODataContext = Class.inherit({ + + ctor(options) { + this._requestDispatcher = new RequestDispatcher(options); + + this._errorHandler = options.errorHandler; + + each(options.entities || [], (entityAlias, entityOptions) => { + this[entityAlias] = new ODataStore(extend( + {}, + options, + { + url: `${this._requestDispatcher.url}/${encodeURIComponent(entityOptions.name || entityAlias)}` + }, + entityOptions + )); + }); + }, + + get(operationName, params) { + return this.invoke(operationName, params, 'GET'); + }, + + invoke(operationName, params = {}, httpMethod = 'POST') { + httpMethod = httpMethod.toLowerCase(); + + const d = new Deferred(); + let url = `${this._requestDispatcher.url}/${encodeURIComponent(operationName)}`; + let payload; + + if(this.version() === 4) { + if(httpMethod === 'get') { + url = formatFunctionInvocationUrl(url, escapeServiceOperationParams(params, this.version())); + params = null; + } else if(httpMethod === 'post') { + payload = params; + params = null; + } + } + + when(this._requestDispatcher.sendRequest(url, httpMethod, escapeServiceOperationParams(params, this.version()), payload)) + .done((r) => { + if(isPlainObject(r) && operationName in r) { + r = r[operationName]; + } + d.resolve(r); + }) + .fail(this._errorHandler) + .fail(handleError) + .fail(d.reject); + + return d.promise(); + }, + + objectLink(entityAlias, key) { + const store = this[entityAlias]; + if(!store) { + throw errors.Error('E4015', entityAlias); + } + + if(!isDefined(key)) { + return null; + } + + return { + __metadata: { + uri: store._byKeyUrl(key) + } + }; + }, + + version() { + return this._requestDispatcher.version; + }, +}); + +export default ODataContext; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/query_adapter.js b/packages/f-theme-editor/farris-theme-editor/js/data/odata/query_adapter.js new file mode 100644 index 0000000000000000000000000000000000000000..7965523fef3339d982283036c5dc5df8e7c2039f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/query_adapter.js @@ -0,0 +1,346 @@ +import { isFunction } from '../../core/utils/type'; +import { each } from '../../core/utils/iterator'; +import config from '../../core/config'; +import { extend } from '../../core/utils/extend'; +import queryAdapters from '../query_adapters'; +import { + sendRequest, + generateSelect, + generateExpand, + serializeValue, + convertPrimitiveValue, + serializePropName +} from './utils'; +import { errors } from '../errors'; +import { + isConjunctiveOperator, + normalizeBinaryCriterion, + isUnaryOperation +} from '../utils'; + +const DEFAULT_PROTOCOL_VERSION = 2; +const STRING_FUNCTIONS = ['contains', 'notcontains', 'startswith', 'endswith']; + +const compileCriteria = (() => { + let protocolVersion; + let forceLowerCase; + let fieldTypes; + + const createBinaryOperationFormatter = (op) => (prop, val) => `${prop} ${op} ${val}`; + + const createStringFuncFormatter = (op, reverse) => (prop, val) => { + const bag = [op, '(']; + + if(forceLowerCase) { + prop = prop.indexOf('tolower(') === -1 ? `tolower(${prop})` : prop; + val = val.toLowerCase(); + } + + if(reverse) { + bag.push(val, ',', prop); + } else { + bag.push(prop, ',', val); + } + + bag.push(')'); + return bag.join(''); + }; + + const isStringFunction = function(name) { + return STRING_FUNCTIONS.some((funcName) => funcName === name); + }; + + const formatters = { + '=': createBinaryOperationFormatter('eq'), + '<>': createBinaryOperationFormatter('ne'), + '>': createBinaryOperationFormatter('gt'), + '>=': createBinaryOperationFormatter('ge'), + '<': createBinaryOperationFormatter('lt'), + '<=': createBinaryOperationFormatter('le'), + 'startswith': createStringFuncFormatter('startswith'), + 'endswith': createStringFuncFormatter('endswith') + }; + + const formattersV2 = extend({}, formatters, { + 'contains': createStringFuncFormatter('substringof', true), + 'notcontains': createStringFuncFormatter('not substringof', true) + }); + + const formattersV4 = extend({}, formatters, { + 'contains': createStringFuncFormatter('contains'), + 'notcontains': createStringFuncFormatter('not contains') + }); + + const compileBinary = (criteria) => { + criteria = normalizeBinaryCriterion(criteria); + + const op = criteria[1]; + const fieldName = criteria[0]; + const fieldType = fieldTypes && fieldTypes[fieldName]; + + if(fieldType && isStringFunction(op) && fieldType !== 'String') { + throw new errors.Error('E4024', op, fieldName, fieldType); + } + + const formatters = protocolVersion === 4 + ? formattersV4 + : formattersV2; + const formatter = formatters[op.toLowerCase()]; + + if(!formatter) { + throw errors.Error('E4003', op); + } + + let value = criteria[2]; + + if(fieldTypes?.[fieldName]) { + value = convertPrimitiveValue(fieldTypes[fieldName], value); + } + + return formatter( + serializePropName(fieldName), + serializeValue(value, protocolVersion) + ); + }; + + + const compileUnary = (criteria) => { + const op = criteria[0]; + const crit = compileCore(criteria[1]); + + if(op === '!') { + return `not (${crit})`; + } + + throw errors.Error('E4003', op); + }; + + const compileGroup = (criteria) => { + const bag = []; + let groupOperator; + let nextGroupOperator; + + each(criteria, function(index, criterion) { + if(Array.isArray(criterion)) { + + if(bag.length > 1 && groupOperator !== nextGroupOperator) { + throw new errors.Error('E4019'); + } + + bag.push(`(${compileCore(criterion)})`); + + groupOperator = nextGroupOperator; + nextGroupOperator = 'and'; + } else { + nextGroupOperator = isConjunctiveOperator(this) ? 'and' : 'or'; + } + }); + + return bag.join(` ${groupOperator} `); + }; + + const compileCore = (criteria) => { + if(Array.isArray(criteria[0])) { + return compileGroup(criteria); + } + + if(isUnaryOperation(criteria)) { + return compileUnary(criteria); + } + + return compileBinary(criteria); + }; + + return (criteria, version, types, filterToLower) => { + fieldTypes = types; + forceLowerCase = filterToLower ?? config().oDataFilterToLower; + protocolVersion = version; + + return compileCore(criteria); + }; +})(); + +const createODataQueryAdapter = (queryOptions) => { + let _sorting = []; + const _criteria = []; + const _expand = queryOptions.expand; + let _select; + let _skip; + let _take; + let _countQuery; + + const _oDataVersion = queryOptions.version || DEFAULT_PROTOCOL_VERSION; + + const hasSlice = () => _skip || _take !== undefined; + + const hasFunction = (criterion) => { + for(let i = 0; i < criterion.length; i++) { + if(isFunction(criterion[i])) { + return true; + } + + if(Array.isArray(criterion[i]) && hasFunction(criterion[i])) { + return true; + } + } + return false; + }; + + const requestData = () => { + const result = {}; + + if(!_countQuery) { + if(_sorting.length) { + result['$orderby'] = _sorting.join(','); + } + if(_skip) { + result['$skip'] = _skip; + } + if(_take !== undefined) { + result['$top'] = _take; + } + + result['$select'] = generateSelect(_oDataVersion, _select) || undefined; + result['$expand'] = generateExpand(_oDataVersion, _expand, _select) || undefined; + } + + if(_criteria.length) { + const criteria = _criteria.length < 2 ? _criteria[0] : _criteria; + const fieldTypes = queryOptions?.fieldTypes; + const filterToLower = queryOptions?.filterToLower; + + result['$filter'] = compileCriteria(criteria, _oDataVersion, fieldTypes, filterToLower); + } + + if(_countQuery) { + result['$top'] = 0; + } + + if(queryOptions.requireTotalCount || _countQuery) { + // todo: tests!!! + if(_oDataVersion !== 4) { + result['$inlinecount'] = 'allpages'; + } else { + result['$count'] = 'true'; + } + } + + return result; + }; + + const tryLiftSelect = (tasks) => { + let selectIndex = -1; + for(let i = 0; i < tasks.length; i++) { + if(tasks[i].name === 'select') { + selectIndex = i; + break; + } + } + + if(selectIndex < 0 || !isFunction(tasks[selectIndex].args[0])) return; + + const nextTask = tasks[1 + selectIndex]; + if(!nextTask || nextTask.name !== 'slice') return; + + tasks[1 + selectIndex] = tasks[selectIndex]; + tasks[selectIndex] = nextTask; + }; + + return { + + optimize: tryLiftSelect, + + exec(url) { + return sendRequest(_oDataVersion, + { + url, + params: extend(requestData(), queryOptions?.params) + }, + { + beforeSend: queryOptions.beforeSend, + jsonp: queryOptions.jsonp, + withCredentials: queryOptions.withCredentials, + countOnly: _countQuery, + deserializeDates: queryOptions.deserializeDates, + fieldTypes: queryOptions.fieldTypes, + isPaged: isFinite(_take) + } + ); + }, + + multiSort(args) { + let rules; + + if(hasSlice()) { + return false; + } + + for(let i = 0; i < args.length; i++) { + const getter = args[i][0]; + const desc = !!args[i][1]; + let rule; + + if(typeof getter !== 'string') { + return false; + } + + rule = serializePropName(getter); + if(desc) { + rule += ' desc'; + } + + rules = rules || []; + rules.push(rule); + } + + _sorting = rules; + }, + + slice(skipCount, takeCount) { + if(hasSlice()) { + return false; + } + + _skip = skipCount; + _take = takeCount; + }, + + filter(criterion) { + if(hasSlice()) { + return false; + } + + if(!Array.isArray(criterion)) { + criterion = [].slice.call(arguments); + } + + if(hasFunction(criterion)) { + return false; + } + + if(_criteria.length) { + _criteria.push('and'); + } + + _criteria.push(criterion); + }, + + select(expr) { + if(_select || isFunction(expr)) { + return false; + } + + if(!Array.isArray(expr)) { + expr = [].slice.call(arguments); + } + + _select = expr; + }, + + count: () => _countQuery = true + }; +}; + +queryAdapters.odata = createODataQueryAdapter; + +export const odata = createODataQueryAdapter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/request_dispatcher.js b/packages/f-theme-editor/farris-theme-editor/js/data/odata/request_dispatcher.js new file mode 100644 index 0000000000000000000000000000000000000000..365dbdaacd02833854e7f3dd58d9c9537e1884ba --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/request_dispatcher.js @@ -0,0 +1,55 @@ +import { sendRequest } from './utils'; +import './query_adapter'; + +const DEFAULT_PROTOCOL_VERSION = 2; + +export default class RequestDispatcher { + constructor(options) { + options = options || {}; + + this._url = String(options.url).replace(/\/+$/, ''); + this._beforeSend = options.beforeSend; + this._jsonp = options.jsonp; + this._version = options.version || DEFAULT_PROTOCOL_VERSION; + this._withCredentials = options.withCredentials; + this._deserializeDates = options.deserializeDates; + this._filterToLower = options.filterToLower; + } + + sendRequest(url, method, params, payload) { + return sendRequest(this.version, + { + url, + method, + params: params || {}, + payload + }, + { + beforeSend: this._beforeSend, + jsonp: this._jsonp, + withCredentials: this._withCredentials, + deserializeDates: this._deserializeDates + } + ); + } + + get version() { + return this._version; + } + + get beforeSend() { + return this._beforeSend; + } + + get url() { + return this._url; + } + + get jsonp() { + return this._jsonp; + } + + get filterToLower() { + return this._filterToLower; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c2b153ed3c63873233355d1fc5e3df97aeb7d7ae --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.d.ts @@ -0,0 +1,134 @@ +import { DxPromise } from '../../core/utils/deferred'; +import Store, { Options as StoreOptions } from '../abstract_store'; +import { LoadOptions } from '../index'; +import { Query } from '../query'; +import { ODataRequestOptions } from './context'; + +interface PromiseExtension { + then( + onFulfilled?: ((value: T, extraParameters?: T) => TResult1 | PromiseLike) | undefined | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null + ): Promise; +} + +/** @public */ +export type Options< + TItem = any, + TKey = any, +> = ODataStoreOptions; + +/** + * @namespace DevExpress.data + * @deprecated Use Options instead + */ +export interface ODataStoreOptions< + TItem = any, + TKey = any, +> extends StoreOptions { + /** + * @docid + * @type_function_param1_field5 params:object + * @type_function_param1_field6 payload:object + * @type_function_param1_field7 headers:object + * @public + */ + beforeSend?: ((options: { url: string; async: boolean; method: string; timeout: number; params: any; payload: any; headers: any }) => void); + /** + * @docid + * @public + */ + deserializeDates?: boolean; + /** + * @docid + * @type_function_param1 e:Error + * @type_function_param1_field2 errorDetails:object + * @type_function_param1_field3 requestOptions:object + * @public + */ + errorHandler?: ((e: { httpStatus: number; errorDetails: any; requestOptions: ODataRequestOptions }) => void); + /** + * @docid + * @default {} + * @public + */ + fieldTypes?: any; + /** + * @docid + * @public + */ + filterToLower?: boolean; + /** + * @docid + * @default false + * @public + */ + jsonp?: boolean; + /** + * @docid + * @type string|object + * @acceptValues "String"|"Int32"|"Int64"|"Guid"|"Boolean"|"Single"|"Decimal" + * @public + */ + keyType?: 'String' | 'Int32' | 'Int64' | 'Guid' | 'Boolean' | 'Single' | 'Decimal' | any; + /** + * @docid + * @type_function_param1 loadOptions:LoadOptions + * @action + * @public + */ + onLoading?: ((loadOptions: LoadOptions) => void); + /** + * @docid + * @public + */ + url?: string; + /** + * @docid + * @default 2 + * @acceptValues 2|3|4 + * @public + */ + version?: number; + /** + * @docid + * @default false + * @public + */ + withCredentials?: boolean; +} +/** + * @docid + * @inherits Store + * @public + */ +export default class ODataStore< + TItem = any, + TKey = any, +> extends Store { + constructor(options?: Options) + byKey(key: TKey): DxPromise; + /** + * @docid + * @publicName byKey(key, extraOptions) + * @param1 key:object|string|number + * @return Promise + * @public + */ + byKey(key: TKey, extraOptions: { expand?: string | Array; select?: string | Array }): DxPromise; + /** + * @docid + * @publicName createQuery(loadOptions) + * @return object + * @public + */ + createQuery(loadOptions?: { expand?: string | Array; requireTotalCount?: boolean; customQueryParams?: any }): Query; + + /** + * @docid + * @publicName insert(values) + * @param1 values:object + * @return Promise + * @public + */ + insert(values: TItem): DxPromise & PromiseExtension; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.js b/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.js new file mode 100644 index 0000000000000000000000000000000000000000..9a9069ef29119ae143390743f0f79cb314b14d18 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/store.js @@ -0,0 +1,202 @@ + +import { isDefined } from '../../core/utils/type'; +import config from '../../core/config'; +import { + generateExpand, + generateSelect, + serializeKey, + convertPrimitiveValue, + formatFunctionInvocationUrl, + escapeServiceOperationParams +} from './utils'; +import { errors } from '../errors'; +import query from '../query'; +import Store from '../abstract_store'; +import RequestDispatcher from './request_dispatcher'; +import { when, Deferred } from '../../core/utils/deferred'; + +import './query_adapter'; + +const ANONYMOUS_KEY_NAME = '5d46402c-7899-4ea9-bd81-8b73c47c7683'; + +const expandKeyType = (key, keyType) => ({ [key]: keyType }); + +const mergeFieldTypesWithKeyType = (fieldTypes, keyType) => { + const result = {}; + + for(const field in fieldTypes) { + result[field] = fieldTypes[field]; + } + + for(const keyName in keyType) { + if(keyName in result) { + if(result[keyName] !== keyType[keyName]) { + errors.log('W4001', keyName); + } + } else { + result[keyName] = keyType[keyName]; + } + } + + return result; +}; + +const ODataStore = Store.inherit({ + + ctor(options) { + this.callBase(options); + + this._requestDispatcher = new RequestDispatcher(options); + + let key = this.key(); + let fieldTypes = options.fieldTypes; + let keyType = options.keyType; + + if(keyType) { + const keyTypeIsString = (typeof keyType === 'string'); + + if(!key) { + key = keyTypeIsString ? ANONYMOUS_KEY_NAME : Object.keys(keyType); + this._legacyAnonymousKey = key; + } + + if(keyTypeIsString) { + keyType = expandKeyType(key, keyType); + } + + fieldTypes = mergeFieldTypesWithKeyType(fieldTypes, keyType); + } + + this._fieldTypes = fieldTypes || {}; + + if(this.version() === 2) { + this._updateMethod = 'MERGE'; + } else { + this._updateMethod = 'PATCH'; + } + }, + + _customLoadOptions() { + return ['expand', 'customQueryParams']; + }, + + _byKeyImpl(key, extraOptions) { + const params = {}; + + if(extraOptions) { + params['$expand'] = generateExpand(this.version(), extraOptions.expand, extraOptions.select) || undefined; + params['$select'] = generateSelect(this.version(), extraOptions.select) || undefined; + } + + return this._requestDispatcher.sendRequest(this._byKeyUrl(key), 'GET', params); + }, + + createQuery(loadOptions) { + let url; + const queryOptions = { + adapter: 'odata', + beforeSend: this._requestDispatcher.beforeSend, + errorHandler: this._errorHandler, + jsonp: this._requestDispatcher.jsonp, + version: this._requestDispatcher.version, + withCredentials: this._requestDispatcher._withCredentials, + expand: loadOptions?.expand, + requireTotalCount: loadOptions?.requireTotalCount, + deserializeDates: this._requestDispatcher._deserializeDates, + fieldTypes: this._fieldTypes + }; + + // NOTE: For AppBuilder, do not remove + url = loadOptions?.urlOverride ?? this._requestDispatcher.url; + + if(isDefined(this._requestDispatcher.filterToLower)) { + queryOptions.filterToLower = this._requestDispatcher.filterToLower; + } + + if(loadOptions?.customQueryParams) { + const params = escapeServiceOperationParams(loadOptions?.customQueryParams, this.version()); + + if(this.version() === 4) { + url = formatFunctionInvocationUrl(url, params); + } else { + queryOptions.params = params; + } + } + + return query(url, queryOptions); + }, + + _insertImpl(values) { + this._requireKey(); + + const d = new Deferred(); + + when(this._requestDispatcher.sendRequest(this._requestDispatcher.url, 'POST', null, values)) + .done(serverResponse => + d.resolve( + serverResponse && !config().useLegacyStoreResult ? serverResponse : values, + this.keyOf(serverResponse) + ) + ) + .fail(d.reject); + + return d.promise(); + }, + + _updateImpl(key, values) { + const d = new Deferred(); + + when( + this._requestDispatcher.sendRequest(this._byKeyUrl(key), this._updateMethod, null, values) + ).done(serverResponse => + config().useLegacyStoreResult + ? d.resolve(key, values) + : d.resolve(serverResponse || values, key) + ) + .fail(d.reject); + + return d.promise(); + }, + + _removeImpl(key) { + const d = new Deferred(); + + when(this._requestDispatcher.sendRequest(this._byKeyUrl(key), 'DELETE')) + .done(() => d.resolve(key)) + .fail(d.reject); + + return d.promise(); + }, + + _convertKey(value) { + let result = value; + const fieldTypes = this._fieldTypes; + const key = this.key() || this._legacyAnonymousKey; + + if(Array.isArray(key)) { + result = {}; + for(let i = 0; i < key.length; i++) { + const keyName = key[i]; + result[keyName] = convertPrimitiveValue(fieldTypes[keyName], value[keyName]); + } + } else if(fieldTypes[key]) { + result = convertPrimitiveValue(fieldTypes[key], value); + } + + return result; + }, + + _byKeyUrl(value) { + const baseUrl = this._requestDispatcher.url; + const convertedKey = this._convertKey(value); + + return `${baseUrl}(${encodeURIComponent(serializeKey(convertedKey, this.version()))})`; + }, + + version() { + return this._requestDispatcher.version; + } + +}, 'odata'); + +export default ODataStore; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..17b6810f4510fad460b822e74346ccdbac4927dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.d.ts @@ -0,0 +1,23 @@ +/** + * @docid + * @namespace DevExpress.data + * @public + */ +export class EdmLiteral { + constructor(value: string); + /** + * @docid + * @publicName valueOf() + * @public + */ + valueOf(): string; +} + +/** + * @const Utils.keyConverters + * @publicName odata.keyConverters + * @namespace DevExpress.data.utils.odata + * @public + */ +// eslint-disable-next-line vars-on-top, import/no-mutable-exports, no-var, @typescript-eslint/init-declarations, @typescript-eslint/no-explicit-any +export var keyConverters: any; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.js b/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..21833834a416a8ff2aa31314a2102b261a8c8a6b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/odata/utils.js @@ -0,0 +1,629 @@ +import Class from '../../core/class'; +import { extend } from '../../core/utils/extend'; +import { isDefined, isPlainObject, type, isObject } from '../../core/utils/type'; +import { each, map } from '../../core/utils/iterator'; +import ajax from '../../core/utils/ajax'; +import Guid from '../../core/guid'; +import { grep } from '../../core/utils/common'; +import { Deferred } from '../../core/utils/deferred'; +import { errors } from '../errors'; +import { errorMessageFromXhr, XHR_ERROR_UNLOAD } from '../utils'; +import { format as stringFormat } from '../../core/utils/string'; + +const GUID_REGEX = /^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/; + +const VERBOSE_DATE_REGEX = /^\/Date\((-?\d+)((\+|-)?(\d+)?)\)\/$/; +const ISO8601_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[-+]{1}\d{2}(:?)(\d{2})?)?$/; + +// Request processing +const JSON_VERBOSE_MIME_TYPE = 'application/json;odata=verbose'; + +const makeArray = value => type(value) === 'string' ? value.split() : value; + +const hasDot = x => /\./.test(x); + +const pad = (text, length, right) => { + text = String(text); + while(text.length < length) { + text = right ? (`${text}0`) : (`0${text}`); + } + return text; +}; + +const formatISO8601 = (date, skipZeroTime, skipTimezone) => { + const bag = []; + + const isZeroTime = () => date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds() < 1; + + const padLeft2 = text => pad(text, 2); + + bag.push(date.getFullYear()); + bag.push('-'); + bag.push(padLeft2(date.getMonth() + 1)); + bag.push('-'); + bag.push(padLeft2(date.getDate())); + + if(!(skipZeroTime && isZeroTime())) { + bag.push('T'); + bag.push(padLeft2(date.getHours())); + bag.push(':'); + bag.push(padLeft2(date.getMinutes())); + bag.push(':'); + bag.push(padLeft2(date.getSeconds())); + + if(date.getMilliseconds()) { + bag.push('.'); + bag.push(pad(date.getMilliseconds(), 3)); + } + + if(!skipTimezone) { + bag.push('Z'); + } + } + + return bag.join(''); +}; + +const parseISO8601 = (isoString) => { + const result = new Date(new Date(0).getTimezoneOffset() * 60 * 1000); + const chunks = isoString.replace('Z', '').split('T'); + const date = /(\d{4})-(\d{2})-(\d{2})/.exec(chunks[0]); + const time = /(\d{2}):(\d{2}):(\d{2})\.?(\d{0,7})?/.exec(chunks[1]); + + result.setFullYear(Number(date[1])); + result.setMonth(Number(date[2]) - 1); + result.setDate(Number(date[3])); + + if(Array.isArray(time) && time.length) { + result.setHours(Number(time[1])); + result.setMinutes(Number(time[2])); + result.setSeconds(Number(time[3])); + + let fractional = (time[4] || '').slice(0, 3); + fractional = pad(fractional, 3, true); + result.setMilliseconds(Number(fractional)); + } + + return result; +}; + +const isAbsoluteUrl = (url) => /^(?:[a-z]+:)?\/\//i.test(url); + +const stripParams = (url) => { + const index = url.indexOf('?'); + if(index > -1) { + return url.substr(0, index); + } + return url; +}; + +const toAbsoluteUrl = (basePath, relativePath) => { + let part; + const baseParts = stripParams(basePath).split('/'); + const relativeParts = relativePath.split('/'); + + baseParts.pop(); + while(relativeParts.length) { + part = relativeParts.shift(); + + if(part === '..') { + baseParts.pop(); + } else { + baseParts.push(part); + } + } + + return baseParts.join('/'); +}; + +const param = (params) => { + const result = []; + + for(const name in params) { + result.push(name + '=' + params[name]); + } + + return result.join('&'); +}; + +const ajaxOptionsForRequest = (protocolVersion, request, options = {}) => { + const formatPayload = (payload) => JSON.stringify(payload, function(key, value) { + if(!(this[key] instanceof Date)) { + return value; + } + + value = formatISO8601(this[key]); + switch(protocolVersion) { + case 2: + return value.substr(0, value.length - 1); + + case 3: + case 4: + return value; + + default: throw errors.Error('E4002'); + } + }); + + request = extend( + { + async: true, + method: 'get', + url: '', + params: {}, + payload: null, + headers: { + }, + timeout: 30000 + }, + request + ); + + options.beforeSend?.(request); + + const { async, timeout, headers } = request; + let { url, method } = request; + const { jsonp, withCredentials } = options; + + method = (method || 'get').toLowerCase(); + const isGet = method === 'get'; + const useJsonp = isGet && jsonp; + const params = extend({}, request.params); + const ajaxData = isGet ? params : formatPayload(request.payload); + const qs = !isGet && param(params); + const contentType = !isGet && JSON_VERBOSE_MIME_TYPE; + + if(qs) { + url += (url.indexOf('?') > -1 ? '&' : '?') + qs; + } + + if(useJsonp) { + ajaxData['$format'] = 'json'; + } + + return { + url, + data: ajaxData, + dataType: useJsonp ? 'jsonp' : 'json', + jsonp: useJsonp && '$callback', + method, + async, + timeout, + headers, + contentType, + accepts: { + json: [JSON_VERBOSE_MIME_TYPE, 'text/plain'].join() + }, + xhrFields: { + withCredentials + } + }; +}; + +export const sendRequest = (protocolVersion, request, options) => { + const { deserializeDates, fieldTypes, countOnly, isPaged } = options; + const d = new Deferred(); + const ajaxOptions = ajaxOptionsForRequest(protocolVersion, request, options); + + ajax.sendRequest(ajaxOptions).always((obj, textStatus) => { + const transformOptions = { + deserializeDates, + fieldTypes + }; + const tuple = interpretJsonFormat(obj, textStatus, transformOptions, ajaxOptions); + const { error, data, count } = tuple; + let { nextUrl } = tuple; + + if(error) { + if(error.message !== XHR_ERROR_UNLOAD) { + d.reject(error); + } + } else if(countOnly) { + + if(isFinite(count)) { + d.resolve(count); + } else { + d.reject(new errors.Error('E4018')); + } + + } else if(nextUrl && !isPaged) { + if(!isAbsoluteUrl(nextUrl)) { + nextUrl = toAbsoluteUrl(ajaxOptions.url, nextUrl); + } + + sendRequest(protocolVersion, { url: nextUrl }, options) + .fail(d.reject) + .done((nextData) => d.resolve(data.concat(nextData))); + } else { + const extra = isFinite(count) ? { totalCount: count } : undefined; + + d.resolve(data, extra); + } + }); + + return d.promise(); +}; + +const formatDotNetError = (errorObj) => { + let message; + let currentError = errorObj; + + if('message' in errorObj) { + message = errorObj.message?.value || errorObj.message; + } + while((currentError = (currentError['innererror'] || currentError['internalexception']))) { + message = currentError.message; + if(currentError['internalexception'] && (message.indexOf('inner exception') === -1)) { + break; + } + } + return message; +}; + +// TODO split: decouple HTTP errors from OData errors +const errorFromResponse = (obj, textStatus, ajaxOptions) => { + if(textStatus === 'nocontent') { + return null; // workaround for http://bugs.jquery.com/ticket/13292 + } + + let message = 'Unknown error'; + let response = obj; + let httpStatus = 200; + const errorData = { + requestOptions: ajaxOptions + }; + + if(textStatus !== 'success') { + const { status, responseText } = obj; + + httpStatus = status; + message = errorMessageFromXhr(obj, textStatus); + try { + response = JSON.parse(responseText); + } catch(x) { + } + } + const errorObj = response?.then || response?.error || response?.['odata.error'] || response?.['@odata.error']; + // NOTE: $.Deferred rejected and response contain error message + // NOTE: $.Deferred resolved with odata error + + + if(errorObj) { + message = formatDotNetError(errorObj) || message; + errorData.errorDetails = errorObj; + + if(httpStatus === 200) { + httpStatus = 500; + } + + const customCode = Number(errorObj.code); + if(isFinite(customCode) && customCode >= 400) { + httpStatus = customCode; + } + } + + if(httpStatus >= 400 || httpStatus === 0) { + errorData.httpStatus = httpStatus; + return extend(Error(message), errorData); + } + + return null; +}; + +const interpretJsonFormat = (obj, textStatus, transformOptions, ajaxOptions) => { + const error = errorFromResponse(obj, textStatus, ajaxOptions); + + if(error) { + return { error }; + } + + if(!isPlainObject(obj)) { + return { data: obj }; + } + + const value = 'd' in obj && (Array.isArray(obj.d) || isObject(obj.d)) + ? interpretVerboseJsonFormat(obj, textStatus) + : interpretLightJsonFormat(obj, textStatus); + + transformTypes(value, transformOptions); + + return value; +}; + +const interpretVerboseJsonFormat = ({ d: data }) => { + if(!isDefined(data)) { + return { error: Error('Malformed or unsupported JSON response received') }; + } + + return { + data: data.results ?? data, + nextUrl: data.__next, + count: parseInt(data.__count, 10) + }; +}; + +const interpretLightJsonFormat = obj => ({ + data: obj.value ?? obj, + nextUrl: obj['@odata.nextLink'], + count: parseInt(obj['@odata.count'], 10) +}); + +// Serialization and parsing + +export const EdmLiteral = Class.inherit({ + /** + * @name EdmLiteral.ctor + * @publicName ctor(value) + * @param1 value:string + */ + ctor(value) { + this._value = value; + }, + + valueOf() { + return this._value; + } +}); + +const transformTypes = (obj, options = {}) => { + each(obj, (key, value) => { + if(value !== null && typeof value === 'object') { + + if('results' in value) { + obj[key] = value.results; + } + + transformTypes(obj[key], options); + } else if(typeof value === 'string') { + const { fieldTypes, deserializeDates } = options; + const canBeGuid = !fieldTypes || fieldTypes[key] !== 'String'; + + if(canBeGuid && GUID_REGEX.test(value)) { + obj[key] = new Guid(value); + } + + if(deserializeDates !== false) { + if(value.match(VERBOSE_DATE_REGEX)) { + const date = new Date(Number(RegExp.$1) + RegExp.$2 * 60 * 1000); + obj[key] = new Date(date.valueOf() + date.getTimezoneOffset() * 60 * 1000); + } else if(ISO8601_DATE_REGEX.test(value)) { + obj[key] = new Date(parseISO8601(obj[key]).valueOf()); + } + } + } + }); +}; + +const serializeDate = date => `datetime'${formatISO8601(date, true, true)}'`; + +const serializeString = value => `'${value.replace(/'/g, '\'\'')}'`; + +export const serializePropName = propName => + propName instanceof EdmLiteral + ? propName.valueOf() + : propName.replace(/\./g, '/'); + +const serializeValueV4 = (value) => { + if(value instanceof Date) { + return formatISO8601(value, false, false); + } + if(value instanceof Guid) { + return value.valueOf(); + } + if(Array.isArray(value)) { + return `[${value.map((item) => serializeValueV4(item)).join(',')}]`; + } + return serializeValueV2(value); +}; + +const serializeValueV2 = (value) => { + if(value instanceof Date) { + return serializeDate(value); + } + if(value instanceof Guid) { + return `guid'${value}'`; + } + if(value instanceof EdmLiteral) { + return value.valueOf(); + } + if(typeof value === 'string') { + return serializeString(value); + } + return String(value); +}; + +export const serializeValue = (value, protocolVersion) => { + switch(protocolVersion) { + case 2: + case 3: + return serializeValueV2(value); + case 4: + return serializeValueV4(value); + default: throw errors.Error('E4002'); + } +}; + +export const serializeKey = (key, protocolVersion) => { + if(isPlainObject(key)) { + const parts = []; + each(key, (k, v) => parts.push(`${serializePropName(k)}=${serializeValue(v, protocolVersion)}`)); + return parts.join(); + } + return serializeValue(key, protocolVersion); +}; + +export const keyConverters = { + + String: value => `${value}`, + + Int32: value => Math.floor(value), + + Int64: value => value instanceof EdmLiteral ? value : new EdmLiteral(`${value}L`), + + Guid: value => value instanceof Guid ? value : new Guid(value), + + Boolean: value => !!value, + + Single: value => value instanceof EdmLiteral ? value : new EdmLiteral(value + 'f'), + + Decimal: value => value instanceof EdmLiteral ? value : new EdmLiteral(value + 'm') +}; + +export const convertPrimitiveValue = (type, value) => { + if(value === null) return null; + const converter = keyConverters[type]; + if(!converter) { + throw errors.Error('E4014', type); + } + return converter(value); +}; + +export const generateSelect = (oDataVersion, select) => { + if(!select) { + return; + } + + return oDataVersion < 4 + ? serializePropName(select.join()) + : grep(select, hasDot, true).join(); +}; + +const formatCore = (hash) => { + let result = ''; + const selectValue = []; + const expandValue = []; + + each(hash, (key, value) => { + if(Array.isArray(value)) { + [].push.apply(selectValue, value); + } + + if(isPlainObject(value)) { + expandValue.push(`${key}${formatCore(value)}`); + } + }); + + if(selectValue.length || expandValue.length) { + result += '('; + + if(selectValue.length) { + result += `$select=${map(selectValue, serializePropName).join()}`; + } + + if(expandValue.length) { + if(selectValue.length) { + result += ';'; + } + + result += `$expand=${map(expandValue, serializePropName).join()}`; + } + result += ')'; + } + + return result; +}; + +const format = (hash) => { + const result = []; + + each(hash, (key, value) => result.push(`${key}${formatCore(value)}`)); + + return result.join(); +}; + +const parseCore = (exprParts, root, stepper) => { + const result = stepper(root, exprParts.shift(), exprParts); + if(result === false) { + return; + } + + parseCore(exprParts, result, stepper); +}; + +const parseTree = (exprs, root, stepper) => + each(exprs, (_, x) => parseCore(x.split('.'), root, stepper)); + +const generatorV2 = (expand, select) => { + const hash = {}; + + if(expand) { + each(makeArray(expand), function() { + hash[serializePropName(this)] = 1; + }); + } + + if(select) { + each(makeArray(select), function() { + const path = this.split('.'); + if(path.length < 2) { + return; + } + + path.pop(); + hash[serializePropName(path.join('.'))] = 1; + }); + } + + return map(hash, (_, v) => v).join(); +}; + +const generatorV4 = (expand, select) => { + const hash = {}; + + if(expand || select) { + if(expand) { + parseTree(makeArray(expand), hash, (node, key, path) => { + node[key] = node[key] || {}; + + return !path.length ? false : node[key]; + }); + } + + if(select) { + parseTree(grep(makeArray(select), hasDot), hash, (node, key, path) => { + if(!path.length) { + node[key] = node[key] || []; + node[key].push(key); + return false; + } + + return (node[key] = node[key] || {}); + }); + } + + return format(hash); + } +}; + +export const generateExpand = (oDataVersion, expand, select) => + oDataVersion < 4 + ? generatorV2(expand, select) + : generatorV4(expand, select); + +export const formatFunctionInvocationUrl = (baseUrl, args) => + stringFormat( + '{0}({1})', + baseUrl, + map(args || {}, (value, key) => stringFormat('{0}={1}', key, value)).join(',') + ); + +export const escapeServiceOperationParams = (params, version) => { + if(!params) { + return params; + } + + // From WCF Data Services docs: + // The type of each parameter must be a primitive type. + // Any data of a non-primitive type must be serialized and passed into a string parameter + const result = {}; + each(params, (k, v) => { + result[k] = serializeValue(v, version); + }); + return result; +}; + +///#DEBUG +export const OData__internals = { + interpretJsonFormat +}; +///#ENDDEBUG diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/query.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/query.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..7e6ea5de9be22a907400813e1e244699d5504946 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/query.d.ts @@ -0,0 +1,185 @@ +import { + DxPromise, +} from '../core/utils/deferred'; + +/** + * @docid + * @type object + */ +export interface Query { + /** + * @docid + * @publicName aggregate(seed, step, finalize) + * @param1 seed:object + * @return Promise + * @public + */ + aggregate(seed: any, step: Function, finalize: Function): DxPromise; + /** + * @docid + * @publicName aggregate(step) + * @return Promise + * @public + */ + aggregate(step: Function): DxPromise; + /** + * @docid + * @publicName avg() + * @return Promise + * @public + */ + avg(): DxPromise; + /** + * @docid + * @publicName avg(getter) + * @param1 getter:object + * @return Promise + * @public + */ + avg(getter: any): DxPromise; + /** + * @docid + * @publicName count() + * @return Promise + * @public + */ + count(): DxPromise; + /** + * @docid + * @publicName enumerate() + * @return Promise + * @public + */ + enumerate(): DxPromise; + /** + * @docid + * @publicName filter(criteria) + * @public + */ + filter(criteria: Array): Query; + /** + * @docid + * @publicName filter(predicate) + * @public + */ + filter(predicate: Function): Query; + /** + * @docid + * @publicName groupBy(getter) + * @param1 getter:object + * @public + */ + groupBy(getter: any): Query; + /** + * @docid + * @publicName max() + * @return Promise + * @public + */ + max(): DxPromise; + /** + * @docid + * @publicName max(getter) + * @param1 getter:object + * @return Promise + * @public + */ + max(getter: any): DxPromise; + /** + * @docid + * @publicName min() + * @return Promise + * @public + */ + min(): DxPromise; + /** + * @docid + * @publicName min(getter) + * @param1 getter:object + * @return Promise + * @public + */ + min(getter: any): DxPromise; + /** + * @docid + * @publicName select(getter) + * @param1 getter:object + * @public + */ + select(getter: any): Query; + /** + * @docid + * @publicName slice(skip, take) + * @param2 take:number|undefined + * @public + */ + slice(skip: number, take?: number): Query; + /** + * @docid + * @publicName sortBy(getter) + * @param1 getter:object + * @public + */ + sortBy(getter: any): Query; + /** + * @docid + * @publicName sortBy(getter, desc) + * @param1 getter:object + * @public + */ + sortBy(getter: any, desc: boolean): Query; + /** + * @docid + * @publicName sum() + * @return Promise + * @public + */ + sum(): DxPromise; + /** + * @docid + * @publicName sum(getter) + * @param1 getter:object + * @return Promise + * @public + */ + sum(getter: any): DxPromise; + /** + * @docid + * @publicName thenBy(getter) + * @param1 getter:object + * @public + */ + thenBy(getter: any): Query; + /** + * @docid + * @publicName thenBy(getter, desc) + * @param1 getter:object + * @public + */ + thenBy(getter: any, desc: boolean): Query; + /** + * @docid + * @publicName toArray() + * @public + */ + toArray(): Array; +} + +/** + * @docid Utils.query + * @publicName query(array) + * @namespace DevExpress.data + * @public + */ +declare function query(array: Array): Query; + +/** + * @docid Utils.query + * @publicName query(url, queryOptions) + * @param2 queryOptions:object + * @namespace DevExpress.data + * @public + */ +declare function query(url: string, queryOptions: any): Query; + +export default query; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/query.js b/packages/f-theme-editor/farris-theme-editor/js/data/query.js new file mode 100644 index 0000000000000000000000000000000000000000..477b36bf2560d91cab42d8c8e1e585e55706ef6c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/query.js @@ -0,0 +1,8 @@ +import { queryImpl } from './query_implementation'; + +const query = function() { + const impl = Array.isArray(arguments[0]) ? 'array' : 'remote'; + return queryImpl[impl].apply(this, arguments); +}; + +export default query; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/query_adapters.js b/packages/f-theme-editor/farris-theme-editor/js/data/query_adapters.js new file mode 100644 index 0000000000000000000000000000000000000000..ff8b4c56321a3362fc00224b01800f62466f9a1f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/query_adapters.js @@ -0,0 +1 @@ +export default {}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/query_implementation.js b/packages/f-theme-editor/farris-theme-editor/js/data/query_implementation.js new file mode 100644 index 0000000000000000000000000000000000000000..43c2572d92f7cb2ffbabbcd101ba85ae8bf7db52 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/query_implementation.js @@ -0,0 +1,7 @@ +import arrayQueryImpl from './array_query'; +import remoteQueryImpl from './remote_query'; + +export const queryImpl = { + array: arrayQueryImpl, + remote: remoteQueryImpl +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/remote_query.js b/packages/f-theme-editor/farris-theme-editor/js/data/remote_query.js new file mode 100644 index 0000000000000000000000000000000000000000..6c5478a062d5a1f39049e09e63ac572e7f7ce147 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/remote_query.js @@ -0,0 +1,150 @@ +import queryAdapters from './query_adapters'; +import { errors, handleError } from './errors'; +import { each } from '../core/utils/iterator'; +import { isFunction } from '../core/utils/type'; +import { Deferred } from '../core/utils/deferred'; +import arrayQueryImpl from './array_query'; + +const remoteQueryImpl = function(url, queryOptions, tasks) { + tasks = tasks || []; + queryOptions = queryOptions || {}; + + const createTask = function(name, args) { + return { name: name, args: args }; + }; + + const exec = function(executorTask) { + const d = new Deferred(); + let _adapterFactory; + let _adapter; + let _taskQueue; + let _currentTask; + let _mergedSortArgs; + + const rejectWithNotify = function(error) { + const handler = queryOptions.errorHandler; + if(handler) { + handler(error); + } + + handleError(error); + d.reject(error); + }; + + function mergeSortTask(task) { + switch(task.name) { + case 'sortBy': + _mergedSortArgs = [task.args]; + return true; + + case 'thenBy': + if(!_mergedSortArgs) { + throw errors.Error('E4004'); + } + + _mergedSortArgs.push(task.args); + return true; + } + + return false; + } + + function unmergeSortTasks() { + const head = _taskQueue[0]; + const unmergedTasks = [ ]; + + if(head && head.name === 'multiSort') { + _taskQueue.shift(); + each(head.args[0], function() { + unmergedTasks.push(createTask(unmergedTasks.length ? 'thenBy' : 'sortBy', this)); + }); + } + + _taskQueue = unmergedTasks.concat(_taskQueue); + } + + try { + _adapterFactory = queryOptions.adapter; + if(!isFunction(_adapterFactory)) { + _adapterFactory = queryAdapters[_adapterFactory]; + } + + _adapter = _adapterFactory(queryOptions); + + _taskQueue = [].concat(tasks).concat(executorTask); + + const optimize = _adapter.optimize; + if(optimize) optimize(_taskQueue); + + while(_taskQueue.length) { + _currentTask = _taskQueue[0]; + + if(!mergeSortTask(_currentTask)) { + if(_mergedSortArgs) { + _taskQueue.unshift(createTask('multiSort', [_mergedSortArgs])); + _mergedSortArgs = null; + continue; + } + + if(String(_currentTask.name) !== 'enumerate') { + if(!_adapter[_currentTask.name] || _adapter[_currentTask.name].apply(_adapter, _currentTask.args) === false) { + break; + } + } + } + _taskQueue.shift(); + } + + unmergeSortTasks(); + + _adapter.exec(url) + .done(function(result, extra) { + if(!_taskQueue.length) { + d.resolve(result, extra); + } else { + let clientChain = arrayQueryImpl(result, { + errorHandler: queryOptions.errorHandler + }); + each(_taskQueue, function() { + clientChain = clientChain[this.name].apply(clientChain, this.args); + }); + clientChain + .done(d.resolve) + .fail(d.reject); + } + }) + .fail(rejectWithNotify); + + } catch(x) { + rejectWithNotify(x); + } + + return d.promise(); + }; + + const query = {}; + + each( + ['sortBy', 'thenBy', 'filter', 'slice', 'select', 'groupBy'], + function() { + const name = String(this); + query[name] = function() { + return remoteQueryImpl(url, queryOptions, tasks.concat(createTask(name, arguments))); + }; + } + ); + + each( + ['count', 'min', 'max', 'sum', 'avg', 'aggregate', 'enumerate'], + function() { + const name = String(this); + query[name] = function() { + return exec.call(this, createTask(name, arguments)); + }; + } + ); + + return query; +}; + +export default remoteQueryImpl; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/store_helper.js b/packages/f-theme-editor/farris-theme-editor/js/data/store_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..f6b3c11279c2a07d9c9255e9685a57d229655ce4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/store_helper.js @@ -0,0 +1,88 @@ +import { grep } from '../core/utils/common'; +import { extend } from '../core/utils/extend'; +import { each } from '../core/utils/iterator'; +import arrayQuery from './array_query'; +import { normalizeSortingInfo } from './utils'; + +function multiLevelGroup(query, groupInfo) { + query = query.groupBy(groupInfo[0].selector); + + if(groupInfo.length > 1) { + query = query.select(function(g) { + return extend({}, g, { + items: multiLevelGroup(arrayQuery(g.items), groupInfo.slice(1)).toArray() + }); + }); + } + + return query; +} + +function arrangeSortingInfo(groupInfo, sortInfo) { + const filteredGroup = []; + each(groupInfo, function(_, group) { + const collision = grep(sortInfo, function(sort) { + return group.selector === sort.selector; + }); + + if(collision.length < 1) { + filteredGroup.push(group); + } + }); + return filteredGroup.concat(sortInfo); +} + +function queryByOptions(query, options, isCountQuery) { + options = options || {}; + + const filter = options.filter; + + if(filter) { + query = query.filter(filter); + } + + if(isCountQuery) { + return query; + } + + let sort = options.sort; + const select = options.select; + let group = options.group; + const skip = options.skip; + const take = options.take; + + if(group) { + group = normalizeSortingInfo(group); + group.keepInitialKeyOrder = !!options.group.keepInitialKeyOrder; + } + + if(sort || group) { + sort = normalizeSortingInfo(sort || []); + if(group && !group.keepInitialKeyOrder) { + sort = arrangeSortingInfo(group, sort); + } + each(sort, function(index) { + query = query[index ? 'thenBy' : 'sortBy'](this.selector, this.desc, this.compare); + }); + } + + if(select) { + query = query.select(select); + } + + if(group) { + query = multiLevelGroup(query, group); + } + + if(take || skip) { + query = query.slice(skip || 0, take); + } + + return query; +} + +export default { + multiLevelGroup, + arrangeSortingInfo, + queryByOptions +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/utils.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data/utils.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..c32257ed8259ae9d020ad7bc2b739cbdc8907f79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/utils.d.ts @@ -0,0 +1,7 @@ +/** + * @docid Utils.base64_encode + * @publicName base64_encode(input) + * @namespace DevExpress.data + * @public + */ +export function base64_encode(input: string | Array): string; diff --git a/packages/f-theme-editor/farris-theme-editor/js/data/utils.js b/packages/f-theme-editor/farris-theme-editor/js/data/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..805846f8112e76c2d431dac1dbac26725b2fd5d8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data/utils.js @@ -0,0 +1,294 @@ +import { isFunction } from '../core/utils/type'; +import domAdapter from '../core/dom_adapter'; +import readyCallbacks from '../core/utils/ready_callbacks'; +import { getWindow } from '../core/utils/window'; +import { map } from '../core/utils/iterator'; +import { Deferred } from '../core/utils/deferred'; +import { equalByValue } from '../core/utils/common'; + +const ready = readyCallbacks.add; + +export const XHR_ERROR_UNLOAD = 'DEVEXTREME_XHR_ERROR_UNLOAD'; + +export const normalizeBinaryCriterion = function(crit) { + return [ + crit[0], + crit.length < 3 ? '=' : String(crit[1]).toLowerCase(), + crit.length < 2 ? true : crit[crit.length - 1] + ]; +}; + +export const normalizeSortingInfo = function(info) { + if(!Array.isArray(info)) { + info = [info]; + } + + return map(info, function(i) { + const result = { + selector: (isFunction(i) || typeof i === 'string') ? i : (i.getter || i.field || i.selector), + desc: !!(i.desc || String(i.dir).charAt(0).toLowerCase() === 'd') + }; + if(i.compare) { + result.compare = i.compare; + } + return result; + }); +}; + +export const errorMessageFromXhr = (function() { + const textStatusMessages = { + 'timeout': 'Network connection timeout', + 'error': 'Unspecified network error', + 'parsererror': 'Unexpected server response' + }; + + ///#DEBUG + const textStatusDetails = { + 'timeout': 'possible causes: the remote host is not accessible, overloaded or is not included into the domain white-list when being run in the native container', + 'error': 'if the remote host is located on another domain, make sure it properly supports cross-origin resource sharing (CORS), or use the JSONP approach instead', + 'parsererror': 'the remote host did not respond with valid JSON data' + }; + ///#ENDDEBUG + + const explainTextStatus = function(textStatus) { + let result = textStatusMessages[textStatus]; + + if(!result) { + return textStatus; + } + + ///#DEBUG + result += ' (' + textStatusDetails[textStatus] + ')'; + ///#ENDDEBUG + + return result; + }; + + // T542570, https://stackoverflow.com/a/18170879 + let unloading; + ready(function() { + const window = getWindow(); + domAdapter.listen(window, 'beforeunload', function() { unloading = true; }); + }); + + return function(xhr, textStatus) { + if(unloading) { + return XHR_ERROR_UNLOAD; + } + if(xhr.status < 400) { + return explainTextStatus(textStatus); + } + return xhr.statusText; + }; +})(); + +export const aggregators = { + count: { + seed: 0, + step: function(count) { return 1 + count; } + }, + sum: { + seed: 0, + step: function(sum, item) { return sum + item; } + }, + min: { + step: function(min, item) { return item < min ? item : min; } + }, + max: { + step: function(max, item) { return item > max ? item : max; } + }, + avg: { + seed: [0, 0], + step: function(pair, value) { + return [pair[0] + value, pair[1] + 1]; + }, + finalize: function(pair) { + return pair[1] ? pair[0] / pair[1] : NaN; + } + } +}; + +export const processRequestResultLock = (function() { + let lockCount = 0; + let lockDeferred; + + const obtain = function() { + if(lockCount === 0) { + lockDeferred = new Deferred(); + } + lockCount++; + }; + + const release = function() { + lockCount--; + if(lockCount < 1) { + lockDeferred.resolve(); + } + }; + + const promise = function() { + const deferred = lockCount === 0 ? new Deferred().resolve() : lockDeferred; + return deferred.promise(); + }; + + const reset = function() { + lockCount = 0; + if(lockDeferred) { + lockDeferred.resolve(); + } + }; + + return { + obtain: obtain, + release: release, + promise: promise, + reset: reset + }; +})(); + +export function isDisjunctiveOperator(condition) { + return /^(or|\|\||\|)$/i.test(condition); +} + +export function isConjunctiveOperator(condition) { + return /^(and|&&|&)$/i.test(condition); +} + +export const keysEqual = function(keyExpr, key1, key2) { + if(Array.isArray(keyExpr)) { + const names = map(key1, function(v, k) { return k; }); + let name; + for(let i = 0; i < names.length; i++) { + name = names[i]; + if(!equalByValue(key1[name], key2[name], 0, false)) { + return false; + } + } + return true; + } + return equalByValue(key1, key2, 0, false); +}; + +const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + +export const base64_encode = function(input) { + if(!Array.isArray(input)) { + input = stringToByteArray(String(input)); + } + + let result = ''; + + function getBase64Char(index) { + return BASE64_CHARS.charAt(index); + } + + for(let i = 0; i < input.length; i += 3) { + + const octet1 = input[i]; + const octet2 = input[i + 1]; + const octet3 = input[i + 2]; + + result += map( + [ + octet1 >> 2, + ((octet1 & 3) << 4) | octet2 >> 4, + isNaN(octet2) ? 64 : ((octet2 & 15) << 2) | octet3 >> 6, + isNaN(octet3) ? 64 : octet3 & 63 + ], + getBase64Char + ).join(''); + } + + return result; +}; + +function stringToByteArray(str) { + const bytes = []; + let code; + let i; + + for(i = 0; i < str.length; i++) { + code = str.charCodeAt(i); + + if(code < 128) { + bytes.push(code); + } else if(code < 2048) { + bytes.push(192 + (code >> 6), 128 + (code & 63)); + } else if(code < 65536) { + bytes.push(224 + (code >> 12), 128 + ((code >> 6) & 63), 128 + (code & 63)); + } else if(code < 2097152) { + bytes.push(240 + (code >> 18), 128 + ((code >> 12) & 63), 128 + ((code >> 6) & 63), 128 + (code & 63)); + } + } + return bytes; +} + +export const isUnaryOperation = function(crit) { + return crit[0] === '!' && Array.isArray(crit[1]); +}; + +const isGroupOperator = function(value) { + return value === 'and' || value === 'or'; +}; + +export const isGroupCriterion = function(crit) { + const first = crit[0]; + const second = crit[1]; + + if(Array.isArray(first)) { + return true; + } + if(isFunction(first)) { + if(Array.isArray(second) || isFunction(second) || isGroupOperator(second)) { + return true; + } + } + + return false; +}; + +export const trivialPromise = function() { + const d = new Deferred(); + return d.resolve.apply(d, arguments).promise(); +}; + +export const rejectedPromise = function() { + const d = new Deferred(); + return d.reject.apply(d, arguments).promise(); +}; + +function throttle(func, timeout) { + let timeoutId; + let lastArgs; + return function() { + lastArgs = arguments; + if(!timeoutId) { + timeoutId = setTimeout(() => { + timeoutId = undefined; + if(lastArgs) { + func.call(this, lastArgs); + } + }, isFunction(timeout) ? timeout() : timeout); + } + return timeoutId; + }; +} + +export function throttleChanges(func, timeout) { + let cache = []; + const throttled = throttle(function() { + func.call(this, cache); + cache = []; + }, timeout); + + return function(changes) { + if(Array.isArray(changes)) { + cache.push(...changes); + } + return throttled.call(this, cache); + }; +} + +/** +* @name Utils +*/ diff --git a/packages/f-theme-editor/farris-theme-editor/js/data_helper.d.ts b/packages/f-theme-editor/farris-theme-editor/js/data_helper.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba00d91f5bc71c9fff88572298ca3ac56e0bfa47 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data_helper.d.ts @@ -0,0 +1,14 @@ +import DataSource from './data/data_source'; + +/** + * @docid + * @hidden + */ +export default class DataHelperMixin { + /** + * @docid + * @publicName getDataSource() + * @public + */ + getDataSource(): DataSource; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/data_helper.js b/packages/f-theme-editor/farris-theme-editor/js/data_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..aa413003420e3735a731379f5d41b1a8aa75f656 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/data_helper.js @@ -0,0 +1,149 @@ + +import { DataSource } from './data/data_source/data_source'; +import { extend } from './core/utils/extend'; +import { normalizeDataSourceOptions } from './data/data_source/utils'; + +const DATA_SOURCE_OPTIONS_METHOD = '_dataSourceOptions'; +const DATA_SOURCE_CHANGED_METHOD = '_dataSourceChangedHandler'; +const DATA_SOURCE_LOAD_ERROR_METHOD = '_dataSourceLoadErrorHandler'; +const DATA_SOURCE_LOADING_CHANGED_METHOD = '_dataSourceLoadingChangedHandler'; +const DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD = '_dataSourceFromUrlLoadMode'; +const SPECIFIC_DATA_SOURCE_OPTION = '_getSpecificDataSourceOption'; +const NORMALIZE_DATA_SOURCE = '_normalizeDataSource'; + + +const DataHelperMixin = { + + postCtor: function() { + this.on('disposing', function() { + this._disposeDataSource(); + }.bind(this)); + }, + + _refreshDataSource: function() { + this._initDataSource(); + this._loadDataSource(); + }, + + _initDataSource: function() { + let dataSourceOptions = (SPECIFIC_DATA_SOURCE_OPTION in this) ? this[SPECIFIC_DATA_SOURCE_OPTION]() : this.option('dataSource'); + let widgetDataSourceOptions; + let dataSourceType; + + this._disposeDataSource(); + + if(dataSourceOptions) { + if(dataSourceOptions instanceof DataSource) { + this._isSharedDataSource = true; + this._dataSource = dataSourceOptions; + } else { + widgetDataSourceOptions = (DATA_SOURCE_OPTIONS_METHOD in this) ? this[DATA_SOURCE_OPTIONS_METHOD]() : {}; + dataSourceType = this._dataSourceType ? this._dataSourceType() : DataSource; + + dataSourceOptions = normalizeDataSourceOptions(dataSourceOptions, { + fromUrlLoadMode: (DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD in this) && this[DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD]() + }); + + this._dataSource = new dataSourceType(extend(true, {}, widgetDataSourceOptions, dataSourceOptions)); + } + + if(NORMALIZE_DATA_SOURCE in this) { + this._dataSource = this[NORMALIZE_DATA_SOURCE](this._dataSource); + } + + this._addDataSourceHandlers(); + } + }, + + _addDataSourceHandlers: function() { + if(DATA_SOURCE_CHANGED_METHOD in this) { + this._addDataSourceChangeHandler(); + } + + if(DATA_SOURCE_LOAD_ERROR_METHOD in this) { + this._addDataSourceLoadErrorHandler(); + } + + if(DATA_SOURCE_LOADING_CHANGED_METHOD in this) { + this._addDataSourceLoadingChangedHandler(); + } + + this._addReadyWatcher(); + }, + + _addReadyWatcher: function() { + this._dataSource.on('loadingChanged', (function(isLoading) { + this._ready && this._ready(!isLoading); + }).bind(this)); + }, + + _addDataSourceChangeHandler: function() { + const dataSource = this._dataSource; + this._proxiedDataSourceChangedHandler = (function(e) { + this[DATA_SOURCE_CHANGED_METHOD](dataSource.items(), e); + }).bind(this); + dataSource.on('changed', this._proxiedDataSourceChangedHandler); + }, + + _addDataSourceLoadErrorHandler: function() { + this._proxiedDataSourceLoadErrorHandler = this[DATA_SOURCE_LOAD_ERROR_METHOD].bind(this); + this._dataSource.on('loadError', this._proxiedDataSourceLoadErrorHandler); + }, + + _addDataSourceLoadingChangedHandler: function() { + this._proxiedDataSourceLoadingChangedHandler = this[DATA_SOURCE_LOADING_CHANGED_METHOD].bind(this); + this._dataSource.on('loadingChanged', this._proxiedDataSourceLoadingChangedHandler); + }, + + _loadDataSource: function() { + if(this._dataSource) { + const dataSource = this._dataSource; + + if(dataSource.isLoaded()) { + this._proxiedDataSourceChangedHandler && this._proxiedDataSourceChangedHandler(); + } else { + dataSource.load(); + } + } + }, + + _loadSingle: function(key, value) { + key = key === 'this' ? this._dataSource.key() || 'this' : key; + return this._dataSource.loadSingle(key, value); + }, + + _isLastPage: function() { + return !this._dataSource || this._dataSource.isLastPage() || !this._dataSource._pageSize; + }, + + _isDataSourceLoading: function() { + return this._dataSource && this._dataSource.isLoading(); + }, + + _disposeDataSource: function() { + if(this._dataSource) { + if(this._isSharedDataSource) { + delete this._isSharedDataSource; + + this._proxiedDataSourceChangedHandler && this._dataSource.off('changed', this._proxiedDataSourceChangedHandler); + this._proxiedDataSourceLoadErrorHandler && this._dataSource.off('loadError', this._proxiedDataSourceLoadErrorHandler); + this._proxiedDataSourceLoadingChangedHandler && this._dataSource.off('loadingChanged', this._proxiedDataSourceLoadingChangedHandler); + } else { + this._dataSource.dispose(); + } + + delete this._dataSource; + + delete this._proxiedDataSourceChangedHandler; + delete this._proxiedDataSourceLoadErrorHandler; + delete this._proxiedDataSourceLoadingChangedHandler; + } + }, + + getDataSource: function() { + return this._dataSource || null; + } + +}; + +export default DataHelperMixin; diff --git a/packages/f-theme-editor/farris-theme-editor/js/docEnums.js b/packages/f-theme-editor/farris-theme-editor/js/docEnums.js new file mode 100644 index 0000000000000000000000000000000000000000..eb6287af98f95124e9289166c299d633fc7f5b56 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/docEnums.js @@ -0,0 +1,1259 @@ + +/** + * @name Enums + * @type Object + */ + +/** + * @typedef {string} Enums.ButtonType + * @enum {'back'|'danger'|'default'|'normal'|'success'} + */ + +/** + * @typedef {string} Enums.ButtonStylingMode + * @enum {'text'|'outlined'|'contained'} + */ + +/** + * @typedef {string} Enums.EventKeyModifier + * @enum {'alt'|'ctrl'|'meta'|'shift'} + */ + +/** + * @typedef {number} Enums.FirstDayOfWeek + * @enum {0|1|2|3|4|5|6} + */ + +/** + * @typedef {number} Enums.PivotGridFieldChooserLayout +* @enum {0|1|2} +*/ + +/** + * @typedef {string} Enums.DropDownSearchMode + * @enum {'contains'|'startswith'} + */ + +/** + * @typedef {string} Enums.ValidationMessageMode + * @enum {'always'|'auto'} + */ + +/** + * @typedef {string} Enums.GaugeTitlePosition + * @enum {'bottom-center'|'bottom-left'|'bottom-right'|'top-center'|'top-left'|'top-right'} + */ + +/** + * @typedef {string} Enums.VizAnimationEasing + * @enum {'easeOutCubic'|'linear'} + */ + +/** + * @typedef {string} Enums.Format + * @enum {'billions'|'currency'|'day'|'decimal'|'exponential'|'fixedPoint'|'largeNumber'|'longDate'|'longTime'|'millions'|'millisecond'|'month'|'monthAndDay'|'monthAndYear'|'percent'|'quarter'|'quarterAndYear'|'shortDate'|'shortTime'|'thousands'|'trillions'|'year'|'dayOfWeek'|'hour'|'longDateLongTime'|'minute'|'second'|'shortDateShortTime'} + */ + +/** + * @typedef {string} Enums.VizTheme + * @enum {'default.dark'|'default.light'|'default.contrast'|'default.carmine'|'default.darkmoon'|'default.darkviolet'|'default.greenmist'|'default.softblue'|'material.blue.light'|'material.lime.light'|'material.orange.light'|'material.purple.light'|'material.teal.light'} + */ + +/** + * @typedef {string} Enums.VizPalette + * @enum {'Bright'|'Harmony Light'|'Ocean'|'Pastel'|'Soft'|'Soft Pastel'|'Vintage'|'Violet'|'Carmine'|'Dark Moon'|'Dark Violet'|'Green Mist'|'Soft Blue'|'Material'|'Office'} + */ + +/** + * @typedef {string} Enums.VizWordWrap + * @enum {'normal'|'breakWord'|'none'} + */ + +/** + * @typedef {string} Enums.VizTextOverflow + * @enum {'ellipsis'|'hide'|'none'} + */ + +/** + * @typedef {string} Enums.VizPaletteExtensionMode + * @enum {'alternate'|'blend'|'extrapolate'} + */ + +/** + * @typedef {string} Enums.VizPaletteColorSet + * @enum {'simpleSet'|'indicatingSet'|'gradientSet'} + */ + +/** + * @typedef {string} Enums.CircularGaugeElementOrientation + * @enum {'center'|'inside'|'outside'} + */ + +/** + * @typedef {string} Enums.GaugeOverlappingBehavior + * @enum {'first'|'last'} + */ + +/** + * @typedef {string} Enums.ScaleLabelOverlappingBehavior + * @enum {'hide'|'none'} + */ + +/** + * @typedef {string} Enums.BarGaugeResolveLabelOverlapping + * @enum {'hide'|'none'} + */ + +/** + * @typedef {string} Enums.OverlappingBehavior + * @enum {'rotate'|'stagger'|'none'|'hide'} + */ + +/** + * @typedef {string} Enums.PolarChartOverlappingBehavior + * @enum {'none'|'hide'} + */ + +/** + * @typedef {string} Enums.Orientation + * @enum {'horizontal'|'vertical'} + */ + +/** + * @typedef {string} Enums.DropFeedbackMode + * @enum {'push'|'indicate'} + */ + +/** + * @typedef {string} Enums.VerticalAlignment + * @enum {'bottom'|'center'|'top'} + */ + +/** + * @typedef {string} Enums.HorizontalAlignment + * @enum {'center'|'left'|'right'} + */ + +/** + * @typedef {string} Enums.VerticalEdge + * @enum {'bottom'|'top'} + */ + +/** + * @typedef {string} Enums.DashStyle + * @enum {'dash'|'dot'|'longDash'|'solid'} + */ + +/** + * @typedef {string} Enums.ResizeHandle + * @enum {'bottom'|'left'|'right'|'top'|'all'} + */ + +/** + * @typedef {string} Enums.BoxDirection + * @enum {'col'|'row'} + */ + +/** + * @typedef {string} Enums.BoxAlign + * @enum {'center'|'end'|'space-around'|'space-between'|'start'} + */ + +/** + * @typedef {string} Enums.BoxCrossAlign + * @enum {'center'|'end'|'start'|'stretch'} + */ + +/** + * @typedef {string} Enums.ButtonGroupSelectionMode + * @enum {'multiple'|'single'|'none'} + */ + +/** + * @typedef {string} Enums.Mode + * @enum {'auto'} + */ + +/** + * @typedef {string} Enums.SparklineType + * @enum {'area'|'bar'|'line'|'spline'|'splinearea'|'steparea'|'stepline'|'winloss'} + */ + +/** + * @typedef {string} Enums.VizPointSymbol + * @enum {'circle'|'cross'|'polygon'|'square'|'triangle'} + */ + +/** + * @typedef {string} Enums.CalendarZoomLevel + * @enum {'century'|'decade'|'month'|'year'} + */ + +/** + * @typedef {string} Enums.ChartResolveLabelOverlapping + * @enum {'hide'|'none'|'stack'} + */ + +/** + * @typedef {string} Enums.FunnelResolveLabelOverlapping + * @enum {'hide'|'none'|'shift'} + */ + +/** + * @typedef {string} Enums.ChartElementSelectionMode + * @enum {'multiple'|'single'} + */ + +/** + * @typedef {string} Enums.SeriesType + * @enum {'area'|'bar'|'bubble'|'candlestick'|'fullstackedarea'|'fullstackedbar'|'fullstackedline'|'fullstackedspline'|'fullstackedsplinearea'|'line'|'rangearea'|'rangebar'|'scatter'|'spline'|'splinearea'|'stackedarea'|'stackedbar'|'stackedline'|'stackedspline'|'stackedsplinearea'|'steparea'|'stepline'|'stock'} + */ + +/** + * @typedef {string} Enums.AnnotationType + * @enum {'text'|'image'|'custom'} + */ + +/** + * @typedef {string} Enums.Position + * @enum {'bottom'|'left'|'right'|'top'} + */ + +/** + * @typedef {string} Enums.ChartPointerType + * @enum {'all'|'mouse'|'none'|'touch'} + */ + +/** + * @typedef {string} Enums.ChartZoomAndPanMode + * @enum {'both'|'none'|'pan'|'zoom'} + */ + +/** + * @typedef {string} Enums.ChartLegendHoverMode + * @enum {'excludePoints'|'includePoints'|'none'} + */ + +/** + * @typedef {string} Enums.RelativePosition + * @enum {'inside'|'outside'} + */ + +/** + * @typedef {string} Enums.DiscreteAxisDivisionMode + * @enum {'betweenLabels'|'crossLabels'} + */ + +/** + * @typedef {string} Enums.ScaleBreakLineStyle + * @enum {'straight'|'waved'} + */ + +/** + * @typedef {string} Enums.ChartLabelDisplayMode + * @enum {'rotate'|'stagger'|'standard'} + */ + +/** + * @typedef {string} Enums.VizTimeInterval + * @enum {'day'|'hour'|'millisecond'|'minute'|'month'|'quarter'|'second'|'week'|'year'} + */ + +/** + * @typedef {string} Enums.VisualRangeUpdateMode + * @enum {'auto'|'keep'|'reset'|'shift'} + */ + +/** + * @typedef {string} Enums.ValueAxisVisualRangeUpdateMode + * @enum {'auto'|'keep'|'reset'} + */ + +/** + * @typedef {string} Enums.ChartZoomPanActionType + * @enum {'zoom'|'pan'} + */ + +/** + * @typedef {string} Enums.AxisScaleType + * @enum {'continuous'|'discrete'|'logarithmic'} + */ + +/** + * @typedef {string} Enums.ChartDataType + * @enum {'datetime'|'numeric'|'string'} + */ + +/** + * @typedef {string} Enums.ArgumentAxisHoverMode + * @enum {'allArgumentPoints'|'none'} + */ + +/** + * @typedef {string} Enums.ChartTooltipLocation + * @enum {'center'|'edge'} + */ + +/** + * @typedef {string} Enums.PieChartLegendHoverMode + * @enum {'none'|'allArgumentPoints'} + */ + +/** + * @typedef {string} Enums.PieChartResolveLabelOverlapping + * @enum {'hide'|'none'|'shift'} + */ + +/** + * @typedef {string} Enums.PieChartType + * @enum {'donut'|'doughnut'|'pie'} + */ + +/** + * @typedef {string} Enums.PieChartSegmentsDirection + * @enum {'anticlockwise'|'clockwise'} + */ + +/** + * @typedef {string} Enums.PieChartAnnotationLocation + * @enum {'center'|'edge'} + */ + +/** + * @typedef {string} Enums.PolarChartResolveLabelOverlapping + * @enum {'hide'|'none'} + */ + +/** + * @typedef {string} Enums.PolarChartSeriesType + * @enum {'area'|'bar'|'line'|'scatter'|'stackedbar'} + */ + +/** + * @typedef {string} Enums.EditorApplyValueMode + * @enum {'instantly'|'useButtons'} + */ + +/** + * @typedef {string} Enums.ShowSubmenuMode + * @enum {'onClick'|'onHover'} + */ + +/** + * @typedef {string} Enums.MenuSelectionMode + * @enum {'none'|'single'} + */ + +/** + * @typedef {string} Enums.ContextMenuSubmenuDirection + * @enum {'auto'|'left'|'right'} + */ + +/** + * @typedef {string} Enums.GridColumnChooserMode + * @enum {'dragAndDrop'|'select'} + */ + +/** + * @typedef {string} Enums.ColumnResizingMode + * @enum {'nextColumn'|'widget'} + */ + +/** + * @typedef {string} Enums.HorizontalEdge + * @enum {'left'|'right'} + */ + +/** + * @typedef {string} Enums.GridColumnDataType + * @enum {'string'|'number'|'date'|'boolean'|'object'|'datetime'} + */ + +/** + * @typedef {string} Enums.SortOrder + * @enum {'asc'|'desc'} + */ + +/** + * @typedef {string} Enums.FilterBuilderFieldFilterOperations + * @enum {'='|'<>'|'<'|'<='|'>'|'>='|'contains'|'endswith'|'isblank'|'isnotblank'|'notcontains'|'startswith'|'between'} + */ + +/** + * @typedef {string} Enums.FilterBuilderGroupOperations + * @enum {'and'|'or'|'notAnd'|'notOr'} + */ + +/** + * @typedef {string} Enums.FilterOperations + * @enum {'<'|'<='|'<>'|'='|'>'|'>='|'between'|'contains'|'endswith'|'notcontains'|'startswith'} + */ + +/** + * @typedef {string} Enums.GridFilterOperations + * @enum {'='|'<>'|'<'|'<='|'>'|'>='|'contains'|'endswith'|'isblank'|'isnotblank'|'notcontains'|'startswith'|'between'|'anyof'|'noneof'} + */ + +/** + * @typedef {string} Enums.FilterType + * @enum {'exclude'|'include'} + */ + +/** + * @typedef {string} Enums.HeaderFilterGroupInterval + * @enum {'day'|'hour'|'minute'|'month'|'quarter'|'second'|'year'} + */ + +/** + * @typedef {string} Enums.GridEditMode + * @enum {'batch'|'cell'|'row'|'form'|'popup'} + */ + +/** + * @typedef {string} Enums.GridEnterKeyAction + * @enum {'startEdit'|'moveFocus'} + */ + +/** + * @typedef {string} Enums.GridEnterKeyDirection + * @enum {'none'|'column'|'row'} + */ + +/** + * @typedef {string} Enums.GridEditRefreshMode + * @enum {'full'|'reshape'|'repaint'} + */ + +/** + * @typedef {string} Enums.GridApplyFilterMode + * @enum {'auto'|'onClick'} + */ + +/** + * @typedef {string} Enums.GridGroupingExpandMode + * @enum {'buttonClick'|'rowClick'} + */ + +/** + * @typedef {string} Enums.GridScrollingMode + * @enum {'infinite'|'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.ShowScrollbarMode + * @enum {'always'|'never'|'onHover'|'onScroll'} + */ + +/** + * @typedef {string} Enums.SelectionMode + * @enum {'multiple'|'none'|'single'} + */ + +/** + * @typedef {string} Enums.GridSelectionShowCheckBoxesMode + * @enum {'always'|'none'|'onClick'|'onLongTap'} + */ + +/** + * @typedef {string} Enums.SelectAllMode + * @enum {'allPages'|'page'} + */ + +/** + * @typedef {string} Enums.SummaryType + * @enum {'avg'|'count'|'custom'|'max'|'min'|'sum'} + */ + +/** + * @typedef {string} Enums.GridSortingMode + * @enum {'multiple'|'none'|'single'} + */ + +/** + * @typedef {string} Enums.StateStoringType + * @enum {'custom'|'localStorage'|'sessionStorage'} + */ + +/** + * @typedef {string} Enums.DateBoxType + * @enum {'date'|'datetime'|'time'} + */ + +/** + * @typedef {string} Enums.DateBoxPickerType + * @enum {'calendar'|'list'|'native'|'rollers'} + */ + +/** + * @typedef {string} Enums.FileUploadMode + * @enum {'instantly'|'useButtons'|'useForm'} + */ + +/** + * @typedef {string} Enums.UploadHttpMethod + * @enum {'POST'|'PUT'} + */ + +/** + * @typedef {string} Enums.FormLabelLocation + * @enum {'left'|'right'|'top'} + */ + +/** + * @typedef {string} Enums.FormItemEditorType + * @enum {'dxAutocomplete'|'dxCalendar'|'dxCheckBox'|'dxColorBox'|'dxDateBox'|'dxDropDownBox'|'dxHtmlEditor'|'dxLookup'|'dxNumberBox'|'dxRadioGroup'|'dxRangeSlider'|'dxSelectBox'|'dxSlider'|'dxSwitch'|'dxTagBox'|'dxTextArea'|'dxTextBox'} + */ + +/** + * @typedef {string} Enums.FormItemType + * @enum {'empty'|'group'|'simple'|'tabbed'|'button'} + */ + +/** + * @typedef {string} Enums.FunnelAlgorithm + * @enum {'dynamicHeight'|'dynamicSlope'} + */ + +/** + * @typedef {string} Enums.HatchingDirection + * @enum {'left'|'none'|'right'} + */ + +/** + * @typedef {string} Enums.FunnelLabelPosition + * @enum {'columns'|'inside'|'outside'} + */ + +/** + * @typedef {string} Enums.SankeyLabelOverlappingBehavior + * @enum {'ellipsis'|'hide'|'none'} + */ + +/** + * @typedef {string} Enums.SankeyColorMode + * @enum {'none'|'source'|'target'|'gradient'} + */ + +/** + * @typedef {string} Enums.ListSelectionMode + * @enum {'all'|'multiple'|'none'|'single'} + */ + +/** + * @typedef {string} Enums.ListMenuMode + * @enum {'context'|'slide'} + */ + +/** + * @typedef {string} Enums.ListItemDeleteMode + * @enum {'context'|'slideButton'|'slideItem'|'static'|'swipe'|'toggle'} + */ + +/** + * @typedef {string} Enums.ListPageLoadMode + * @enum {'nextButton'|'scrollBottom'} + */ + +/** + * @typedef {string} Enums.CollectionSearchMode + * @enum {'contains'|'startswith'|'equals'} + */ + +/** + * @typedef {string} Enums.GeoMapType + * @enum {'hybrid'|'roadmap'|'satellite'} + */ + +/** + * @typedef {string} Enums.GeoMapProvider + * @enum {'bing'|'google'|'googleStatic'} + */ + +/** + * @typedef {string} Enums.GeoMapRouteMode + * @enum {'driving'|'walking'} + */ + +/** + * @typedef {string} Enums.SubmenuDirection + * @enum {'auto'|'leftOrTop'|'rightOrBottom'} + */ + +/** + * @typedef {string} Enums.NavSelectionMode + * @enum {'multiple'|'single'} + */ + +/** + * @typedef {string} Enums.NumberBoxMode + * @enum {'number'|'text'|'tel'} + */ + +/** + * @typedef {string} Enums.PivotGridScrollingMode + * @enum {'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.PivotGridDataFieldArea + * @enum {'column'|'row'} + */ + +/** + * @typedef {string} Enums.PivotGridTotalsDisplayMode + * @enum {'both'|'columns'|'none'|'rows'} + */ + +/** + * @typedef {string} Enums.PivotGridRowHeadersLayout + * @enum {'standard'|'tree'} + */ + +/** + * @typedef {string} Enums.Toolbar + * @enum {'bottom'|'top'} + */ + +/** + * @typedef {string} Enums.ToolbarItemWidget + * @enum {'dxAutocomplete'|'dxButton'|'dxCheckBox'|'dxDateBox'|'dxMenu'|'dxSelectBox'|'dxTabs'|'dxTextBox'|'dxButtonGroup'|'dxDropDownButton'} + */ + +/** + * @typedef {string} Enums.ToolbarItemLocation + * @enum {'after'|'before'|'center'} + */ + +/** + * @typedef {string} Enums.RangeSelectorAxisScaleType + * @enum {'continuous'|'discrete'|'logarithmic'|'semidiscrete'} + */ + +/** + * @typedef {string} Enums.ValueChangedCallMode + * @enum {'onMoving'|'onMovingComplete'} + */ + +/** + * @typedef {string} Enums.BackgroundImageLocation + * @enum {'center'|'centerBottom'|'centerTop'|'full'|'leftBottom'|'leftCenter'|'leftTop'|'rightBottom'|'rightCenter'|'rightTop'} + */ + +/** + * @typedef {string} Enums.RangeSelectorChartAxisScaleType + * @enum {'continuous'|'logarithmic'} + */ + +/** + * @typedef {string} Enums.SliderTooltipShowMode + * @enum {'always'|'onHover'} + */ + +/** + * @typedef {string} Enums.SchedulerViewType + * @enum {'agenda'|'day'|'month'|'timelineDay'|'timelineMonth'|'timelineWeek'|'timelineWorkWeek'|'week'|'workWeek'} + */ + +/** + * @typedef {string} Enums.MaxAppointmentsPerCell + * @enum {'auto'|'unlimited'} + */ + +/** + * @typedef {string} Enums.SchedulerRecurrenceEditMode + * @enum {'dialog'|'occurrence'|'series'} + */ + +/** + * @typedef {string} Enums.SchedulerScrollingMode + * @enum {'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.ScrollDirection + * @enum {'both'|'horizontal'|'vertical'} + */ + +/** + * @typedef {string} Enums.DragDirection + * @enum {'both'|'horizontal'|'vertical'} + */ + +/** + * @typedef {string} Enums.SlideOutMenuPosition + * @enum {'inverted'|'normal'} + */ + +/** + * @typedef {string} Enums.DrawerOpenedStateMode + * @enum {'overlap'|'shrink'|'push'} + */ + +/** + * @typedef {string} Enums.DrawerPosition + * @enum {'left'|'right'|'top'|'bottom'|'before'|'after'} + */ + +/** + * @typedef {string} Enums.DrawerRevealMode + * @enum {'slide'|'expand'} + */ + +/** + * @typedef {string} Enums.TextBoxMode + * @enum {'email'|'password'|'search'|'tel'|'text'|'url'} + */ + +/** + * @typedef {string} Enums.ShowMaskMode + * @enum {'always'|'onFocus'} + */ + +/** + * @typedef {string} Enums.ToastType + * @enum {'custom'|'error'|'info'|'success'|'warning'} + */ + +/** + * @typedef {string} Enums.ToolbarItemLocateInMenuMode + * @enum {'always'|'auto'|'never'} + */ + +/** + * @typedef {string} Enums.ToolbarItemShowTextMode + * @enum {'always'|'inMenu'} + */ + +/** + * @typedef {string} Enums.ToolbarRenderMode + * @enum {'bottomToolbar'|'topToolbar'} + */ + +/** + * @typedef {string} Enums.TreeListDataStructure + * @enum {'plain'|'tree'} + */ + +/** + * @typedef {string} Enums.TreeListScrollingMode + * @enum {'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.GridRowRenderingMode + * @enum {'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.GridColumnRenderingMode + * @enum {'standard'|'virtual'} + */ + +/** + * @typedef {string} Enums.TreeMapLayoutAlgorithm + * @enum {'sliceanddice'|'squarified'|'strip'} + */ + +/** + * @typedef {string} Enums.TreeMapLayoutDirection + * @enum {'leftBottomRightTop'|'leftTopRightBottom'|'rightBottomLeftTop'|'rightTopLeftBottom'} + */ + +/** + * @typedef {string} Enums.TreeMapColorizerType + * @enum {'discrete'|'gradient'|'none'|'range'} + */ + +/** + * @typedef {string} Enums.TreeViewDataStructure + * @enum {'plain'|'tree'} + */ + +/** + * @typedef {string} Enums.TreeViewCheckBoxMode + * @enum {'none'|'normal'|'selectAll'} + */ + +/** + * @typedef {string} Enums.TreeViewExpandEvent + * @enum {'dblclick'|'click'} + */ + +/** + * @typedef {string} Enums.VectorMapLayerType + * @enum {'area'|'line'|'marker'} + */ + +/** + * @typedef {string} Enums.VectorMapMarkerType + * @enum {'bubble'|'dot'|'image'|'pie'} + */ + +/** + * @typedef {string} Enums.VectorMapMarkerShape + * @enum {'circle'|'square'} + */ + +/** + * @typedef {string} Enums.VectorMapProjection + * @enum {'equirectangular'|'lambert'|'mercator'|'miller'} + */ + +/** + * @typedef {string} Enums.AnimationType + * @enum {'css'|'fade'|'fadeIn'|'fadeOut'|'pop'|'slide'|'slideIn'|'slideOut'} + */ + +/** + * @typedef {string} Enums.Direction + * @enum {'bottom'|'left'|'right'|'top'} + */ + +/** + * @typedef {string} Enums.FinancialChartReductionLevel + * @enum {'close'|'high'|'low'|'open'} + */ + +/** + * @typedef {string} Enums.ChartSeriesHoverMode + * @enum {'allArgumentPoints'|'allSeriesPoints'|'excludePoints'|'includePoints'|'nearestPoint'|'none'|'onlyPoint'} + */ + +/** + * @typedef {string} Enums.ChartSeriesSelectionMode + * @enum {'allArgumentPoints'|'allSeriesPoints'|'excludePoints'|'includePoints'|'none'|'onlyPoint'} + */ + +/** + * @typedef {string} Enums.ChartPointInteractionMode + * @enum {'allArgumentPoints'|'allSeriesPoints'|'none'|'onlyPoint'} + */ + +/** + * @typedef {string} Enums.PointSymbol + * @enum {'circle'|'cross'|'polygon'|'square'|'triangleDown'|'triangleUp'} + */ + +/** + * @typedef {string} Enums.ValueErrorBarDisplayMode + * @enum {'auto'|'high'|'low'|'none'} + */ + +/** + * @typedef {string} Enums.ValueErrorBarType + * @enum {'fixed'|'percent'|'stdDeviation'|'stdError'|'variance'} + */ + +/** + * @typedef {string} Enums.ValidationRuleType + * @enum {'required'|'numeric'|'range'|'stringLength'|'custom'|'compare'|'pattern'|'email'|'async'} + */ + +/** + * @typedef {string} Enums.ComparisonOperator + * @enum {'!='|'!=='|'<'|'<='|'=='|'==='|'>'|'>='} + */ + +/** + * @typedef {string} Enums.FilterBuilderFieldDataType + * @enum {'string'|'number'|'date'|'boolean'|'object'|'datetime'} + */ + +/** + * @typedef {string} Enums.TextEditorButtonLocation + * @enum {'after'|'before'} + */ + +/** + * @typedef {string} Enums.TextBoxButtonName + * @enum {'clear'} + */ + +/** + * @typedef {string} Enums.NumberBoxButtonName + * @enum {'clear'|'spins'} + */ + +/** + * @typedef {string} Enums.DropDownEditorButtonName + * @enum {'clear'|'dropDown'} + */ + +/** + * @typedef {string} Enums.SmallValuesGroupingMode + * @enum {'none'|'smallValueThreshold'|'topN'} + */ + +/** + * @typedef {string} Enums.PieChartSeriesInteractionMode + * @enum {'none'|'onlyPoint'} + */ + +/** + * @typedef {string} Enums.PieChartLabelPosition + * @enum {'columns'|'inside'|'outside'} + */ + +/** + * @typedef {string} Enums.PivotGridDataType + * @enum {'date'|'number'|'string'} + */ + +/** + * @typedef {string} Enums.PivotGridGroupInterval + * @enum {'day'|'dayOfWeek'|'month'|'quarter'|'year'} + */ + +/** + * @typedef {string} Enums.PivotGridArea + * @enum {'column'|'data'|'filter'|'row'} + */ + +/** + * @typedef {string} Enums.PivotGridSortBy + * @enum {'displayText'|'value'|'none'} + */ + +/** + * @typedef {string} Enums.ApplyChangesMode + * @enum {'instantly'|'onDemand'} + */ + +/** + * @typedef {string} Enums.PivotGridSummaryDisplayMode + * @enum {'absoluteVariation'|'percentOfColumnGrandTotal'|'percentOfColumnTotal'|'percentOfGrandTotal'|'percentOfRowGrandTotal'|'percentOfRowTotal'|'percentVariation'} + */ + +/** + * @typedef {string} Enums.PivotGridRunningTotalMode + * @enum {'column'|'row'} + */ + +/** + * @typedef {string} Enums.PositionAlignment + * @enum {'bottom'|'center'|'left'|'left bottom'|'left top'|'right'|'right bottom'|'right top'|'top'} + */ + +/** + * @typedef {string} Enums.PositionResolveCollisionXY + * @enum {'fit'|'fit flip'|'fit flipfit'|'fit none'|'flip'|'flip fit'|'flip none'|'flipfit'|'flipfit fit'|'flipfit none'|'none'|'none fit'|'none flip'|'none flipfit'} + */ + +/** + * @typedef {string} Enums.PositionResolveCollision + * @enum {'fit'|'flip'|'flipfit'|'none'} + */ + +/** + * @typedef {string} Enums.ChartSeriesAggregationMethod + * @enum {'avg'|'count'|'max'|'min'|'ohlc'|'range'|'sum'|'custom'} + */ + +/** + * @typedef {string} Enums.ChartSingleValueSeriesAggregationMethod + * @enum {'avg'|'count'|'max'|'min'|'sum'|'custom'} + */ + +/** + * @typedef {string} Enums.ChartFinancialSeriesAggregationMethod + * @enum {'ohlc'|'custom'} + */ + +/** + * @typedef {string} Enums.ChartRangeSeriesAggregationMethod + * @enum {'range'|'custom'} + */ + +/** + * @typedef {string} Enums.ChartBubbleSeriesAggregationMethod + * @enum {'avg'|'custom'} + */ + +/** + * @typedef {string} Enums.DataSourceStoreType + * @enum {'array'|'local'|'odata'} + */ + +/** + * @typedef {string} Enums.PivotGridStoreType + * @enum {'array'|'local'|'odata'|'xmla'} + */ + +/** + * @typedef {string} Enums.ExportFormat + * @enum {'GIF'|'JPEG'|'PDF'|'PNG'|'SVG'} + */ + +/** + * @typedef {string} Enums.ExcelFontUnderlineType + * @enum {'double'|'doubleAccounting'|'none'|'single'|'singleAccounting'} + */ + +/** + * @typedef {string} Enums.ExcelCellHorizontalAlignment + * @enum {'center'|'centerContinuous'|'distributed'|'fill'|'general'|'justify'|'left'|'right'} + */ + +/** + * @typedef {string} Enums.ExcelCellVerticalAlignment + * @enum {'bottom'|'center'|'distributed'|'justify'|'top'} + */ + +/** + * @typedef {string} Enums.ExcelCellPatternType + * @enum {'darkDown'|'darkGray'|'darkGrid'|'darkHorizontal'|'darkTrellis'|'darkUp'|'darkVertical'|'gray0625'|'gray125'|'lightDown'|'lightGray'|'lightGrid'|'lightHorizontal'|'lightTrellis'|'lightUp'|'lightVertical'|'mediumGray'|'none'|'solid'} + */ + +/** + * @typedef {string} Enums.HtmlEditorValueType + * @enum {'html'|'markdown'} + */ + +/** + * @typedef {string} Enums.HtmlEditorToolbarItem + * @enum {'background'|'bold'|'color'|'font'|'italic'|'link'|'image'|'size'|'strike'|'subscript'|'superscript'|'underline'|'blockquote'|'header'|'increaseIndent'|'decreaseIndent'|'orderedList'|'bulletList'|'alignLeft'|'alignCenter'|'alignRight'|'alignJustify'|'codeBlock'|'variable'|'separator'|'undo'|'redo'|'clear'|'cellProperties'|'tableProperties'|'insertTable'|'insertHeaderRow'|'insertRowAbove'|'insertRowBelow'|'insertColumnLeft'|'insertColumnRight'|'deleteColumn'|'deleteRow'|'deleteTable'} + */ + +/** + * @typedef {string} Enums.HtmlEditorFormat + * @enum {'background'|'bold'|'color'|'font'|'italic'|'link'|'size'|'strike'|'script'|'underline'|'blockquote'|'header'|'indent'|'list'|'align'|'code-block'} + */ + +/** + * @typedef {string} Enums.HtmlEditorContextMenuItem + * @enum {'background'|'bold'|'color'|'font'|'italic'|'link'|'image'|'strike'|'subscript'|'superscript'|'underline'|'blockquote'|'increaseIndent'|'decreaseIndent'|'orderedList'|'bulletList'|'alignLeft'|'alignCenter'|'alignRight'|'alignJustify'|'codeBlock'|'variable'|'undo'|'redo'|'clear'|'insertTable'|'insertHeaderRow'|'insertRowAbove'|'insertRowBelow'|'insertColumnLeft'|'insertColumnRight'|'deleteColumn'|'deleteRow'|'deleteTable'|'cellProperties'|'tableProperties'} + */ + +/** + * @typedef {string} Enums.EditorStylingMode + * @enum {'outlined'|'underlined'|'filled'} + */ + +/** + * @typedef {string} Enums.EditorLabelMode + * @enum {'static'|'floating'|'hidden'} + */ + +/** + * @typedef {string} Enums.FormLabelMode + * @enum {'static'|'floating'|'hidden'|'outside'} + */ + +/** + * @typedef {string} Enums.GridCommandColumnType + * @enum {'adaptive'|'buttons'|'detailExpand'|'groupExpand'|'selection'|'drag'} + */ + +/** + * @typedef {string} Enums.TreeListCommandColumnType + * @enum {'adaptive'|'buttons'|'drag'} + */ + +/** + * @typedef {string} Enums.GridColumnButtonName + * @enum {'cancel'|'delete'|'edit'|'save'|'undelete'} + */ + +/** + * @typedef {string} Enums.TreeListColumnButtonName + * @enum {'add'|'cancel'|'delete'|'edit'|'save'|'undelete'} + */ + +/** + * @typedef {string} Enums.TreeListFilterMode + * @enum {'fullBranch'|'withAncestors'|'matchOnly'} + */ + +/** + * @typedef {string} Enums.GridStartEditAction + * @enum {'click'|'dblClick'} + */ + +/** + * @typedef {string} Enums.FileManagerSelectionMode + * @enum {'multiple'|'single'} + */ + +/** + * @typedef {string} Enums.FileManagerToolbarItem + * @enum {'showNavPane'|'create'|'upload'|'refresh'|'switchView'|'download'|'move'|'copy'|'rename'|'delete'|'clearSelection'|'separator'} + */ + +/** + * @typedef {string} Enums.FileManagerContextMenuItem + * @enum {'create'|'upload'|'refresh'|'download'|'move'|'copy'|'rename'|'delete'} + */ + +/** + * @typedef {string} Enums.FileManagerItemViewMode + * @enum {'details'|'thumbnails'} + */ + +/** + * @typedef {string} Enums.FileManagerViewArea + * @enum {'navPane'|'itemView'} + */ + +/** + * @typedef {string} Enums.DiagramDataLayoutType + * @enum {'auto'|'off'|'tree'|'layered'} + */ +/** + * @typedef {string} Enums.DiagramDataLayoutOrientation + * @enum {'vertical'|'horizontal'} + */ + +/** + * @typedef {string} Enums.DiagramUnits + * @enum {'in'|'cm'|'px'} + */ + +/** + * @typedef {string} Enums.DiagramPageOrientation + * @enum {'portrait'|'landscape'} + */ + +/** + * @typedef {string} Enums.DiagramShapeCategory + * @enum {'general'|'flowchart'|'orgChart'|'containers'|'custom'} + */ + +/** + * @typedef {string} Enums.DiagramShapeType + * @enum {'text'|'rectangle'|'ellipse'|'cross'|'triangle'|'diamond'|'heart'|'pentagon'|'hexagon'|'octagon'|'star'|'arrowLeft'|'arrowTop'|'arrowRight'|'arrowBottom'|'arrowNorthSouth'|'arrowEastWest'|'process'|'decision'|'terminator'|'predefinedProcess'|'document'|'multipleDocuments'|'manualInput'|'preparation'|'data'|'database'|'hardDisk'|'internalStorage'|'paperTape'|'manualOperation'|'delay'|'storedData'|'display'|'merge'|'connector'|'or'|'summingJunction'|'verticalContainer'|'horizontalContainer'|'cardWithImageOnLeft'|'cardWithImageOnTop'|'cardWithImageOnRight'} + */ + +/** + * @typedef {string} Enums.DiagramConnectorLineType + * @enum {'straight'|'orthogonal'} + */ + +/** + * @typedef {string} Enums.DiagramConnectorLineEnd + * @enum {'none'|'arrow'|'outlinedTriangle'|'filledTriangle'} + */ + +/** + * @typedef {string} Enums.DiagramToolboxDisplayMode + * @enum {'icons'|'texts'} + */ + +/** + * @typedef {string} Enums.DiagramCommand + * @enum {'separator'|'exportSvg'|'exportPng'|'exportJpg'|'undo'|'redo'|'cut'|'copy'|'paste'|'selectAll'|'delete'|'fontName'|'fontSize'|'bold'|'italic'|'underline'|'fontColor'|'lineStyle'|'lineWidth' | 'lineColor'|'fillColor'|'textAlignLeft'|'textAlignCenter'|'textAlignRight'|'lock'|'unlock'|'sendToBack'|'bringToFront'|'insertShapeImage'|'editShapeImage'|'deleteShapeImage'|'connectorLineType'|'connectorLineStart'|'connectorLineEnd'|'layoutTreeTopToBottom'|'layoutTreeBottomToTop'|'layoutTreeLeftToRight'|'layoutTreeRightToLeft'|'layoutLayeredTopToBottom'|'layoutLayeredBottomToTop'|'layoutLayeredLeftToRight'|'layoutLayeredRightToLeft'|'fullScreen'|'zoomLevel'|'showGrid'|'snapToGrid'|'gridSize'|'units'|'pageSize'|'pageOrientation'|'pageColor|simpleView|toolbox'} + */ + +/** + * @typedef {string} Enums.DiagramPanelVisibility + * @enum {'auto'|'visible'|'collapsed'|'disabled'} + */ + +/** + * @typedef {string} Enums.DiagramAutoZoomMode + * @enum {'fitContent'|'fitWidth'|'disabled'} + */ + +/** + * @typedef {string} Enums.DiagramItemType + * @enum {'shape'|'connector'} + */ + +/** + * @typedef {string} Enums.DiagramExportFormat + * @enum {'svg'|'png'|'jpg'} + */ + +/** + * @typedef {string} Enums.DiagramModelOperation + * @enum {'addShape'|'addShapeFromToolbox'|'deleteShape'|'deleteConnector'|'changeConnection'|'changeConnectorPoints'|'beforeChangeShapeText'|'changeShapeText'|'beforeChangeConnectorText'|'changeConnectorText'|'resizeShape'|'moveShape'} + */ + +/** + * @typedef {string} Enums.DiagramRequestEditOperationReason + * @enum {'checkUIElementAvailability'|'modelModification'} + */ + +/** + * @typedef {string} Enums.DiagramConnectorPosition + * @enum {'start'|'end'} + */ + +/** + * @typedef {string} Enums.GanttTaskTitlePosition + * @enum {'inside'|'outside'|'none'} + */ + +/** + * @typedef {string} Enums.GanttToolbarItem + * @enum {'separator'|'undo'|'redo'|'expandAll'|'collapseAll'|'addTask'|'deleteTask'|'zoomIn'|'zoomOut'| 'taskDetails' | 'fullScreen' | 'resourceManager' | 'showResources' | 'showDependencies'} + */ + +/** + * @typedef {string} Enums.GanttContextMenuItem + * @enum {'undo'|'redo'|'expandAll'|'collapseAll'|'addTask'|'deleteTask'|'zoomIn'|'zoomOut'|'deleteDependency'|'taskDetails'} + */ + +/** + * @typedef {string} Enums.GanttScaleType + * @enum {'auto'|'minutes'|'hours'|'days'|'weeks'|'months'|'quarters'|'years'} + */ + +/** + * @typedef {string} Enums.GanttSortingMode + * @enum {'multiple'|'none'|'single'} + */ + +/** + * @typedef {string} Enums.GanttPdfExportMode + * @enum { 'all'|'treeList'|'chart' } + */ + +/** + * @typedef {string} Enums.GanttPdfExportDateRange + * @enum { 'all'|'visible' } + */ + +/** + * @typedef {string} Enums.LegendMarkerState + * @enum {'normal'|'hovered'|'selected'} + */ + +/** + * @typedef {string} Enums.ValidationStatus + * @enum {'valid'|'invalid'|'pending'} + */ + +/** + * @typedef {string} Enums.floatingActionButtonDirection + * @enum {'auto'|'up'|'down'} + */ + +/** + * @typedef {string} Enums.GridPagerDisplayMode + * @enum {'adaptive'|'compact'|'full'} + */ + +/** + * @typedef {string} Enums.GridPagerPageSize + * @enum {'all'} + */ + +/** + * @typedef {string} Enums.GridDataChangeType + * @enum {'insert' | 'update' | 'remove'} + */ + +/** + * @typedef {string} Enums.GridNewRowPosition + * @enum {'first' | 'last' | 'pageBottom' | 'pageTop' | 'viewportBottom' | 'viewportTop'} + */ + +/** + * @typedef {string} Enums.DataGridToolbarItem + * @enum {'addRowButton' | 'applyFilterButton' | 'columnChooserButton' | 'exportButton' | 'groupPanel' | 'revertButton' | 'saveButton' | 'searchPanel'} + */ + +/** + * @typedef {string} Enums.TreeListToolbarItem + * @enum {'addRowButton' | 'applyFilterButton' | 'columnChooserButton' | 'revertButton' | 'saveButton' | 'searchPanel'} + */ diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/click.js b/packages/f-theme-editor/farris-theme-editor/js/events/click.js new file mode 100644 index 0000000000000000000000000000000000000000..da5fc389ddf1bb8990e088b4fb204e5d4f0b580d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/click.js @@ -0,0 +1,222 @@ +import $ from '../core/renderer'; +import eventsEngine from '../events/core/events_engine'; +import devices from '../core/devices'; +import domAdapter from '../core/dom_adapter'; +import { resetActiveElement, contains, closestCommonParent } from '../core/utils/dom'; +import { requestAnimationFrame, cancelAnimationFrame } from '../animation/frame'; +import { addNamespace, fireEvent, eventDelta, eventData } from './utils/index'; +import { subscribeNodesDisposing, unsubscribeNodesDisposing } from './utils/event_nodes_disposing'; +import pointerEvents from './pointer'; +import Emitter from './core/emitter'; +import registerEmitter from './core/emitter_registrator'; +import { compare as compareVersions } from '../core/utils/version'; + +const CLICK_EVENT_NAME = 'dxclick'; +const TOUCH_BOUNDARY = 10; +const abs = Math.abs; + +const isInput = function(element) { + return $(element).is('input, textarea, select, button ,:focus, :focus *'); +}; + +const misc = { requestAnimationFrame: requestAnimationFrame, cancelAnimationFrame: cancelAnimationFrame }; + +let ClickEmitter = Emitter.inherit({ + + ctor: function(element) { + this.callBase(element); + + this._makeElementClickable($(element)); + }, + + _makeElementClickable: function($element) { + if(!$element.attr('onclick')) { + $element.attr('onclick', 'void(0)'); + } + }, + + start: function(e) { + this._blurPrevented = e.isDefaultPrevented(); + this._startTarget = e.target; + this._startEventData = eventData(e); + }, + + end: function(e) { + if(this._eventOutOfElement(e, this.getElement().get(0)) || e.type === pointerEvents.cancel) { + this._cancel(e); + return; + } + + if(!isInput(e.target) && !this._blurPrevented) { + resetActiveElement(); + } + + this._accept(e); + this._clickAnimationFrame = misc.requestAnimationFrame((function() { + this._fireClickEvent(e); + }).bind(this)); + }, + + _eventOutOfElement: function(e, element) { + const target = e.target; + const targetChanged = !contains(element, target) && element !== target; + + const gestureDelta = eventDelta(eventData(e), this._startEventData); + const boundsExceeded = abs(gestureDelta.x) > TOUCH_BOUNDARY || abs(gestureDelta.y) > TOUCH_BOUNDARY; + + return targetChanged || boundsExceeded; + }, + + _fireClickEvent: function(e) { + this._fireEvent(CLICK_EVENT_NAME, e, { + target: closestCommonParent(this._startTarget, e.target) + }); + }, + + dispose: function() { + misc.cancelAnimationFrame(this._clickAnimationFrame); + } + +}); + + +// NOTE: native strategy for desktop, iOS 9.3+, Android 5+ +const realDevice = devices.real(); +const useNativeClick = + realDevice.default || + realDevice.ios && compareVersions(realDevice.version, [9, 3]) >= 0 || + realDevice.android && compareVersions(realDevice.version, [5]) >= 0; + +(function() { + const NATIVE_CLICK_CLASS = 'dx-native-click'; + const isNativeClickEvent = function(target) { + return useNativeClick || $(target).closest('.' + NATIVE_CLICK_CLASS).length; + }; + + + let prevented = null; + let lastFiredEvent = null; + + function onNodeRemove() { + lastFiredEvent = null; + } + + const clickHandler = function(e) { + const originalEvent = e.originalEvent; + const eventAlreadyFired = lastFiredEvent === originalEvent || originalEvent && originalEvent.DXCLICK_FIRED; + const leftButton = !e.which || e.which === 1; + + if(leftButton && !prevented && isNativeClickEvent(e.target) && !eventAlreadyFired) { + if(originalEvent) { + originalEvent.DXCLICK_FIRED = true; + } + + unsubscribeNodesDisposing(lastFiredEvent, onNodeRemove); + + lastFiredEvent = originalEvent; + + subscribeNodesDisposing(lastFiredEvent, onNodeRemove); + + fireEvent({ + type: CLICK_EVENT_NAME, + originalEvent: e + }); + } + }; + + ClickEmitter = ClickEmitter.inherit({ + _makeElementClickable: function($element) { + if(!isNativeClickEvent($element)) { + this.callBase($element); + } + + eventsEngine.on($element, 'click', clickHandler); + }, + + configure: function(data) { + this.callBase(data); + if(data.useNative) { + this.getElement().addClass(NATIVE_CLICK_CLASS); + } + }, + + start: function(e) { + prevented = null; + + if(!isNativeClickEvent(e.target)) { + this.callBase(e); + } + }, + + end: function(e) { + if(!isNativeClickEvent(e.target)) { + this.callBase(e); + } + }, + + cancel: function() { + prevented = true; + }, + + dispose: function() { + this.callBase(); + + eventsEngine.off(this.getElement(), 'click', clickHandler); + } + }); +})(); + + +// NOTE: fixes native click blur on slow devices +(function() { + const desktopDevice = devices.real().default; + + if(!desktopDevice) { + let startTarget = null; + let blurPrevented = false; + + const pointerDownHandler = function(e) { + startTarget = e.target; + blurPrevented = e.isDefaultPrevented(); + }; + + const clickHandler = function(e) { + const $target = $(e.target); + if(!blurPrevented && startTarget && !$target.is(startTarget) && !$(startTarget).is('label') && isInput($target)) { + resetActiveElement(); + } + + startTarget = null; + blurPrevented = false; + }; + + const NATIVE_CLICK_FIXER_NAMESPACE = 'NATIVE_CLICK_FIXER'; + const document = domAdapter.getDocument(); + eventsEngine.subscribeGlobal(document, addNamespace(pointerEvents.down, NATIVE_CLICK_FIXER_NAMESPACE), pointerDownHandler); + eventsEngine.subscribeGlobal(document, addNamespace('click', NATIVE_CLICK_FIXER_NAMESPACE), clickHandler); + } +})(); + + +/** + * @name UI Events.dxclick + * @type eventType + * @type_function_param1 event:event + * @module events/click +*/ +registerEmitter({ + emitter: ClickEmitter, + bubble: true, + events: [ + CLICK_EVENT_NAME + ] +}); + +export { CLICK_EVENT_NAME as name }; + +///#DEBUG +export { + misc, + useNativeClick +}; +///#ENDDEBUG diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/contextmenu.js b/packages/f-theme-editor/farris-theme-editor/js/events/contextmenu.js new file mode 100644 index 0000000000000000000000000000000000000000..88dd9290add1899d3e88eb831ef6e1e47553fa90 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/contextmenu.js @@ -0,0 +1,64 @@ +import $ from '../core/renderer'; +import eventsEngine from '../events/core/events_engine'; +import { touch } from '../core/utils/support'; +import devices from '../core/devices'; +import Class from '../core/class'; +import registerEvent from './core/event_registrator'; +import { addNamespace, fireEvent, isMouseEvent } from './utils/index'; +import holdEvent from './hold'; + +const CONTEXTMENU_NAMESPACE = 'dxContexMenu'; + +const CONTEXTMENU_NAMESPACED_EVENT_NAME = addNamespace('contextmenu', CONTEXTMENU_NAMESPACE); +const HOLD_NAMESPACED_EVENT_NAME = addNamespace(holdEvent.name, CONTEXTMENU_NAMESPACE); + +const CONTEXTMENU_EVENT_NAME = 'dxcontextmenu'; + + +const ContextMenu = Class.inherit({ + + setup: function(element) { + const $element = $(element); + + eventsEngine.on($element, CONTEXTMENU_NAMESPACED_EVENT_NAME, this._contextMenuHandler.bind(this)); + + if(touch || devices.isSimulator()) { + eventsEngine.on($element, HOLD_NAMESPACED_EVENT_NAME, this._holdHandler.bind(this)); + } + }, + + _holdHandler: function(e) { + if(isMouseEvent(e) && !devices.isSimulator()) { + return; + } + + this._fireContextMenu(e); + }, + + _contextMenuHandler: function(e) { + this._fireContextMenu(e); + }, + + _fireContextMenu: function(e) { + return fireEvent({ + type: CONTEXTMENU_EVENT_NAME, + originalEvent: e + }); + }, + + teardown: function(element) { + eventsEngine.off(element, '.' + CONTEXTMENU_NAMESPACE); + } + +}); + +/** + * @name UI Events.dxcontextmenu + * @type eventType + * @type_function_param1 event:event + * @module events/contextmenu +*/ + +registerEvent(CONTEXTMENU_EVENT_NAME, new ContextMenu()); + +export const name = CONTEXTMENU_EVENT_NAME; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core.js b/packages/f-theme-editor/farris-theme-editor/js/events/core.js new file mode 100644 index 0000000000000000000000000000000000000000..383358ed6b4ee6167419ccbb8b2e6af88d996b4b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core.js @@ -0,0 +1,5 @@ +/** +* @name UI Events +* @publicName UI Events +* @namespace DevExpress +*/ diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.feedback.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.feedback.js new file mode 100644 index 0000000000000000000000000000000000000000..8ec2ab5f0e8d174cbccad4b2f515fe7f87955c5c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.feedback.js @@ -0,0 +1,181 @@ +import Class from '../../core/class'; +import { noop, ensureDefined } from '../../core/utils/common'; +import { contains } from '../../core/utils/dom'; +import devices from '../../core/devices'; +import { isMouseEvent } from '../utils/index'; +import pointerEvents from '../pointer'; +import Emitter from './emitter'; +import registerEmitter from './emitter_registrator'; + +const ACTIVE_EVENT_NAME = 'dxactive'; +const INACTIVE_EVENT_NAME = 'dxinactive'; + +const ACTIVE_TIMEOUT = 30; +const INACTIVE_TIMEOUT = 400; + + +const FeedbackEvent = Class.inherit({ + + ctor: function(timeout, fire) { + this._timeout = timeout; + this._fire = fire; + }, + + start: function() { + const that = this; + + this._schedule(function() { + that.force(); + }); + }, + + _schedule: function(fn) { + this.stop(); + this._timer = setTimeout(fn, this._timeout); + }, + + stop: function() { + clearTimeout(this._timer); + }, + + force: function() { + if(this._fired) { + return; + } + + this.stop(); + this._fire(); + this._fired = true; + }, + + fired: function() { + return this._fired; + } + +}); + + +let activeFeedback; + +const FeedbackEmitter = Emitter.inherit({ + + ctor: function() { + this.callBase.apply(this, arguments); + + this._active = new FeedbackEvent(0, noop); + this._inactive = new FeedbackEvent(0, noop); + }, + + configure: function(data, eventName) { + switch(eventName) { + case ACTIVE_EVENT_NAME: + data.activeTimeout = data.timeout; + break; + case INACTIVE_EVENT_NAME: + data.inactiveTimeout = data.timeout; + break; + } + + this.callBase(data); + }, + + start: function(e) { + if(activeFeedback) { + const activeChildExists = contains(this.getElement().get(0), activeFeedback.getElement().get(0)); + const childJustActivated = !activeFeedback._active.fired(); + + if(activeChildExists && childJustActivated) { + this._cancel(); + return; + } + + activeFeedback._inactive.force(); + } + activeFeedback = this; + + this._initEvents(e); + this._active.start(); + }, + + _initEvents: function(e) { + const that = this; + + const eventTarget = this._getEmitterTarget(e); + + const mouseEvent = isMouseEvent(e); + const isSimulator = devices.isSimulator(); + const deferFeedback = isSimulator || !mouseEvent; + + const activeTimeout = ensureDefined(this.activeTimeout, ACTIVE_TIMEOUT); + const inactiveTimeout = ensureDefined(this.inactiveTimeout, INACTIVE_TIMEOUT); + + this._active = new FeedbackEvent(deferFeedback ? activeTimeout : 0, function() { + that._fireEvent(ACTIVE_EVENT_NAME, e, { target: eventTarget }); + }); + this._inactive = new FeedbackEvent(deferFeedback ? inactiveTimeout : 0, function() { + that._fireEvent(INACTIVE_EVENT_NAME, e, { target: eventTarget }); + activeFeedback = null; + }); + }, + + cancel: function(e) { + this.end(e); + }, + + end: function(e) { + const skipTimers = e.type !== pointerEvents.up; + + if(skipTimers) { + this._active.stop(); + } else { + this._active.force(); + } + + this._inactive.start(); + + if(skipTimers) { + this._inactive.force(); + } + }, + + dispose: function() { + this._active.stop(); + this._inactive.stop(); + + if(activeFeedback === this) { + activeFeedback = null; + } + + this.callBase(); + }, + + lockInactive: function() { + this._active.force(); + this._inactive.stop(); + activeFeedback = null; + this._cancel(); + + return this._inactive.force.bind(this._inactive); + } + +}); +FeedbackEmitter.lock = function(deferred) { + const lockInactive = activeFeedback ? activeFeedback.lockInactive() : noop; + + deferred.done(lockInactive); +}; + + +registerEmitter({ + emitter: FeedbackEmitter, + events: [ + ACTIVE_EVENT_NAME, + INACTIVE_EVENT_NAME + ] +}); + +export const lock = FeedbackEmitter.lock; +export { + ACTIVE_EVENT_NAME as active, + INACTIVE_EVENT_NAME as inactive +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.js new file mode 100644 index 0000000000000000000000000000000000000000..5405d560c360a46fda30606ff49d1035b366a9d6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter.js @@ -0,0 +1,106 @@ +import $ from '../../core/renderer'; +import { noop } from '../../core/utils/common'; +import Class from '../../core/class'; +import Callbacks from '../../core/utils/callbacks'; +import { extend } from '../../core/utils/extend'; +import { isDxMouseWheelEvent, hasTouches, fireEvent } from '../utils/index'; + +const Emitter = Class.inherit({ + + ctor: function(element) { + this._$element = $(element); + + this._cancelCallback = Callbacks(); + this._acceptCallback = Callbacks(); + }, + + getElement: function() { + return this._$element; + }, + + validate: function(e) { + return !isDxMouseWheelEvent(e); + }, + + validatePointers: function(e) { + return hasTouches(e) === 1; + }, + + allowInterruptionByMouseWheel: function() { + return true; + }, + + configure: function(data) { + extend(this, data); + }, + + addCancelCallback: function(callback) { + this._cancelCallback.add(callback); + }, + + removeCancelCallback: function() { + this._cancelCallback.empty(); + }, + + _cancel: function(e) { + this._cancelCallback.fire(this, e); + }, + + addAcceptCallback: function(callback) { + this._acceptCallback.add(callback); + }, + + removeAcceptCallback: function() { + this._acceptCallback.empty(); + }, + + _accept: function(e) { + this._acceptCallback.fire(this, e); + }, + + _requestAccept: function(e) { + this._acceptRequestEvent = e; + }, + + _forgetAccept: function() { + this._accept(this._acceptRequestEvent); + this._acceptRequestEvent = null; + }, + + start: noop, + move: noop, + end: noop, + + cancel: noop, + reset: function() { + if(this._acceptRequestEvent) { + this._accept(this._acceptRequestEvent); + } + }, + + _fireEvent: function(eventName, e, params) { + const eventData = extend({ + type: eventName, + originalEvent: e, + target: this._getEmitterTarget(e), + delegateTarget: this.getElement().get(0) + }, params); + + e = fireEvent(eventData); + + if(e.cancel) { + this._cancel(e); + } + + return e; + }, + + _getEmitterTarget: function(e) { + return (this.delegateSelector ? $(e.target).closest(this.delegateSelector) : this.getElement()).get(0); + }, + + dispose: noop + +}); + +export default Emitter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..f776a203a523da651c44340581bf91a895f913d7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/emitter_registrator.js @@ -0,0 +1,298 @@ +import $ from '../../core/renderer'; +import readyCallbacks from '../../core/utils/ready_callbacks'; +import domAdapter from '../../core/dom_adapter'; +import eventsEngine from '../../events/core/events_engine'; +import { data as elementData } from '../../core/element_data'; +import Class from '../../core/class'; +import { extend } from '../../core/utils/extend'; +import { inArray } from '../../core/utils/array'; +import { each } from '../../core/utils/iterator'; +import registerEvent from './event_registrator'; +import { addNamespace, isMouseEvent } from '../utils/index'; +import pointerEvents from '../pointer'; +import { name as wheelEventName } from './wheel'; + +const MANAGER_EVENT = 'dxEventManager'; +const EMITTER_DATA = 'dxEmitter'; + +const EventManager = Class.inherit({ + + ctor: function() { + this._attachHandlers(); + this.reset(); + + this._proxiedCancelHandler = this._cancelHandler.bind(this); + this._proxiedAcceptHandler = this._acceptHandler.bind(this); + }, + + _attachHandlers: function() { + readyCallbacks.add(function() { + const document = domAdapter.getDocument(); + eventsEngine.subscribeGlobal(document, addNamespace(pointerEvents.down, MANAGER_EVENT), this._pointerDownHandler.bind(this)); + eventsEngine.subscribeGlobal(document, addNamespace(pointerEvents.move, MANAGER_EVENT), this._pointerMoveHandler.bind(this)); + eventsEngine.subscribeGlobal(document, addNamespace([pointerEvents.up, pointerEvents.cancel].join(' '), MANAGER_EVENT), this._pointerUpHandler.bind(this)); + eventsEngine.subscribeGlobal(document, addNamespace(wheelEventName, MANAGER_EVENT), this._mouseWheelHandler.bind(this)); + }.bind(this)); + }, + + _eachEmitter: function(callback) { + const activeEmitters = this._activeEmitters || []; + let i = 0; + + while(activeEmitters.length > i) { + const emitter = activeEmitters[i]; + if(callback(emitter) === false) { + break; + } + + if(activeEmitters[i] === emitter) { + i++; + } + } + }, + + _applyToEmitters: function(method, arg) { + this._eachEmitter(function(emitter) { + emitter[method].call(emitter, arg); + }); + }, + + reset: function() { + this._eachEmitter(this._proxiedCancelHandler); + this._activeEmitters = []; + }, + + resetEmitter: function(emitter) { + this._proxiedCancelHandler(emitter); + }, + + _pointerDownHandler: function(e) { + if(isMouseEvent(e) && e.which > 1) { + return; + } + + this._updateEmitters(e); + }, + + _updateEmitters: function(e) { + if(!this._isSetChanged(e)) { + return; + } + + this._cleanEmitters(e); + this._fetchEmitters(e); + }, + + _isSetChanged: function(e) { + const currentSet = this._closestEmitter(e); + const previousSet = this._emittersSet || []; + + let setChanged = currentSet.length !== previousSet.length; + + each(currentSet, function(index, emitter) { + setChanged = setChanged || previousSet[index] !== emitter; + return !setChanged; + }); + + this._emittersSet = currentSet; + + return setChanged; + }, + + _closestEmitter: function(e) { + const that = this; + + const result = []; + let $element = $(e.target); + + function handleEmitter(_, emitter) { + if(!!emitter && emitter.validatePointers(e) && emitter.validate(e)) { + emitter.addCancelCallback(that._proxiedCancelHandler); + emitter.addAcceptCallback(that._proxiedAcceptHandler); + result.push(emitter); + } + } + + while($element.length) { + const emitters = elementData($element.get(0), EMITTER_DATA) || []; + each(emitters, handleEmitter); + $element = $element.parent(); + } + + return result; + }, + + _acceptHandler: function(acceptedEmitter, e) { + const that = this; + + this._eachEmitter(function(emitter) { + if(emitter !== acceptedEmitter) { + that._cancelEmitter(emitter, e); + } + }); + }, + + _cancelHandler: function(canceledEmitter, e) { + this._cancelEmitter(canceledEmitter, e); + }, + + _cancelEmitter: function(emitter, e) { + const activeEmitters = this._activeEmitters; + + if(e) { + emitter.cancel(e); + } else { + emitter.reset(); + } + + emitter.removeCancelCallback(); + emitter.removeAcceptCallback(); + + const emitterIndex = inArray(emitter, activeEmitters); + if(emitterIndex > -1) { + activeEmitters.splice(emitterIndex, 1); + } + }, + + _cleanEmitters: function(e) { + this._applyToEmitters('end', e); + this.reset(e); + }, + + _fetchEmitters: function(e) { + this._activeEmitters = this._emittersSet.slice(); + this._applyToEmitters('start', e); + }, + + _pointerMoveHandler: function(e) { + this._applyToEmitters('move', e); + }, + + _pointerUpHandler: function(e) { + this._updateEmitters(e); + }, + + _mouseWheelHandler: function(e) { + if(!this._allowInterruptionByMouseWheel()) { + return; + } + + e.pointers = [null]; + this._pointerDownHandler(e); + + this._adjustWheelEvent(e); + + this._pointerMoveHandler(e); + e.pointers = []; + this._pointerUpHandler(e); + }, + + _allowInterruptionByMouseWheel: function() { + let allowInterruption = true; + this._eachEmitter(function(emitter) { + allowInterruption = emitter.allowInterruptionByMouseWheel() && allowInterruption; + return allowInterruption; + }); + return allowInterruption; + }, + + _adjustWheelEvent: function(e) { + let closestGestureEmitter = null; + + this._eachEmitter(function(emitter) { + if(!(emitter.gesture)) { + return; + } + + const direction = emitter.getDirection(e); + if(direction !== 'horizontal' && !e.shiftKey || direction !== 'vertical' && e.shiftKey) { + closestGestureEmitter = emitter; + return false; + } + }); + + if(!closestGestureEmitter) { + return; + } + + const direction = closestGestureEmitter.getDirection(e); + const verticalGestureDirection = direction === 'both' && !e.shiftKey || direction === 'vertical'; + const prop = verticalGestureDirection ? 'pageY' : 'pageX'; + + e[prop] += e.delta; + }, + + isActive: function(element) { + let result = false; + this._eachEmitter(function(emitter) { + result = result || emitter.getElement().is(element); + }); + return result; + } +}); + +const eventManager = new EventManager(); + +const EMITTER_SUBSCRIPTION_DATA = 'dxEmitterSubscription'; + +const registerEmitter = function(emitterConfig) { + const emitterClass = emitterConfig.emitter; + const emitterName = emitterConfig.events[0]; + const emitterEvents = emitterConfig.events; + + each(emitterEvents, function(_, eventName) { + registerEvent(eventName, { + + noBubble: !emitterConfig.bubble, + + setup: function(element) { + const subscriptions = elementData(element, EMITTER_SUBSCRIPTION_DATA) || {}; + + const emitters = elementData(element, EMITTER_DATA) || {}; + const emitter = emitters[emitterName] || new emitterClass(element); + + subscriptions[eventName] = true; + emitters[emitterName] = emitter; + + elementData(element, EMITTER_DATA, emitters); + elementData(element, EMITTER_SUBSCRIPTION_DATA, subscriptions); + }, + + add: function(element, handleObj) { + const emitters = elementData(element, EMITTER_DATA); + const emitter = emitters[emitterName]; + + emitter.configure(extend({ + delegateSelector: handleObj.selector + }, handleObj.data), handleObj.type); + }, + + teardown: function(element) { + const subscriptions = elementData(element, EMITTER_SUBSCRIPTION_DATA); + + const emitters = elementData(element, EMITTER_DATA); + const emitter = emitters[emitterName]; + + delete subscriptions[eventName]; + + let disposeEmitter = true; + each(emitterEvents, function(_, eventName) { + disposeEmitter = disposeEmitter && !subscriptions[eventName]; + return disposeEmitter; + }); + + if(disposeEmitter) { + if(eventManager.isActive(element)) { + eventManager.resetEmitter(emitter); + } + + emitter && emitter.dispose(); + delete emitters[emitterName]; + } + } + + }); + }); +}; + +export default registerEmitter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..f15717cc15230c14f32e00da8643f0a45931721f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator.js @@ -0,0 +1,35 @@ +import { each } from '../../core/utils/iterator'; +import callbacks from './event_registrator_callbacks'; + +const registerEvent = function(name, eventObject) { + const strategy = {}; + + if('noBubble' in eventObject) { + strategy.noBubble = eventObject.noBubble; + } + + if('bindType' in eventObject) { + strategy.bindType = eventObject.bindType; + } + + if('delegateType' in eventObject) { + strategy.delegateType = eventObject.delegateType; + } + + each(['setup', 'teardown', 'add', 'remove', 'trigger', 'handle', '_default', 'dispose'], function(_, methodName) { + if(!eventObject[methodName]) { + return; + } + + strategy[methodName] = function() { + const args = [].slice.call(arguments); + args.unshift(this); + return eventObject[methodName].apply(eventObject, args); + }; + }); + + callbacks.fire(name, strategy); +}; +registerEvent.callbacks = callbacks; + +export default registerEvent; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator_callbacks.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator_callbacks.js new file mode 100644 index 0000000000000000000000000000000000000000..fc0c626b1575fd7552150afee1a061176129d681 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/event_registrator_callbacks.js @@ -0,0 +1,3 @@ +import MemorizedCallbacks from '../../core/memorized_callbacks'; + +export default new MemorizedCallbacks(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.d.ts b/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..979ff826f9a14a75edfe8ee61fa89c4e5a274c33 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.d.ts @@ -0,0 +1,10 @@ +type EventsEngineType = { + on(element: any, eventName: any, handler: any, options?: any): void; + off(element: any, eventName: any, handler: any): void; + set(eventEngine: any): void; + triggerHandler(element: any, opts: Record): void; +}; + +declare const eventsEngine: EventsEngineType; +export declare function set(eventEngine: any): void; +export default eventsEngine; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.js new file mode 100644 index 0000000000000000000000000000000000000000..1c874b161911b405ad1809560ff9f4bdf04bfd7b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/events_engine.js @@ -0,0 +1,675 @@ +import registerEventCallbacks from './event_registrator_callbacks'; +import { extend } from '../../core/utils/extend'; +import domAdapter from '../../core/dom_adapter'; +import { getWindow, hasWindow } from '../../core/utils/window'; +const window = getWindow(); +import injector from '../../core/utils/dependency_injector'; +import { isWindow, isFunction, isString } from '../../core/utils/type'; +import Callbacks from '../../core/utils/callbacks'; +import errors from '../../core/errors'; +import WeakMap from '../../core/polyfills/weak_map'; +import hookTouchProps from '../../events/core/hook_touch_props'; +import callOnce from '../../core/utils/call_once'; + +const EMPTY_EVENT_NAME = 'dxEmptyEventType'; +const NATIVE_EVENTS_TO_SUBSCRIBE = { + 'mouseenter': 'mouseover', + 'mouseleave': 'mouseout', + 'pointerenter': 'pointerover', + 'pointerleave': 'pointerout' +}; +const NATIVE_EVENTS_TO_TRIGGER = { + 'focusin': 'focus', + 'focusout': 'blur' +}; +const NO_BUBBLE_EVENTS = ['blur', 'focus', 'load']; + +const forcePassiveFalseEventNames = ['touchmove', 'wheel', 'mousewheel', 'touchstart']; + +const EVENT_PROPERTIES = [ + 'target', + 'relatedTarget', + 'delegateTarget', + 'altKey', + 'bubbles', + 'cancelable', + 'changedTouches', + 'ctrlKey', + 'detail', + 'eventPhase', + 'metaKey', + 'shiftKey', + 'view', + 'char', + 'code', + 'charCode', + 'key', + 'keyCode', + 'button', + 'buttons', + 'offsetX', + 'offsetY', + 'pointerId', + 'pointerType', + 'targetTouches', + 'toElement', + 'touches' +]; + +function matchesSafe(target, selector) { + return !isWindow(target) && target.nodeName !== '#document' && domAdapter.elementMatches(target, selector); +} +const elementDataMap = new WeakMap(); +let guid = 0; +let skipEvent; + +const special = (function() { + const specialData = {}; + + registerEventCallbacks.add(function(eventName, eventObject) { + specialData[eventName] = eventObject; + }); + + return { + getField: function(eventName, field) { + return specialData[eventName] && specialData[eventName][field]; + }, + callMethod: function(eventName, methodName, context, args) { + return specialData[eventName] && specialData[eventName][methodName] && specialData[eventName][methodName].apply(context, args); + } + }; +}()); + +const eventsEngine = injector({ + on: getHandler(normalizeOnArguments(iterate(function(element, eventName, selector, data, handler) { + const handlersController = getHandlersController(element, eventName); + handlersController.addHandler(handler, selector, data); + }))), + + one: getHandler(normalizeOnArguments(function(element, eventName, selector, data, handler) { + const oneTimeHandler = function() { + eventsEngine.off(element, eventName, selector, oneTimeHandler); + handler.apply(this, arguments); + }; + + eventsEngine.on(element, eventName, selector, data, oneTimeHandler); + })), + + off: getHandler(normalizeOffArguments(iterate(function(element, eventName, selector, handler) { + const handlersController = getHandlersController(element, eventName); + handlersController.removeHandler(handler, selector); + }))), + + trigger: getHandler(normalizeTriggerArguments(function(element, event, extraParameters) { + const eventName = event.type; + const handlersController = getHandlersController(element, event.type); + + special.callMethod(eventName, 'trigger', element, [ event, extraParameters ]); + handlersController.callHandlers(event, extraParameters); + + const noBubble = special.getField(eventName, 'noBubble') + || event.isPropagationStopped() + || NO_BUBBLE_EVENTS.indexOf(eventName) !== -1; + + if(!noBubble) { + const parents = []; + const getParents = function(element) { + const parent = element.parentNode; + if(parent) { + parents.push(parent); + getParents(parent); + } + }; + getParents(element); + parents.push(window); + + let i = 0; + + while(parents[i] && !event.isPropagationStopped()) { + const parentDataByEvent = getHandlersController(parents[i], event.type); + parentDataByEvent.callHandlers(extend(event, { currentTarget: parents[i] }), extraParameters); + i++; + } + } + + if(element.nodeType || isWindow(element)) { + special.callMethod(eventName, '_default', element, [ event, extraParameters ]); + callNativeMethod(eventName, element); + } + })), + + triggerHandler: getHandler(normalizeTriggerArguments(function(element, event, extraParameters) { + const handlersController = getHandlersController(element, event.type); + handlersController.callHandlers(event, extraParameters); + })) +}); + +function applyForEach(args, method) { + const element = args[0]; + + if(!element) { + return; + } + + if(domAdapter.isNode(element) || isWindow(element)) { + method.apply(eventsEngine, args); + } else if(!isString(element) && 'length' in element) { + const itemArgs = Array.prototype.slice.call(args, 0); + + Array.prototype.forEach.call(element, function(itemElement) { + itemArgs[0] = itemElement; + applyForEach(itemArgs, method); + }); + } else { + throw errors.Error('E0025'); + } +} + +function getHandler(method) { + return function() { + applyForEach(arguments, method); + }; +} + +function detectPassiveEventHandlersSupport() { + let isSupported = false; + + try { + const options = Object.defineProperty({ }, 'passive', { + get: function() { + isSupported = true; + return true; + } + }); + + window.addEventListener('test', null, options); + } catch(e) { } + + return isSupported; +} + +const passiveEventHandlersSupported = callOnce(detectPassiveEventHandlersSupport); + +const contains = (container, element) => { + if(isWindow(container)) { + return contains(container.document, element); + } + + return container.contains + ? container.contains(element) + : !!(element.compareDocumentPosition(container) & element.DOCUMENT_POSITION_CONTAINS); +}; + +function getHandlersController(element, eventName) { + let elementData = elementDataMap.get(element); + + eventName = eventName || ''; + + const eventNameParts = eventName.split('.'); + const namespaces = eventNameParts.slice(1); + const eventNameIsDefined = !!eventNameParts[0]; + + eventName = eventNameParts[0] || EMPTY_EVENT_NAME; + + if(!elementData) { + elementData = {}; + elementDataMap.set(element, elementData); + } + + if(!elementData[eventName]) { + elementData[eventName] = { + handleObjects: [], + nativeHandler: null + }; + } + + const eventData = elementData[eventName]; + + return { + addHandler: function(handler, selector, data) { + const callHandler = function(e, extraParameters) { + const handlerArgs = [e]; + const target = e.currentTarget; + const relatedTarget = e.relatedTarget; + let secondaryTargetIsInside; + let result; + + if(eventName in NATIVE_EVENTS_TO_SUBSCRIBE) { + secondaryTargetIsInside = relatedTarget && target && (relatedTarget === target || contains(target, relatedTarget)); + } + + if(extraParameters !== undefined) { + handlerArgs.push(extraParameters); + } + + special.callMethod(eventName, 'handle', element, [ e, data ]); + + if(!secondaryTargetIsInside) { + result = handler.apply(target, handlerArgs); + } + + if(result === false) { + e.preventDefault(); + e.stopPropagation(); + } + }; + + const wrappedHandler = function(e, extraParameters) { + if(skipEvent && e.type === skipEvent) { + return; + } + + e.data = data; + e.delegateTarget = element; + + if(selector) { + let currentTarget = e.target; + + while(currentTarget && currentTarget !== element) { + if(matchesSafe(currentTarget, selector)) { + e.currentTarget = currentTarget; + callHandler(e, extraParameters); + } + currentTarget = currentTarget.parentNode; + } + } else { + e.currentTarget = e.delegateTarget || e.target; + callHandler(e, extraParameters); + } + }; + + const handleObject = { + handler: handler, + wrappedHandler: wrappedHandler, + selector: selector, + type: eventName, + data: data, + namespace: namespaces.join('.'), + namespaces: namespaces, + guid: ++guid + }; + + eventData.handleObjects.push(handleObject); + + const firstHandlerForTheType = eventData.handleObjects.length === 1; + let shouldAddNativeListener = firstHandlerForTheType && eventNameIsDefined; + let nativeListenerOptions; + + if(shouldAddNativeListener) { + shouldAddNativeListener = !special.callMethod(eventName, 'setup', element, [ data, namespaces, handler ]); + } + + if(shouldAddNativeListener) { + eventData.nativeHandler = getNativeHandler(eventName); + + if(passiveEventHandlersSupported() && forcePassiveFalseEventNames.indexOf(eventName) > -1) { + nativeListenerOptions = { + passive: false + }; + } + + eventData.removeListener = domAdapter.listen(element, NATIVE_EVENTS_TO_SUBSCRIBE[eventName] || eventName, eventData.nativeHandler, nativeListenerOptions); + } + + special.callMethod(eventName, 'add', element, [ handleObject ]); + }, + + removeHandler: function(handler, selector) { + const removeByEventName = function(eventName) { + const eventData = elementData[eventName]; + + if(!eventData.handleObjects.length) { + delete elementData[eventName]; + return; + } + let removedHandler; + + eventData.handleObjects = eventData.handleObjects.filter(function(handleObject) { + const skip = namespaces.length && !isSubset(handleObject.namespaces, namespaces) + || handler && handleObject.handler !== handler + || selector && handleObject.selector !== selector; + + if(!skip) { + removedHandler = handleObject.handler; + special.callMethod(eventName, 'remove', element, [ handleObject ]); + } + + return skip; + }); + + const lastHandlerForTheType = !eventData.handleObjects.length; + const shouldRemoveNativeListener = lastHandlerForTheType && eventName !== EMPTY_EVENT_NAME; + + if(shouldRemoveNativeListener) { + special.callMethod(eventName, 'teardown', element, [ namespaces, removedHandler ]); + if(eventData.nativeHandler) { + eventData.removeListener(); + } + delete elementData[eventName]; + } + }; + + if(eventNameIsDefined) { + removeByEventName(eventName); + } else { + for(const name in elementData) { + removeByEventName(name); + } + } + + const elementDataIsEmpty = Object.keys(elementData).length === 0; + + if(elementDataIsEmpty) { + elementDataMap.delete(element); + } + }, + + callHandlers: function(event, extraParameters) { + let forceStop = false; + + const handleCallback = function(handleObject) { + if(forceStop) { + return; + } + + if(!namespaces.length || isSubset(handleObject.namespaces, namespaces)) { + handleObject.wrappedHandler(event, extraParameters); + forceStop = event.isImmediatePropagationStopped(); + } + }; + + eventData.handleObjects.forEach(handleCallback); + if(namespaces.length && elementData[EMPTY_EVENT_NAME]) { + elementData[EMPTY_EVENT_NAME].handleObjects.forEach(handleCallback); + } + } + }; +} + +function getNativeHandler(subscribeName) { + return function(event, extraParameters) { + const handlersController = getHandlersController(this, subscribeName); + event = eventsEngine.Event(event); + handlersController.callHandlers(event, extraParameters); + }; +} + +function isSubset(original, checked) { + for(let i = 0; i < checked.length; i++) { + if(original.indexOf(checked[i]) < 0) return false; + } + return true; +} + +function normalizeOnArguments(callback) { + return function(element, eventName, selector, data, handler) { + if(!handler) { + handler = data; + data = undefined; + } + if(typeof selector !== 'string') { + data = selector; + selector = undefined; + } + + if(!handler && typeof eventName === 'string') { + handler = data || selector; + selector = undefined; + data = undefined; + } + + callback(element, eventName, selector, data, handler); + }; +} + +function normalizeOffArguments(callback) { + return function(element, eventName, selector, handler) { + if(typeof selector === 'function') { + handler = selector; + selector = undefined; + } + + callback(element, eventName, selector, handler); + }; +} + +function normalizeTriggerArguments(callback) { + return function(element, src, extraParameters) { + if(typeof src === 'string') { + src = { + type: src + }; + } + + if(!src.target) { + src.target = element; + } + + src.currentTarget = element; + + if(!src.delegateTarget) { + src.delegateTarget = element; + } + + if(!src.type && src.originalEvent) { + src.type = src.originalEvent.type; + } + + callback(element, (src instanceof eventsEngine.Event) ? src : eventsEngine.Event(src), extraParameters); + }; +} + +function normalizeEventArguments(callback) { + eventsEngine.Event = function(src, config) { + if(!(this instanceof eventsEngine.Event)) { + return new eventsEngine.Event(src, config); + } + + if(!src) { + src = {}; + } + + if(typeof src === 'string') { + src = { + type: src + }; + } + + if(!config) { + config = {}; + } + + callback.call(this, src, config); + }; + Object.assign(eventsEngine.Event.prototype, { + _propagationStopped: false, + _immediatePropagationStopped: false, + _defaultPrevented: false, + isPropagationStopped: function() { + return !!(this._propagationStopped || this.originalEvent && this.originalEvent.propagationStopped); + }, + stopPropagation: function() { + this._propagationStopped = true; + this.originalEvent && this.originalEvent.stopPropagation(); + }, + isImmediatePropagationStopped: function() { + return this._immediatePropagationStopped; + }, + stopImmediatePropagation: function() { + this.stopPropagation(); + this._immediatePropagationStopped = true; + this.originalEvent && this.originalEvent.stopImmediatePropagation(); + }, + isDefaultPrevented: function() { + return !!(this._defaultPrevented || this.originalEvent && this.originalEvent.defaultPrevented); + }, + preventDefault: function() { + this._defaultPrevented = true; + this.originalEvent && this.originalEvent.preventDefault(); + } + + }); + return eventsEngine.Event; +} + +function iterate(callback) { + const iterateEventNames = function(element, eventName) { + if(eventName && eventName.indexOf(' ') > -1) { + const args = Array.prototype.slice.call(arguments, 0); + eventName.split(' ').forEach(function(eventName) { + args[1] = eventName; + callback.apply(this, args); + }); + } else { + callback.apply(this, arguments); + } + }; + + return function(element, eventName) { + if(typeof eventName === 'object') { + const args = Array.prototype.slice.call(arguments, 0); + + for(const name in eventName) { + args[1] = name; + args[args.length - 1] = eventName[name]; + iterateEventNames.apply(this, args); + } + } else { + iterateEventNames.apply(this, arguments); + } + }; +} + +function callNativeMethod(eventName, element) { + const nativeMethodName = NATIVE_EVENTS_TO_TRIGGER[eventName] || eventName; + + const isLinkClickEvent = function(eventName, element) { + return eventName === 'click' && element.localName === 'a'; + }; + + if(isLinkClickEvent(eventName, element)) return; + + if(isFunction(element[nativeMethodName])) { + skipEvent = eventName; + element[nativeMethodName](); + skipEvent = undefined; + } +} + +function calculateWhich(event) { + const setForMouseEvent = function(event) { + const mouseEventRegex = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + return !event.which && event.button !== undefined && mouseEventRegex.test(event.type); + }; + + const setForKeyEvent = function(event) { + return event.which == null && event.type.indexOf('key') === 0; + }; + + if(setForKeyEvent(event)) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + if(setForMouseEvent(event)) { + const whichByButton = { 1: 1, 2: 3, 3: 1, 4: 2 }; + return whichByButton[event.button]; + } + + return event.which; +} + +function initEvent(EventClass) { + if(EventClass) { + eventsEngine.Event = EventClass; + eventsEngine.Event.prototype = EventClass.prototype; + } +} + +initEvent(normalizeEventArguments(function(src, config) { + const that = this; + const srcIsEvent = src instanceof eventsEngine.Event + || (hasWindow() && src instanceof window.Event) + || (src.view?.Event && src instanceof src.view.Event); + + if(srcIsEvent) { + that.originalEvent = src; + that.type = src.type; + that.currentTarget = undefined; + that.timeStamp = src.timeStamp || Date.now(); + } else { + Object.assign(that, src); + } + + addProperty('which', calculateWhich, that); + + if(src.type.indexOf('touch') === 0) { + delete config.pageX; + delete config.pageY; + } + + Object.assign(that, config); + + that.guid = ++guid; +})); + +function addProperty(propName, hook, eventInstance) { + Object.defineProperty(eventInstance || eventsEngine.Event.prototype, propName, { + enumerable: true, + configurable: true, + + get: function() { + return this.originalEvent && hook(this.originalEvent); + }, + + set: function(value) { + Object.defineProperty(this, propName, { + enumerable: true, + configurable: true, + writable: true, + value: value + }); + } + }); +} + +EVENT_PROPERTIES.forEach(prop => addProperty(prop, (event) => (event[prop]))); +hookTouchProps(addProperty); + +const beforeSetStrategy = Callbacks(); +const afterSetStrategy = Callbacks(); + +eventsEngine.set = function(engine) { + beforeSetStrategy.fire(); + eventsEngine.inject(engine); + initEvent(engine.Event); + afterSetStrategy.fire(); +}; + +eventsEngine.subscribeGlobal = function() { + applyForEach(arguments, normalizeOnArguments(function() { + const args = arguments; + + eventsEngine.on.apply(this, args); + + beforeSetStrategy.add(function() { + const offArgs = Array.prototype.slice.call(args, 0); + offArgs.splice(3, 1); + eventsEngine.off.apply(this, offArgs); + }); + + afterSetStrategy.add(function() { + eventsEngine.on.apply(this, args); + }); + })); +}; + +eventsEngine.forcePassiveFalseEventNames = forcePassiveFalseEventNames; +eventsEngine.passiveEventHandlersSupported = passiveEventHandlersSupported; + +///#DEBUG +eventsEngine.elementDataMap = elementDataMap; +eventsEngine.detectPassiveEventHandlersSupport = detectPassiveEventHandlersSupport; + +///#ENDDEBUG + +export default eventsEngine; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/hook_touch_props.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/hook_touch_props.js new file mode 100644 index 0000000000000000000000000000000000000000..fec9f76a8e757b191064d90597e3663872a186a9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/hook_touch_props.js @@ -0,0 +1,21 @@ +const touchPropsToHook = ['pageX', 'pageY', 'screenX', 'screenY', 'clientX', 'clientY']; +const touchPropHook = function(name, event) { + if(event[name] && !event.touches || !event.touches) { + return event[name]; + } + + const touches = event.touches.length ? event.touches : event.changedTouches; + if(!touches.length) { + return; + } + + return touches[0][name]; +}; + +export default function(callback) { + touchPropsToHook.forEach(function(name) { + callback(name, function(event) { + return touchPropHook(name, event); + }); + }, this); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/keyboard_processor.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/keyboard_processor.js new file mode 100644 index 0000000000000000000000000000000000000000..9ec7f767fc56ad225498c93ba8db45d7d27a883f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/keyboard_processor.js @@ -0,0 +1,82 @@ +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +import Class from '../../core/class'; +import { inArray } from '../../core/utils/array'; +import { addNamespace, normalizeKeyName } from '../../events/utils/index'; + +const COMPOSITION_START_EVENT = 'compositionstart'; +const COMPOSITION_END_EVENT = 'compositionend'; +const KEYDOWN_EVENT = 'keydown'; +const NAMESPACE = 'KeyboardProcessor'; + +const createKeyDownOptions = (e) => { + return { + keyName: normalizeKeyName(e), + key: e.key, + code: e.code, + ctrl: e.ctrlKey, + location: e.location, + metaKey: e.metaKey, + shift: e.shiftKey, + alt: e.altKey, + which: e.which, + originalEvent: e + }; +}; + +const KeyboardProcessor = Class.inherit({ + _keydown: addNamespace(KEYDOWN_EVENT, NAMESPACE), + _compositionStart: addNamespace(COMPOSITION_START_EVENT, NAMESPACE), + _compositionEnd: addNamespace(COMPOSITION_END_EVENT, NAMESPACE), + + ctor: function(options) { + options = options || {}; + if(options.element) { + this._element = $(options.element); + } + if(options.focusTarget) { + this._focusTarget = options.focusTarget; + } + this._handler = options.handler; + + if(this._element) { + this._processFunction = (e) => { + const isNotFocusTarget = this._focusTarget && this._focusTarget !== e.target && inArray(e.target, $(this._focusTarget)) < 0; + const shouldSkipProcessing = this._isComposingJustFinished && e.which === 229 || this._isComposing || isNotFocusTarget; + + this._isComposingJustFinished = false; + if(!shouldSkipProcessing) { + this.process(e); + } + }; + this._toggleProcessingWithContext = this.toggleProcessing.bind(this); + + eventsEngine.on(this._element, this._keydown, this._processFunction); + eventsEngine.on(this._element, this._compositionStart, this._toggleProcessingWithContext); + eventsEngine.on(this._element, this._compositionEnd, this._toggleProcessingWithContext); + } + }, + + dispose: function() { + if(this._element) { + eventsEngine.off(this._element, this._keydown, this._processFunction); + eventsEngine.off(this._element, this._compositionStart, this._toggleProcessingWithContext); + eventsEngine.off(this._element, this._compositionEnd, this._toggleProcessingWithContext); + } + this._element = undefined; + this._handler = undefined; + }, + + process: function(e) { + this._handler(createKeyDownOptions(e)); + }, + + toggleProcessing: function({ type }) { + this._isComposing = type === COMPOSITION_START_EVENT; + this._isComposingJustFinished = !this._isComposing; + } +}); + +KeyboardProcessor.createKeyDownOptions = createKeyDownOptions; + +export default KeyboardProcessor; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/core/wheel.js b/packages/f-theme-editor/farris-theme-editor/js/events/core/wheel.js new file mode 100644 index 0000000000000000000000000000000000000000..4e99c61d5b6dba852cad8197d3852a5dbc8f5519 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/core/wheel.js @@ -0,0 +1,54 @@ +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +import registerEvent from './event_registrator'; +import { addNamespace, fireEvent } from '../utils/index'; + + +const EVENT_NAME = 'dxmousewheel'; +const EVENT_NAMESPACE = 'dxWheel'; +const NATIVE_EVENT_NAME = 'wheel'; + +const PIXEL_MODE = 0; +const DELTA_MUTLIPLIER = 30; + +const wheel = { + setup: function(element) { + const $element = $(element); + eventsEngine.on($element, addNamespace(NATIVE_EVENT_NAME, EVENT_NAMESPACE), wheel._wheelHandler.bind(wheel)); + }, + + teardown: function(element) { + eventsEngine.off(element, `.${EVENT_NAMESPACE}`); + }, + + _wheelHandler: function(e) { + const { deltaMode, deltaY, deltaX, deltaZ } = e.originalEvent; + + fireEvent({ + type: EVENT_NAME, + originalEvent: e, + delta: this._normalizeDelta(deltaY, deltaMode), + deltaX, + deltaY, + deltaZ, + deltaMode, + pointerType: 'mouse' + }); + + e.stopPropagation(); + }, + + _normalizeDelta(delta, deltaMode = PIXEL_MODE) { + if(deltaMode === PIXEL_MODE) { + return -delta; + } else { + // Use multiplier to get rough delta value in px for the LINE or PAGE mode + // https://bugzilla.mozilla.org/show_bug.cgi?id=1392460 + return -DELTA_MUTLIPLIER * delta; + } + } +}; + +registerEvent(EVENT_NAME, wheel); + +export { EVENT_NAME as name }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/dblclick.js b/packages/f-theme-editor/farris-theme-editor/js/events/dblclick.js new file mode 100644 index 0000000000000000000000000000000000000000..756e4fe2e74cd8b6547a4c5ead11c738b6e2cf3f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/dblclick.js @@ -0,0 +1,11 @@ +/** + * @name UI Events.dxdblclick + * @type eventType + * @type_function_param1 event:event + * @module events/dblclick +*/ + +// NOTE: The "double_click" module created to overcome adblock issue https://isc.devexpress.com/Thread/WorkplaceDetails/T465804. This file was kept as a fasade not to create a BC. +import * as dblclick from './double_click'; + +export default dblclick; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/double_click.js b/packages/f-theme-editor/farris-theme-editor/js/events/double_click.js new file mode 100644 index 0000000000000000000000000000000000000000..9f790589ce820d4ce1dfc29d859b160de487ffcc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/double_click.js @@ -0,0 +1,70 @@ +import eventsEngine from '../events/core/events_engine'; +import { closestCommonParent } from '../core/utils/dom'; +import domAdapter from '../core/dom_adapter'; +import Class from '../core/class'; +import registerEvent from './core/event_registrator'; +import { name as clickEventName } from './click'; +import { addNamespace, fireEvent } from './utils/index'; + +const DBLCLICK_EVENT_NAME = 'dxdblclick'; +const DBLCLICK_NAMESPACE = 'dxDblClick'; +const NAMESPACED_CLICK_EVENT = addNamespace(clickEventName, DBLCLICK_NAMESPACE); + +const DBLCLICK_TIMEOUT = 300; + + +const DblClick = Class.inherit({ + + ctor: function() { + this._handlerCount = 0; + this._forgetLastClick(); + }, + + _forgetLastClick: function() { + this._firstClickTarget = null; + this._lastClickTimeStamp = -DBLCLICK_TIMEOUT; + }, + + add: function() { + if(this._handlerCount <= 0) { + eventsEngine.on(domAdapter.getDocument(), NAMESPACED_CLICK_EVENT, this._clickHandler.bind(this)); + } + this._handlerCount++; + }, + + _clickHandler: function(e) { + const timeStamp = e.timeStamp || Date.now(); + const timeBetweenClicks = timeStamp - this._lastClickTimeStamp; + // NOTE: jQuery sets `timeStamp = Date.now()` for the triggered events, but + // in the real event timeStamp is the number of milliseconds elapsed from the + // beginning of the current document's lifetime till the event was created + // (https://developer.mozilla.org/en-US/docs/Web/API/Event/timeStamp). + const isSimulated = timeBetweenClicks < 0; + const isDouble = !isSimulated && timeBetweenClicks < DBLCLICK_TIMEOUT; + + if(isDouble) { + fireEvent({ + type: DBLCLICK_EVENT_NAME, + target: closestCommonParent(this._firstClickTarget, e.target), + originalEvent: e + }); + this._forgetLastClick(); + } else { + this._firstClickTarget = e.target; + this._lastClickTimeStamp = timeStamp; + } + }, + + remove: function() { + this._handlerCount--; + if(this._handlerCount <= 0) { + this._forgetLastClick(); + eventsEngine.off(domAdapter.getDocument(), NAMESPACED_CLICK_EVENT); + } + } + +}); + +registerEvent(DBLCLICK_EVENT_NAME, new DblClick()); + +export { DBLCLICK_EVENT_NAME as name }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/drag.js b/packages/f-theme-editor/farris-theme-editor/js/events/drag.js new file mode 100644 index 0000000000000000000000000000000000000000..6e1f83a0d9370ca5510aee3afdc550f10a6c26f7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/drag.js @@ -0,0 +1,357 @@ +import $ from '../core/renderer'; +import { data as elementData, removeData } from '../core/element_data'; +import { wrapToArray, inArray } from '../core/utils/array'; +import * as iteratorUtils from '../core/utils/iterator'; +import { contains } from '../core/utils/dom'; +import registerEvent from './core/event_registrator'; +import { eventData as eData, fireEvent } from './utils/index'; +import GestureEmitter from './gesture/emitter.gesture'; +import registerEmitter from './core/emitter_registrator'; + + +const DRAG_START_EVENT = 'dxdragstart'; +const DRAG_EVENT = 'dxdrag'; +const DRAG_END_EVENT = 'dxdragend'; + +const DRAG_ENTER_EVENT = 'dxdragenter'; +const DRAG_LEAVE_EVENT = 'dxdragleave'; +const DROP_EVENT = 'dxdrop'; + +const DX_DRAG_EVENTS_COUNT_KEY = 'dxDragEventsCount'; + + +const knownDropTargets = []; +const knownDropTargetSelectors = []; +const knownDropTargetConfigs = []; + +const dropTargetRegistration = { + + setup: function(element, data) { + const knownDropTarget = inArray(element, knownDropTargets) !== -1; + if(!knownDropTarget) { + knownDropTargets.push(element); + knownDropTargetSelectors.push([]); + knownDropTargetConfigs.push(data || {}); + } + }, + + add: function(element, handleObj) { + const index = inArray(element, knownDropTargets); + this.updateEventsCounter(element, handleObj.type, 1); + + const selector = handleObj.selector; + if(inArray(selector, knownDropTargetSelectors[index]) === -1) { + knownDropTargetSelectors[index].push(selector); + } + }, + + updateEventsCounter: function(element, event, value) { + if([DRAG_ENTER_EVENT, DRAG_LEAVE_EVENT, DROP_EVENT].indexOf(event) > -1) { + const eventsCount = elementData(element, DX_DRAG_EVENTS_COUNT_KEY) || 0; + elementData(element, DX_DRAG_EVENTS_COUNT_KEY, Math.max(0, eventsCount + value)); + } + }, + + remove: function(element, handleObj) { + this.updateEventsCounter(element, handleObj.type, -1); + }, + + teardown: function(element) { + const handlersCount = elementData(element, DX_DRAG_EVENTS_COUNT_KEY); + if(!handlersCount) { + const index = inArray(element, knownDropTargets); + knownDropTargets.splice(index, 1); + knownDropTargetSelectors.splice(index, 1); + knownDropTargetConfigs.splice(index, 1); + removeData(element, DX_DRAG_EVENTS_COUNT_KEY); + } + } + +}; + +/** +* @name UI Events.dxdragenter +* @type eventType +* @type_function_param1 event:event +* @type_function_param1_field1 draggingElement:Element +* @module events/drag +*/ +/** +* @name UI Events.dxdrop +* @type eventType +* @type_function_param1 event:event +* @type_function_param1_field1 draggingElement:Element +* @module events/drag +*/ +/** +* @name UI Events.dxdragleave +* @type eventType +* @type_function_param1 event:event +* @type_function_param1_field1 draggingElement:Element +* @module events/drag +*/ + +registerEvent(DRAG_ENTER_EVENT, dropTargetRegistration); +registerEvent(DRAG_LEAVE_EVENT, dropTargetRegistration); +registerEvent(DROP_EVENT, dropTargetRegistration); + +const getItemDelegatedTargets = function($element) { + const dropTargetIndex = inArray($element.get(0), knownDropTargets); + const dropTargetSelectors = knownDropTargetSelectors[dropTargetIndex].filter((selector) => selector); + + let $delegatedTargets = $element.find(dropTargetSelectors.join(', ')); + if(inArray(undefined, knownDropTargetSelectors[dropTargetIndex]) !== -1) { + $delegatedTargets = $delegatedTargets.add($element); + } + return $delegatedTargets; +}; + +const getItemConfig = function($element) { + const dropTargetIndex = inArray($element.get(0), knownDropTargets); + return knownDropTargetConfigs[dropTargetIndex]; +}; + +const getItemPosition = function(dropTargetConfig, $element) { + if(dropTargetConfig.itemPositionFunc) { + return dropTargetConfig.itemPositionFunc($element); + } else { + return $element.offset(); + } +}; + +const getItemSize = function(dropTargetConfig, $element) { + if(dropTargetConfig.itemSizeFunc) { + return dropTargetConfig.itemSizeFunc($element); + } + + return { + width: $element.get(0).getBoundingClientRect().width, + height: $element.get(0).getBoundingClientRect().height + }; +}; + +const DragEmitter = GestureEmitter.inherit({ + + ctor: function(element) { + this.callBase(element); + + this.direction = 'both'; + }, + + _init: function(e) { + this._initEvent = e; + }, + + _start: function(e) { + e = this._fireEvent(DRAG_START_EVENT, this._initEvent); + + this._maxLeftOffset = e.maxLeftOffset; + this._maxRightOffset = e.maxRightOffset; + this._maxTopOffset = e.maxTopOffset; + this._maxBottomOffset = e.maxBottomOffset; + + const dropTargets = wrapToArray(e.targetElements || (e.targetElements === null ? [] : knownDropTargets)); + this._dropTargets = iteratorUtils.map(dropTargets, function(element) { return $(element).get(0); }); + }, + + _move: function(e) { + const eventData = eData(e); + const dragOffset = this._calculateOffset(eventData); + + e = this._fireEvent(DRAG_EVENT, e, { + offset: dragOffset + }); + + this._processDropTargets(e); + + if(!e._cancelPreventDefault) { + e.preventDefault(); + } + }, + + _calculateOffset: function(eventData) { + return { + x: this._calculateXOffset(eventData), + y: this._calculateYOffset(eventData) + }; + }, + + _calculateXOffset: function(eventData) { + if(this.direction !== 'vertical') { + const offset = eventData.x - this._startEventData.x; + + return this._fitOffset(offset, this._maxLeftOffset, this._maxRightOffset); + } + return 0; + }, + + _calculateYOffset: function(eventData) { + if(this.direction !== 'horizontal') { + const offset = eventData.y - this._startEventData.y; + + return this._fitOffset(offset, this._maxTopOffset, this._maxBottomOffset); + } + return 0; + }, + + _fitOffset: function(offset, minOffset, maxOffset) { + if(minOffset != null) { + offset = Math.max(offset, -minOffset); + } + if(maxOffset != null) { + offset = Math.min(offset, maxOffset); + } + + return offset; + }, + + _processDropTargets: function(e) { + const target = this._findDropTarget(e); + const sameTarget = target === this._currentDropTarget; + + if(!sameTarget) { + this._fireDropTargetEvent(e, DRAG_LEAVE_EVENT); + this._currentDropTarget = target; + this._fireDropTargetEvent(e, DRAG_ENTER_EVENT); + } + }, + + _fireDropTargetEvent: function(event, eventName) { + if(!this._currentDropTarget) { + return; + } + + const eventData = { + type: eventName, + originalEvent: event, + draggingElement: this._$element.get(0), + target: this._currentDropTarget + }; + + fireEvent(eventData); + }, + + _findDropTarget: function(e) { + const that = this; + let result; + + iteratorUtils.each(knownDropTargets, function(_, target) { + if(!that._checkDropTargetActive(target)) { + return; + } + + const $target = $(target); + iteratorUtils.each(getItemDelegatedTargets($target), function(_, delegatedTarget) { + const $delegatedTarget = $(delegatedTarget); + if(that._checkDropTarget(getItemConfig($target), $delegatedTarget, $(result), e)) { + result = delegatedTarget; + } + }); + }); + + return result; + }, + + _checkDropTargetActive: function(target) { + let active = false; + + iteratorUtils.each(this._dropTargets, function(_, activeTarget) { + active = active || activeTarget === target || contains(activeTarget, target); + return !active; + }); + + return active; + }, + + _checkDropTarget: function(config, $target, $prevTarget, e) { + const isDraggingElement = $target.get(0) === $(e.target).get(0); + if(isDraggingElement) { + return false; + } + + const targetPosition = getItemPosition(config, $target); + if(e.pageX < targetPosition.left) { + return false; + } + if(e.pageY < targetPosition.top) { + return false; + } + + const targetSize = getItemSize(config, $target); + if(e.pageX > targetPosition.left + targetSize.width) { + return false; + } + if(e.pageY > targetPosition.top + targetSize.height) { + return false; + } + + if($prevTarget.length && $prevTarget.closest($target).length) { + return false; + } + + if(config.checkDropTarget && !config.checkDropTarget($target, e)) { + return false; + } + + return $target; + }, + + _end: function(e) { + const eventData = eData(e); + + this._fireEvent(DRAG_END_EVENT, e, { + offset: this._calculateOffset(eventData) + }); + + this._fireDropTargetEvent(e, DROP_EVENT); + delete this._currentDropTarget; + } + +}); + +/** + * @name UI Events.dxdragstart + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 cancel:boolean + * @module events/drag +*/ +/** + * @name UI Events.dxdrag + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 offset:number + * @type_function_param1_field2 cancel:boolean + * @module events/drag +*/ +/** + * @name UI Events.dxdragend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 offset:number + * @type_function_param1_field2 cancel:boolean + * @module events/drag +*/ + +registerEmitter({ + emitter: DragEmitter, + events: [ + DRAG_START_EVENT, + DRAG_EVENT, + DRAG_END_EVENT + ] +}); + + +///#DEBUG +export { knownDropTargets as dropTargets }; +///#ENDDEBUG + +export { + DRAG_EVENT as move, + DRAG_START_EVENT as start, + DRAG_END_EVENT as end, + DRAG_ENTER_EVENT as enter, + DRAG_LEAVE_EVENT as leave, + DROP_EVENT as drop +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.js b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.js new file mode 100644 index 0000000000000000000000000000000000000000..2c2a9da5e5885071d3b858cbffb5edaec9598fa7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.js @@ -0,0 +1,231 @@ +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +import devices from '../../core/devices'; +import { styleProp } from '../../core/utils/style'; +import callOnce from '../../core/utils/call_once'; +import { resetActiveElement, clearSelection } from '../../core/utils/dom'; +import readyCallbacks from '../../core/utils/ready_callbacks'; +const ready = readyCallbacks.add; +import { sign } from '../../core/utils/math'; +import { noop } from '../../core/utils/common'; +import { isDefined } from '../../core/utils/type'; +import { needSkipEvent, createEvent, eventData, isDxMouseWheelEvent, eventDelta, isTouchEvent } from '../utils/index'; +import Emitter from '../core/emitter'; +const abs = Math.abs; + +const SLEEP = 0; +const INITED = 1; +const STARTED = 2; + +let TOUCH_BOUNDARY = 10; +const IMMEDIATE_TOUCH_BOUNDARY = 0; +const IMMEDIATE_TIMEOUT = 180; + +const supportPointerEvents = function() { + return styleProp('pointer-events'); +}; + +const setGestureCover = callOnce(function() { + const GESTURE_COVER_CLASS = 'dx-gesture-cover'; + + const isDesktop = devices.real().deviceType === 'desktop'; + + if(!supportPointerEvents() || !isDesktop) { + return noop; + } + + const $cover = $('
') + .addClass(GESTURE_COVER_CLASS) + .css('pointerEvents', 'none'); + + eventsEngine.subscribeGlobal($cover, 'dxmousewheel', function(e) { + e.preventDefault(); + }); + + ready(function() { + $cover.appendTo('body'); + }); + + return function(toggle, cursor) { + $cover.css('pointerEvents', toggle ? 'all' : 'none'); + toggle && $cover.css('cursor', cursor); + }; +}); + +const gestureCover = function(toggle, cursor) { + const gestureCoverStrategy = setGestureCover(); + gestureCoverStrategy(toggle, cursor); +}; + +const GestureEmitter = Emitter.inherit({ + + gesture: true, + + configure: function(data) { + this.getElement().css('msTouchAction', data.immediate ? 'pinch-zoom' : ''); + + this.callBase(data); + }, + + allowInterruptionByMouseWheel: function() { + return this._stage !== STARTED; + }, + + getDirection: function() { + return this.direction; + }, + + _cancel: function() { + this.callBase.apply(this, arguments); + + this._toggleGestureCover(false); + this._stage = SLEEP; + }, + + start: function(e) { + if(e._needSkipEvent || needSkipEvent(e)) { + this._cancel(e); + return; + } + + this._startEvent = createEvent(e); + this._startEventData = eventData(e); + + this._stage = INITED; + this._init(e); + + this._setupImmediateTimer(); + }, + + _setupImmediateTimer: function() { + clearTimeout(this._immediateTimer); + this._immediateAccepted = false; + + if(!this.immediate) { + return; + } + + this._immediateTimer = setTimeout((function() { + this._immediateAccepted = true; + }).bind(this), IMMEDIATE_TIMEOUT); + }, + + move: function(e) { + if(this._stage === INITED && this._directionConfirmed(e)) { + this._stage = STARTED; + + this._resetActiveElement(); + this._toggleGestureCover(true); + this._clearSelection(e); + + this._adjustStartEvent(e); + this._start(this._startEvent); + + if(this._stage === SLEEP) { + return; + } + + this._requestAccept(e); + this._move(e); + this._forgetAccept(); + } else if(this._stage === STARTED) { + this._clearSelection(e); + this._move(e); + } + }, + + _directionConfirmed: function(e) { + const touchBoundary = this._getTouchBoundary(e); + const delta = eventDelta(this._startEventData, eventData(e)); + const deltaX = abs(delta.x); + const deltaY = abs(delta.y); + + const horizontalMove = this._validateMove(touchBoundary, deltaX, deltaY); + const verticalMove = this._validateMove(touchBoundary, deltaY, deltaX); + + const direction = this.getDirection(e); + const bothAccepted = direction === 'both' && (horizontalMove || verticalMove); + const horizontalAccepted = direction === 'horizontal' && horizontalMove; + const verticalAccepted = direction === 'vertical' && verticalMove; + + return bothAccepted || horizontalAccepted || verticalAccepted || this._immediateAccepted; + }, + + _validateMove: function(touchBoundary, mainAxis, crossAxis) { + return mainAxis && mainAxis >= touchBoundary && (this.immediate ? mainAxis >= crossAxis : true); + }, + + _getTouchBoundary: function(e) { + return (this.immediate || isDxMouseWheelEvent(e)) ? IMMEDIATE_TOUCH_BOUNDARY : TOUCH_BOUNDARY; + }, + + _adjustStartEvent: function(e) { + const touchBoundary = this._getTouchBoundary(e); + const delta = eventDelta(this._startEventData, eventData(e)); + + this._startEvent.pageX += sign(delta.x) * touchBoundary; + this._startEvent.pageY += sign(delta.y) * touchBoundary; + }, + + _resetActiveElement: function() { + if(devices.real().platform === 'ios' && this.getElement().find(':focus').length) { + resetActiveElement(); + } + }, + + _toggleGestureCover: function(toggle) { + this._toggleGestureCoverImpl(toggle); + }, + + _toggleGestureCoverImpl: function(toggle) { + const isStarted = this._stage === STARTED; + + if(isStarted) { + gestureCover(toggle, this.getElement().css('cursor')); + } + }, + + _clearSelection: function(e) { + if(isDxMouseWheelEvent(e) || isTouchEvent(e)) { + return; + } + + clearSelection(); + }, + + end: function(e) { + this._toggleGestureCover(false); + + if(this._stage === STARTED) { + this._end(e); + } else if(this._stage === INITED) { + this._stop(e); + } + + this._stage = SLEEP; + }, + + dispose: function() { + clearTimeout(this._immediateTimer); + this.callBase.apply(this, arguments); + this._toggleGestureCover(false); + }, + + _init: noop, + _start: noop, + _move: noop, + _stop: noop, + _end: noop + +}); +GestureEmitter.initialTouchBoundary = TOUCH_BOUNDARY; +GestureEmitter.touchBoundary = function(newBoundary) { + if(isDefined(newBoundary)) { + TOUCH_BOUNDARY = newBoundary; + return; + } + + return TOUCH_BOUNDARY; +}; + +export default GestureEmitter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.scroll.js b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.scroll.js new file mode 100644 index 0000000000000000000000000000000000000000..8686fb4b74e2fac70eaa6a795693a0e692fc3957 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/emitter.gesture.scroll.js @@ -0,0 +1,357 @@ +import eventsEngine from '../../events/core/events_engine'; +import Class from '../../core/class'; +const abstract = Class.abstract; +import { addNamespace, isDxMouseWheelEvent, isMouseEvent, eventData, eventDelta } from '../../events/utils/index'; +import GestureEmitter from '../../events/gesture/emitter.gesture'; +import registerEmitter from '../../events/core/emitter_registrator'; +import { requestAnimationFrame, cancelAnimationFrame } from '../../animation/frame'; +import devices from '../../core/devices'; +import { compare as compareVersions } from '../../core/utils/version'; + +const realDevice = devices.real(); + +const SCROLL_EVENT = 'scroll'; +const SCROLL_INIT_EVENT = 'dxscrollinit'; +const SCROLL_START_EVENT = 'dxscrollstart'; +const SCROLL_MOVE_EVENT = 'dxscroll'; +const SCROLL_END_EVENT = 'dxscrollend'; +const SCROLL_STOP_EVENT = 'dxscrollstop'; +const SCROLL_CANCEL_EVENT = 'dxscrollcancel'; + + +const Locker = Class.inherit((function() { + + const NAMESPACED_SCROLL_EVENT = addNamespace(SCROLL_EVENT, 'dxScrollEmitter'); + + return { + + ctor: function(element) { + this._element = element; + + this._locked = false; + + this._proxiedScroll = (e) => { + if(!this._disposed) { + this._scroll(e); + } + }; + eventsEngine.on(this._element, NAMESPACED_SCROLL_EVENT, this._proxiedScroll); + }, + + _scroll: abstract, + + check: function(e, callback) { + if(this._locked) { + callback(); + } + }, + + dispose: function() { + this._disposed = true; + eventsEngine.off(this._element, NAMESPACED_SCROLL_EVENT, this._proxiedScroll); + } + + }; + +})()); + + +const TimeoutLocker = Locker.inherit((function() { + + return { + + ctor: function(element, timeout) { + this.callBase(element); + + this._timeout = timeout; + }, + + _scroll: function() { + this._prepare(); + this._forget(); + }, + + _prepare: function() { + if(this._timer) { + this._clearTimer(); + } + this._locked = true; + }, + + _clearTimer: function() { + clearTimeout(this._timer); + this._locked = false; + this._timer = null; + }, + + _forget: function() { + const that = this; + + this._timer = setTimeout(function() { + that._clearTimer(); + }, this._timeout); + }, + + dispose: function() { + this.callBase(); + + this._clearTimer(); + } + + }; + +})()); + + +const WheelLocker = TimeoutLocker.inherit((function() { + + const WHEEL_UNLOCK_TIMEOUT = 400; + + return { + + ctor: function(element) { + this.callBase(element, WHEEL_UNLOCK_TIMEOUT); + + this._lastWheelDirection = null; + }, + + check: function(e, callback) { + this._checkDirectionChanged(e); + + this.callBase(e, callback); + }, + + _checkDirectionChanged: function(e) { + if(!isDxMouseWheelEvent(e)) { + this._lastWheelDirection = null; + return; + } + + const direction = e.shiftKey || false; + const directionChange = this._lastWheelDirection !== null && direction !== this._lastWheelDirection; + this._lastWheelDirection = direction; + + this._locked = this._locked && !directionChange; + } + + }; + +})()); + + +let PointerLocker = TimeoutLocker.inherit((function() { + + const POINTER_UNLOCK_TIMEOUT = 400; + + return { + + ctor: function(element) { + this.callBase(element, POINTER_UNLOCK_TIMEOUT); + } + + }; + +})()); + +(function() { + const ios8_greater = realDevice.ios && compareVersions(realDevice.version, [8]) >= 0; + const android5_greater = realDevice.android && compareVersions(realDevice.version, [5]) >= 0; + + if(!(ios8_greater || android5_greater)) { + return; + } + + PointerLocker = Locker.inherit((function() { + + return { + + _scroll: function() { + this._locked = true; + + const that = this; + cancelAnimationFrame(this._scrollFrame); + this._scrollFrame = requestAnimationFrame(function() { + that._locked = false; + }); + }, + + check: function(e, callback) { + cancelAnimationFrame(this._scrollFrame); + cancelAnimationFrame(this._checkFrame); + + const that = this; + const callBase = this.callBase; + this._checkFrame = requestAnimationFrame(function() { + callBase.call(that, e, callback); + + that._locked = false; + }); + }, + + dispose: function() { + this.callBase(); + + cancelAnimationFrame(this._scrollFrame); + cancelAnimationFrame(this._checkFrame); + } + + }; + + })()); + +})(); + + +const ScrollEmitter = GestureEmitter.inherit((function() { + + const INERTIA_TIMEOUT = 100; + const VELOCITY_CALC_TIMEOUT = 200; + const FRAME_DURATION = Math.round(1000 / 60); + + return { + + ctor: function(element) { + this.callBase.apply(this, arguments); + this.direction = 'both'; + + this._pointerLocker = new PointerLocker(element); + this._wheelLocker = new WheelLocker(element); + }, + + validate: function() { + return true; + }, + + configure: function(data) { + if(data.scrollTarget) { + this._pointerLocker.dispose(); + this._wheelLocker.dispose(); + this._pointerLocker = new PointerLocker(data.scrollTarget); + this._wheelLocker = new WheelLocker(data.scrollTarget); + } + + this.callBase(data); + }, + + _init: function(e) { + this._wheelLocker.check(e, function() { + if(isDxMouseWheelEvent(e)) { + this._accept(e); + } + }.bind(this)); + + this._pointerLocker.check(e, function() { + const skipCheck = this.isNative && isMouseEvent(e); + if(!isDxMouseWheelEvent(e) && !skipCheck) { + this._accept(e); + } + }.bind(this)); + + this._fireEvent(SCROLL_INIT_EVENT, e); + + this._prevEventData = eventData(e); + }, + + move: function(e) { + this.callBase.apply(this, arguments); + + e.isScrollingEvent = this.isNative || e.isScrollingEvent; + }, + + _start: function(e) { + this._savedEventData = eventData(e); + + this._fireEvent(SCROLL_START_EVENT, e); + + this._prevEventData = eventData(e); + }, + + _move: function(e) { + const currentEventData = eventData(e); + + this._fireEvent(SCROLL_MOVE_EVENT, e, { + delta: eventDelta(this._prevEventData, currentEventData) + }); + + const delta = eventDelta(this._savedEventData, currentEventData); + if(delta.time > VELOCITY_CALC_TIMEOUT) { + this._savedEventData = this._prevEventData; + } + + this._prevEventData = eventData(e); + }, + + _end: function(e) { + const endEventDelta = eventDelta(this._prevEventData, eventData(e)); + let velocity = { x: 0, y: 0 }; + + if(!isDxMouseWheelEvent(e) && endEventDelta.time < INERTIA_TIMEOUT) { + const delta = eventDelta(this._savedEventData, this._prevEventData); + const velocityMultiplier = FRAME_DURATION / delta.time; + + velocity = { x: delta.x * velocityMultiplier, y: delta.y * velocityMultiplier }; + } + + this._fireEvent(SCROLL_END_EVENT, e, { + velocity: velocity + }); + }, + + _stop: function(e) { + this._fireEvent(SCROLL_STOP_EVENT, e); + }, + + cancel: function(e) { + this.callBase.apply(this, arguments); + + this._fireEvent(SCROLL_CANCEL_EVENT, e); + }, + + dispose: function() { + this.callBase.apply(this, arguments); + + this._pointerLocker.dispose(); + this._wheelLocker.dispose(); + }, + + _clearSelection: function() { + if(this.isNative) { + return; + } + + return this.callBase.apply(this, arguments); + }, + + _toggleGestureCover: function() { + if(this.isNative) { + return; + } + + return this.callBase.apply(this, arguments); + } + + }; + +})()); + +registerEmitter({ + emitter: ScrollEmitter, + events: [ + SCROLL_INIT_EVENT, + SCROLL_START_EVENT, + SCROLL_MOVE_EVENT, + SCROLL_END_EVENT, + SCROLL_STOP_EVENT, + SCROLL_CANCEL_EVENT + ] +}); + +export default { + init: SCROLL_INIT_EVENT, + start: SCROLL_START_EVENT, + move: SCROLL_MOVE_EVENT, + end: SCROLL_END_EVENT, + stop: SCROLL_STOP_EVENT, + cancel: SCROLL_CANCEL_EVENT, + scroll: SCROLL_EVENT +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/gesture/swipeable.js b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/swipeable.js new file mode 100644 index 0000000000000000000000000000000000000000..4ad5de62a342a8eb2fb160f1c56e3736b9cda2dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/gesture/swipeable.js @@ -0,0 +1,110 @@ +import { + start as swipeEventStart, + swipe as swipeEventSwipe, + end as swipeEventEnd +} from '../swipe'; +import eventsEngine from '../../events/core/events_engine'; +import DOMComponent from '../../core/dom_component'; +import { each } from '../../core/utils/iterator'; +import { addNamespace } from '../utils/index'; +import { extend } from '../../core/utils/extend'; +import { name } from '../../core/utils/public_component'; + +const DX_SWIPEABLE = 'dxSwipeable'; +const SWIPEABLE_CLASS = 'dx-swipeable'; + +const ACTION_TO_EVENT_MAP = { + 'onStart': swipeEventStart, + 'onUpdated': swipeEventSwipe, + 'onEnd': swipeEventEnd, + 'onCancel': 'dxswipecancel' +}; + + +const Swipeable = DOMComponent.inherit({ + + _getDefaultOptions: function() { + return extend(this.callBase(), { + elastic: true, + immediate: false, + direction: 'horizontal', + itemSizeFunc: null, + onStart: null, + onUpdated: null, + onEnd: null, + onCancel: null + }); + }, + + _render: function() { + this.callBase(); + + this.$element().addClass(SWIPEABLE_CLASS); + this._attachEventHandlers(); + }, + + _attachEventHandlers: function() { + this._detachEventHandlers(); + + if(this.option('disabled')) { + return; + } + + const NAME = this.NAME; + + this._createEventData(); + + each(ACTION_TO_EVENT_MAP, (function(actionName, eventName) { + const action = this._createActionByOption(actionName, { context: this }); + + eventName = addNamespace(eventName, NAME); + + eventsEngine.on(this.$element(), eventName, this._eventData, function(e) { + return action({ event: e }); + }); + }).bind(this)); + }, + + _createEventData: function() { + this._eventData = { + elastic: this.option('elastic'), + itemSizeFunc: this.option('itemSizeFunc'), + direction: this.option('direction'), + immediate: this.option('immediate') + }; + }, + + _detachEventHandlers: function() { + eventsEngine.off(this.$element(), '.' + DX_SWIPEABLE); + }, + + _optionChanged: function(args) { + switch(args.name) { + case 'disabled': + case 'onStart': + case 'onUpdated': + case 'onEnd': + case 'onCancel': + case 'elastic': + case 'immediate': + case 'itemSizeFunc': + case 'direction': + this._detachEventHandlers(); + this._attachEventHandlers(); + break; + case 'rtlEnabled': + break; + default: + this.callBase(args); + } + + }, + + _useTemplates: function() { + return false; + }, +}); + +name(Swipeable, DX_SWIPEABLE); + +export default Swipeable; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/hold.js b/packages/f-theme-editor/farris-theme-editor/js/events/hold.js new file mode 100644 index 0000000000000000000000000000000000000000..2459cb62976bca3bee3d57c60390324b205a208c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/hold.js @@ -0,0 +1,77 @@ +import { eventData, eventDelta } from './utils/index'; +import Emitter from './core/emitter'; +import registerEmitter from './core/emitter_registrator'; +const abs = Math.abs; + +const HOLD_EVENT_NAME = 'dxhold'; +const HOLD_TIMEOUT = 750; +const TOUCH_BOUNDARY = 5; + + +const HoldEmitter = Emitter.inherit({ + + start: function(e) { + this._startEventData = eventData(e); + + this._startTimer(e); + }, + + _startTimer: function(e) { + const holdTimeout = ('timeout' in this) ? this.timeout : HOLD_TIMEOUT; + this._holdTimer = setTimeout((function() { + this._requestAccept(e); + this._fireEvent(HOLD_EVENT_NAME, e, { + target: e.target + }); + this._forgetAccept(); + }).bind(this), holdTimeout); + }, + + move: function(e) { + if(this._touchWasMoved(e)) { + this._cancel(e); + } + }, + + _touchWasMoved: function(e) { + const delta = eventDelta(this._startEventData, eventData(e)); + + return abs(delta.x) > TOUCH_BOUNDARY || abs(delta.y) > TOUCH_BOUNDARY; + }, + + end: function() { + this._stopTimer(); + }, + + _stopTimer: function() { + clearTimeout(this._holdTimer); + }, + + cancel: function() { + this._stopTimer(); + }, + + dispose: function() { + this._stopTimer(); + } + +}); + +/** + * @name UI Events.dxhold + * @type eventType + * @type_function_param1 event:event + * @module events/hold +*/ + +registerEmitter({ + emitter: HoldEmitter, + bubble: true, + events: [ + HOLD_EVENT_NAME + ] +}); + +export default { + name: HOLD_EVENT_NAME +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/hover.js b/packages/f-theme-editor/farris-theme-editor/js/events/hover.js new file mode 100644 index 0000000000000000000000000000000000000000..b7597759104001aba732bba7e4ef6d1963a9f91d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/hover.js @@ -0,0 +1,113 @@ +import eventsEngine from '../events/core/events_engine'; +import { removeData, data as elementData } from '../core/element_data'; +import Class from '../core/class'; +import devices from '../core/devices'; +import registerEvent from './core/event_registrator'; +import { addNamespace, isTouchEvent, fireEvent } from './utils/index'; +import pointerEvents from './pointer'; + +const HOVERSTART_NAMESPACE = 'dxHoverStart'; +const HOVERSTART = 'dxhoverstart'; +const POINTERENTER_NAMESPACED_EVENT_NAME = addNamespace(pointerEvents.enter, HOVERSTART_NAMESPACE); + +const HOVEREND_NAMESPACE = 'dxHoverEnd'; +const HOVEREND = 'dxhoverend'; +const POINTERLEAVE_NAMESPACED_EVENT_NAME = addNamespace(pointerEvents.leave, HOVEREND_NAMESPACE); + + +const Hover = Class.inherit({ + + noBubble: true, + + ctor: function() { + this._handlerArrayKeyPath = this._eventNamespace + '_HandlerStore'; + }, + + setup: function(element) { + elementData(element, this._handlerArrayKeyPath, {}); + }, + + add: function(element, handleObj) { + const that = this; + const handler = function(e) { + that._handler(e); + }; + + eventsEngine.on(element, this._originalEventName, handleObj.selector, handler); + elementData(element, this._handlerArrayKeyPath)[handleObj.guid] = handler; + }, + + _handler: function(e) { + if(isTouchEvent(e) || devices.isSimulator()) { + return; + } + + fireEvent({ + type: this._eventName, + originalEvent: e, + delegateTarget: e.delegateTarget + }); + }, + + remove: function(element, handleObj) { + const handler = elementData(element, this._handlerArrayKeyPath)[handleObj.guid]; + + eventsEngine.off(element, this._originalEventName, handleObj.selector, handler); + }, + + teardown: function(element) { + removeData(element, this._handlerArrayKeyPath); + } + +}); + +const HoverStart = Hover.inherit({ + + ctor: function() { + this._eventNamespace = HOVERSTART_NAMESPACE; + this._eventName = HOVERSTART; + this._originalEventName = POINTERENTER_NAMESPACED_EVENT_NAME; + this.callBase(); + }, + + _handler: function(e) { + const pointers = e.pointers || []; + if(!pointers.length) { + this.callBase(e); + } + } + +}); + +const HoverEnd = Hover.inherit({ + + ctor: function() { + this._eventNamespace = HOVEREND_NAMESPACE; + this._eventName = HOVEREND; + this._originalEventName = POINTERLEAVE_NAMESPACED_EVENT_NAME; + this.callBase(); + } + +}); + +/** + * @name UI Events.dxhoverstart + * @type eventType + * @type_function_param1 event:event + * @module events/hover +*/ + +/** + * @name UI Events.dxhoverend + * @type eventType + * @type_function_param1 event:event + * @module events/hover +*/ + +registerEvent(HOVERSTART, new HoverStart()); +registerEvent(HOVEREND, new HoverEnd()); + +export { + HOVERSTART as start, + HOVEREND as end +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/index.d.ts b/packages/f-theme-editor/farris-theme-editor/js/events/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf36b3884b967a7c25bf8feb425ae9f3b240a32e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/index.d.ts @@ -0,0 +1,285 @@ +import { + DxElement, +} from '../core/element'; + +/* eslint-disable @typescript-eslint/no-empty-interface */ +export interface EventExtension { } +export interface EventType { } +/* eslint-enable @typescript-eslint/no-empty-interface */ +/** + * @docid + * @type EventObject|jQuery.Event + */ +export type DxEvent = {} extends EventType ? (EventObject & TNativeEvent) : EventType; + +/** @public */ +export interface InitializedEventInfo { + readonly component?: TComponent; + readonly element?: DxElement; +} + +/** @public */ +export interface EventInfo { + readonly component: TComponent; + readonly element: DxElement; + readonly model?: any; +} + +/** @public */ +export interface NativeEventInfo { + readonly component: TComponent; + readonly element: DxElement; + readonly model?: any; + readonly event?: DxEvent; +} + +/** @public */ +export interface ChangedOptionInfo { + readonly name: string; + readonly fullName: string; + readonly value?: any; + readonly previousValue?: any; +} + +export interface ItemInfo { + readonly itemData?: TItemData; + readonly itemElement: DxElement; + readonly itemIndex: number; +} + +/** @public */ +export interface Cancelable { + cancel?: boolean; +} + +/** @deprecated EventObject */ +export type dxEvent = EventObject; + +/** + * @docid + * @section commonObjectStructures + * @public + */ +export class EventObject { + /** + * @docid + * @public + */ + currentTarget: Element; + + /** + * @docid + * @public + */ + data: any; + + /** + * @docid + * @public + */ + delegateTarget: Element; + + /** + * @docid + * @public + */ + target: Element; + /** + * @docid + * @publicName isDefaultPrevented() + * @public + */ + isDefaultPrevented(): boolean; + /** + * @docid + * @publicName isImmediatePropagationStopped() + * @public + */ + isImmediatePropagationStopped(): boolean; + /** + * @docid + * @publicName isPropagationStopped() + * @public + */ + isPropagationStopped(): boolean; + /** + * @docid + * @publicName preventDefault() + * @public + */ + preventDefault(): void; + /** + * @docid + * @publicName stopImmediatePropagation() + * @public + */ + stopImmediatePropagation(): void; + /** + * @docid + * @publicName stopPropagation() + * @public + */ + stopPropagation(): void; +} + +/** + * @docid + * @type EventObject|jQuery.Event + * @hidden + * @deprecated DxEvent + */ +export type event = DxEvent; + +/** + * @docid + * @publicName handler(event, extraParameters) + * @param2 extraParameters:object + * @hidden + */ +export function eventsHandler(event: DxEvent, extraParameters: any): boolean; + +/** + * @docid eventsMethods.off + * @publicName off(element) + * @namespace DevExpress.events + * @public + */ +export function off(element: Element | Array): void; + +/** + * @docid eventsMethods.off + * @publicName off(element, eventName) + * @namespace DevExpress.events + * @public + */ +export function off(element: Element | Array, eventName: string): void; + +/** + * @docid eventsMethods.off + * @publicName off(element, eventName, handler) + * @namespace DevExpress.events + * @public + */ +export function off(element: Element | Array, eventName: string, handler: Function): void; + +/** + * @docid eventsMethods.off + * @publicName off(element, eventName, selector) + * @namespace DevExpress.events + * @public + */ +export function off(element: Element | Array, eventName: string, selector: string): void; + +/** + * @docid eventsMethods.off + * @publicName off(element, eventName, selector, handler) + * @namespace DevExpress.events + * @public + */ +export function off(element: Element | Array, eventName: string, selector: string, handler: Function): void; + +/** + * @docid eventsMethods.on + * @publicName on(element, eventName, data, handler) + * @namespace DevExpress.events + * @param3 data:object + * @public + */ +export function on(element: Element | Array, eventName: string, data: any, handler: Function): void; + +/** + * @docid eventsMethods.on + * @publicName on(element, eventName, handler) + * @namespace DevExpress.events + * @public + */ +export function on(element: Element | Array, eventName: string, handler: Function): void; + +/** + * @docid eventsMethods.on + * @publicName on(element, eventName, selector, data, handler) + * @namespace DevExpress.events + * @param4 data:object + * @public + */ +export function on(element: Element | Array, eventName: string, selector: string, data: any, handler: Function): void; + +/** + * @docid eventsMethods.on + * @publicName on(element, eventName, selector, handler) + * @namespace DevExpress.events + * @public + */ +export function on(element: Element | Array, eventName: string, selector: string, handler: Function): void; + +/** + * @docid eventsMethods.one + * @publicName one(element, eventName, data, handler) + * @namespace DevExpress.events + * @param3 data:object + * @public + */ +export function one(element: Element | Array, eventName: string, data: any, handler: Function): void; + +/** + * @docid eventsMethods.one + * @publicName one(element, eventName, handler) + * @namespace DevExpress.events + * @public + */ +export function one(element: Element | Array, eventName: string, handler: Function): void; + +/** + * @docid eventsMethods.one + * @publicName one(element, eventName, selector, data, handler) + * @namespace DevExpress.events + * @param4 data:object + * @public + */ +export function one(element: Element | Array, eventName: string, selector: string, data: any, handler: Function): void; + +/** + * @docid eventsMethods.one + * @publicName one(element, eventName, selector, handler) + * @namespace DevExpress.events + * @public + */ +export function one(element: Element | Array, eventName: string, selector: string, handler: Function): void; + +/** + * @docid eventsMethods.trigger + * @publicName trigger(element, event) + * @namespace DevExpress.events + * @param2 event:string|event + * @public + */ +export function trigger(element: Element | Array, event: string | DxEvent): void; + +/** + * @docid eventsMethods.trigger + * @publicName trigger(element, event, extraParameters) + * @namespace DevExpress.events + * @param2 event:string|event + * @param3 extraParameters:object + * @public + */ +export function trigger(element: Element | Array, event: string | DxEvent, extraParameters: any): void; + +/** + * @docid eventsMethods.triggerHandler + * @publicName triggerHandler(element, event) + * @namespace DevExpress.events + * @param2 event:string|event + * @hidden + */ +export function triggerHandler(element: Element | Array, event: string | DxEvent): void; + +/** + * @docid eventsMethods.triggerHandler + * @publicName triggerHandler(element, event, extraParameters) + * @namespace DevExpress.events + * @param2 event:string|event + * @param3 extraParameters:object + * @hidden + */ +export function triggerHandler(element: Element | Array, event: string | DxEvent, extraParameters: any): void; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/index.js b/packages/f-theme-editor/farris-theme-editor/js/events/index.js new file mode 100644 index 0000000000000000000000000000000000000000..23db4967fe9f72b6f869f12a3eae07bc50a9f463 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/index.js @@ -0,0 +1,26 @@ +import eventsEngine from './core/events_engine'; + +/** +* @name events +*/ + + +export const on = eventsEngine.on; + +export const one = eventsEngine.one; +export const off = eventsEngine.off; +export const trigger = eventsEngine.trigger; +export const triggerHandler = eventsEngine.triggerHandler; + +/** +* @name events.Event +* @type function +* @param1 source:string|event +* @param2 config:object +* @return event +* @module events +* @export Event +* @hidden +*/ + +export const Event = eventsEngine.Event; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer.js new file mode 100644 index 0000000000000000000000000000000000000000..445f2a512a7150a490b735cdd21b2c65c8c135cf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer.js @@ -0,0 +1,101 @@ +import * as support from '../core/utils/support'; +import { each } from '../core/utils/iterator'; +import devices from '../core/devices'; +import registerEvent from './core/event_registrator'; +import TouchStrategy from './pointer/touch'; +import MouseStrategy from './pointer/mouse'; +import MouseAndTouchStrategy from './pointer/mouse_and_touch'; + +/** + * @name UI Events.dxpointerdown + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointermove + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointerup + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointercancel + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointerover + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointerout + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointerenter + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ +/** + * @name UI Events.dxpointerleave + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 pointerType:string + * @module events/pointer +*/ + +const getStrategy = (support, device) => { + const { tablet, phone } = device; + if(support.touch && !(tablet || phone)) { + return MouseAndTouchStrategy; + } + + if(support.touch) { + return TouchStrategy; + } + + return MouseStrategy; +}; + +const EventStrategy = getStrategy(support, devices.real()); + +each(EventStrategy.map, (pointerEvent, originalEvents) => { + registerEvent(pointerEvent, new EventStrategy(pointerEvent, originalEvents)); +}); + +const pointer = { + down: 'dxpointerdown', + up: 'dxpointerup', + move: 'dxpointermove', + cancel: 'dxpointercancel', + enter: 'dxpointerenter', + leave: 'dxpointerleave', + over: 'dxpointerover', + out: 'dxpointerout' +}; + +///#DEBUG +pointer.getStrategy = getStrategy; + +///#ENDDEBUG + +export default pointer; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer/base.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/base.js new file mode 100644 index 0000000000000000000000000000000000000000..0528333291e8b8ac42038a2647ae51216b4b1664 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/base.js @@ -0,0 +1,108 @@ +import eventsEngine from '../../events/core/events_engine'; +import browser from '../../core/utils/browser'; +import domAdapter from '../../core/dom_adapter'; +import Class from '../../core/class'; +import { addNamespace, eventSource, fireEvent } from '../utils/index'; + +const POINTER_EVENTS_NAMESPACE = 'dxPointerEvents'; + + +const BaseStrategy = Class.inherit({ + + ctor: function(eventName, originalEvents) { + this._eventName = eventName; + this._originalEvents = addNamespace(originalEvents, POINTER_EVENTS_NAMESPACE); + this._handlerCount = 0; + this.noBubble = this._isNoBubble(); + }, + + _isNoBubble: function() { + const eventName = this._eventName; + + return eventName === 'dxpointerenter' || + eventName === 'dxpointerleave'; + }, + + _handler: function(e) { + const delegateTarget = this._getDelegateTarget(e); + + return this._fireEvent({ + type: this._eventName, + pointerType: e.pointerType || eventSource(e), + originalEvent: e, + delegateTarget: delegateTarget, + // NOTE: TimeStamp normalization (FF bug #238041) (T277118) + timeStamp: browser.mozilla ? (new Date()).getTime() : e.timeStamp + }); + }, + + _getDelegateTarget: function(e) { + let delegateTarget; + + if(this.noBubble) { + delegateTarget = e.delegateTarget; + } + + return delegateTarget; + }, + + _fireEvent: function(args) { + return fireEvent(args); + }, + + _setSelector: function(handleObj) { + this._selector = this.noBubble && handleObj ? handleObj.selector : null; + }, + + _getSelector: function() { + return this._selector; + }, + + setup: function() { + return true; + }, + + add: function(element, handleObj) { + if(this._handlerCount <= 0 || this.noBubble) { + element = this.noBubble ? element : domAdapter.getDocument(); + this._setSelector(handleObj); + + const that = this; + eventsEngine.on(element, this._originalEvents, this._getSelector(), function(e) { + that._handler(e); + }); + } + + if(!this.noBubble) { + this._handlerCount++; + } + }, + + remove: function(handleObj) { + this._setSelector(handleObj); + + if(!this.noBubble) { + this._handlerCount--; + } + }, + + teardown: function(element) { + if(this._handlerCount && !this.noBubble) { + return; + } + + element = this.noBubble ? element : domAdapter.getDocument(); + + if(this._originalEvents !== '.' + POINTER_EVENTS_NAMESPACE) { + eventsEngine.off(element, this._originalEvents, this._getSelector()); + } + }, + + dispose: function(element) { + element = this.noBubble ? element : domAdapter.getDocument(); + + eventsEngine.off(element, this._originalEvents); + } +}); + +export default BaseStrategy; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse.js new file mode 100644 index 0000000000000000000000000000000000000000..895bc0ccadb586aaa8d6b65c8c3c2a2da456b21f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse.js @@ -0,0 +1,61 @@ +import { extend } from '../../core/utils/extend'; +import BaseStrategy from './base'; +import Observer from './observer'; + +const eventMap = { + 'dxpointerdown': 'mousedown', + 'dxpointermove': 'mousemove', + 'dxpointerup': 'mouseup', + 'dxpointercancel': '', + 'dxpointerover': 'mouseover', + 'dxpointerout': 'mouseout', + 'dxpointerenter': 'mouseenter', + 'dxpointerleave': 'mouseleave' +}; + +const normalizeMouseEvent = function(e) { + e.pointerId = 1; + + return { + pointers: observer.pointers(), + pointerId: 1 + }; +}; + + +let observer; +let activated = false; +const activateStrategy = function() { + if(activated) { + return; + } + + observer = new Observer(eventMap, function() { + return true; + }); + + activated = true; +}; + +const MouseStrategy = BaseStrategy.inherit({ + + ctor: function() { + this.callBase.apply(this, arguments); + + activateStrategy(); + }, + + _fireEvent: function(args) { + return this.callBase(extend(normalizeMouseEvent(args.originalEvent), args)); + } + +}); +MouseStrategy.map = eventMap; +MouseStrategy.normalize = normalizeMouseEvent; +MouseStrategy.activate = activateStrategy; +MouseStrategy.resetObserver = function() { + observer.reset(); +}; + + +export default MouseStrategy; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse_and_touch.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse_and_touch.js new file mode 100644 index 0000000000000000000000000000000000000000..be242f223fcbb91ac2114efa57eb1173002d17f2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/mouse_and_touch.js @@ -0,0 +1,85 @@ +import { extend } from '../../core/utils/extend'; +import BaseStrategy from './base'; +import MouseStrategy from './mouse'; +import TouchStrategy from './touch'; +import { isMouseEvent } from '../utils/index'; + +const eventMap = { + 'dxpointerdown': 'touchstart mousedown', + 'dxpointermove': 'touchmove mousemove', + 'dxpointerup': 'touchend mouseup', + 'dxpointercancel': 'touchcancel', + 'dxpointerover': 'mouseover', + 'dxpointerout': 'mouseout', + 'dxpointerenter': 'mouseenter', + 'dxpointerleave': 'mouseleave' +}; + + +let activated = false; +const activateStrategy = function() { + if(activated) { + return; + } + + MouseStrategy.activate(); + + activated = true; +}; + +const MouseAndTouchStrategy = BaseStrategy.inherit({ + + EVENT_LOCK_TIMEOUT: 100, + + ctor: function() { + this.callBase.apply(this, arguments); + + activateStrategy(); + }, + + _handler: function(e) { + const isMouse = isMouseEvent(e); + + if(!isMouse) { + this._skipNextEvents = true; + } + + if(isMouse && this._mouseLocked) { + return; + } + + if(isMouse && this._skipNextEvents) { + this._skipNextEvents = false; + this._mouseLocked = true; + + clearTimeout(this._unlockMouseTimer); + + const that = this; + this._unlockMouseTimer = setTimeout(function() { + that._mouseLocked = false; + }, this.EVENT_LOCK_TIMEOUT); + + return; + } + + return this.callBase(e); + }, + + _fireEvent: function(args) { + const normalizer = isMouseEvent(args.originalEvent) ? MouseStrategy.normalize : TouchStrategy.normalize; + + return this.callBase(extend(normalizer(args.originalEvent), args)); + }, + + dispose: function() { + this.callBase(); + this._skipNextEvents = false; + this._mouseLocked = false; + clearTimeout(this._unlockMouseTimer); + } +}); +MouseAndTouchStrategy.map = eventMap; +MouseAndTouchStrategy.resetObserver = MouseStrategy.resetObserver; + + +export default MouseAndTouchStrategy; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer/observer.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/observer.js new file mode 100644 index 0000000000000000000000000000000000000000..374d4b336a3c88c3737bf92864446fa08c33a359 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/observer.js @@ -0,0 +1,69 @@ +import { each } from '../../core/utils/iterator'; +import readyCallbacks from '../../core/utils/ready_callbacks'; +import domAdapter from '../../core/dom_adapter'; + +const addEventsListener = function(events, handler) { + readyCallbacks.add(function() { + events + .split(' ') + .forEach(function(event) { + domAdapter.listen(domAdapter.getDocument(), event, handler, true); + }); + }); +}; + +const Observer = function(eventMap, pointerEquals, onPointerAdding) { + + onPointerAdding = onPointerAdding || function() { }; + + let pointers = []; + + const getPointerIndex = function(e) { + let index = -1; + + each(pointers, function(i, pointer) { + if(!pointerEquals(e, pointer)) { + return true; + } + + index = i; + return false; + }); + + return index; + }; + + const addPointer = function(e) { + if(getPointerIndex(e) === -1) { + onPointerAdding(e); + pointers.push(e); + } + }; + + const removePointer = function(e) { + const index = getPointerIndex(e); + if(index > -1) { + pointers.splice(index, 1); + } + }; + + const updatePointer = function(e) { + pointers[getPointerIndex(e)] = e; + }; + + addEventsListener(eventMap['dxpointerdown'], addPointer); + addEventsListener(eventMap['dxpointermove'], updatePointer); + addEventsListener(eventMap['dxpointerup'], removePointer); + addEventsListener(eventMap['dxpointercancel'], removePointer); + + this.pointers = function() { + return pointers; + }; + + this.reset = function() { + pointers = []; + }; + +}; + +export default Observer; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/pointer/touch.js b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/touch.js new file mode 100644 index 0000000000000000000000000000000000000000..6b2969bf8d4543cabad0322875cc371f542abc1c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/pointer/touch.js @@ -0,0 +1,67 @@ +import devices from '../../core/devices'; +import { extend } from '../../core/utils/extend'; +import { each } from '../../core/utils/iterator'; +import BaseStrategy from './base'; + +const eventMap = { + 'dxpointerdown': 'touchstart', + 'dxpointermove': 'touchmove', + 'dxpointerup': 'touchend', + 'dxpointercancel': 'touchcancel', + 'dxpointerover': '', + 'dxpointerout': '', + 'dxpointerenter': '', + 'dxpointerleave': '' +}; + + +const normalizeTouchEvent = function(e) { + const pointers = []; + + each(e.touches, function(_, touch) { + pointers.push(extend({ + pointerId: touch.identifier + }, touch)); + }); + + return { + pointers: pointers, + pointerId: e.changedTouches[0].identifier + }; +}; + +const skipTouchWithSameIdentifier = function(pointerEvent) { + return devices.real().platform === 'ios' && (pointerEvent === 'dxpointerdown' || pointerEvent === 'dxpointerup'); +}; + +const TouchStrategy = BaseStrategy.inherit({ + + ctor: function() { + this.callBase.apply(this, arguments); + this._pointerId = 0; + }, + + _handler: function(e) { + if(skipTouchWithSameIdentifier(this._eventName)) { + const touch = e.changedTouches[0]; + + if(this._pointerId === touch.identifier && this._pointerId !== 0) { + return; + } + + this._pointerId = touch.identifier; + } + + return this.callBase.apply(this, arguments); + }, + + _fireEvent: function(args) { + return this.callBase(extend(normalizeTouchEvent(args.originalEvent), args)); + } + +}); +TouchStrategy.map = eventMap; +TouchStrategy.normalize = normalizeTouchEvent; + + +export default TouchStrategy; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/remove.js b/packages/f-theme-editor/farris-theme-editor/js/events/remove.js new file mode 100644 index 0000000000000000000000000000000000000000..ffde4455a3d695ee90d39feb453e37586d1ecd84 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/remove.js @@ -0,0 +1,32 @@ +import $ from '../core/renderer'; +import { beforeCleanData } from '../core/element_data'; +import eventsEngine from './core/events_engine'; +import registerEvent from './core/event_registrator'; + +export const removeEvent = 'dxremove'; +const eventPropName = 'dxRemoveEvent'; + +/** + * @name UI Events.dxremove + * @type eventType + * @type_function_param1 event:event + * @module events/remove +*/ + +beforeCleanData(function(elements) { + elements = [].slice.call(elements); + for(let i = 0; i < elements.length; i++) { + const $element = $(elements[i]); + if($element.prop(eventPropName)) { + $element[0][eventPropName] = null; + eventsEngine.triggerHandler($element, removeEvent); + } + } +}); + +registerEvent(removeEvent, { + noBubble: true, + setup: function(element) { + $(element).prop(eventPropName, true); + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/short.js b/packages/f-theme-editor/farris-theme-editor/js/events/short.js new file mode 100644 index 0000000000000000000000000000000000000000..07cf2a5914c82f39b5d4cc785202701517378b0b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/short.js @@ -0,0 +1,130 @@ +import domAdapter from '../core/dom_adapter'; +import eventsEngine from './core/events_engine'; +import KeyboardProcessor from './core/keyboard_processor'; +import { addNamespace as pureAddNamespace } from './utils/index'; + +function addNamespace(event, namespace) { + return namespace ? pureAddNamespace(event, namespace) : event; +} + +function executeAction(action, args) { + return typeof action === 'function' ? action(args) : action.execute(args); +} + +export const active = { + on: ($el, active, inactive, opts) => { + const { selector, showTimeout, hideTimeout, namespace } = opts; + + eventsEngine.on($el, addNamespace('dxactive', namespace), selector, { timeout: showTimeout }, + event => executeAction(active, { event, element: event.currentTarget }) + ); + eventsEngine.on($el, addNamespace('dxinactive', namespace), selector, { timeout: hideTimeout }, + event => executeAction(inactive, { event, element: event.currentTarget }) + ); + }, + + off: ($el, { namespace, selector }) => { + eventsEngine.off($el, addNamespace('dxactive', namespace), selector); + eventsEngine.off($el, addNamespace('dxinactive', namespace), selector); + } +}; + +export const resize = { + on: ($el, resize, { namespace } = {}) => { + eventsEngine.on($el, addNamespace('dxresize', namespace), resize); + }, + off: ($el, { namespace } = {}) => { + eventsEngine.off($el, addNamespace('dxresize', namespace)); + } +}; + +export const hover = { + on: ($el, start, end, { selector, namespace }) => { + eventsEngine.on($el, addNamespace('dxhoverend', namespace), selector, event => end(event)); + eventsEngine.on($el, addNamespace('dxhoverstart', namespace), selector, + event => executeAction(start, { element: event.target, event })); + }, + + off: ($el, { selector, namespace }) => { + eventsEngine.off($el, addNamespace('dxhoverstart', namespace), selector); + eventsEngine.off($el, addNamespace('dxhoverend', namespace), selector); + } +}; + +export const visibility = { + on: ($el, shown, hiding, { namespace }) => { + eventsEngine.on($el, addNamespace('dxhiding', namespace), hiding); + eventsEngine.on($el, addNamespace('dxshown', namespace), shown); + }, + + off: ($el, { namespace }) => { + eventsEngine.off($el, addNamespace('dxhiding', namespace)); + eventsEngine.off($el, addNamespace('dxshown', namespace)); + } +}; + +export const focus = { + on: ($el, focusIn, focusOut, { namespace, isFocusable }) => { + eventsEngine.on($el, addNamespace('focusin', namespace), focusIn); + eventsEngine.on($el, addNamespace('focusout', namespace), focusOut); + + if(domAdapter.hasDocumentProperty('onbeforeactivate')) { + eventsEngine.on($el, addNamespace('beforeactivate', namespace), + e => isFocusable(null, e.target) || e.preventDefault() + ); + } + }, + + off: ($el, { namespace }) => { + eventsEngine.off($el, addNamespace('focusin', namespace)); + eventsEngine.off($el, addNamespace('focusout', namespace)); + + if(domAdapter.hasDocumentProperty('onbeforeactivate')) { + eventsEngine.off($el, addNamespace('beforeactivate', namespace)); + } + }, + + trigger: $el => eventsEngine.trigger($el, 'focus') +}; + +export const dxClick = { + on: ($el, click, { namespace } = {}) => { + eventsEngine.on($el, addNamespace('dxclick', namespace), click); + }, + off: ($el, { namespace } = {}) => { + eventsEngine.off($el, addNamespace('dxclick', namespace)); + } +}; + +export const click = { + on: ($el, click, { namespace } = {}) => { + eventsEngine.on($el, addNamespace('click', namespace), click); + }, + off: ($el, { namespace } = {}) => { + eventsEngine.off($el, addNamespace('click', namespace)); + } +}; + +let index = 0; +const keyboardProcessors = {}; +const generateListenerId = () => `keyboardProcessorId${index++}`; + +export const keyboard = { + on: (element, focusTarget, handler) => { + const listenerId = generateListenerId(); + + keyboardProcessors[listenerId] = new KeyboardProcessor({ element, focusTarget, handler }); + + return listenerId; + }, + + off: listenerId => { + if(listenerId && keyboardProcessors[listenerId]) { + keyboardProcessors[listenerId].dispose(); + delete keyboardProcessors[listenerId]; + } + }, + + // NOTE: For tests + _getProcessor: listenerId => keyboardProcessors[listenerId] +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/swipe.js b/packages/f-theme-editor/farris-theme-editor/js/events/swipe.js new file mode 100644 index 0000000000000000000000000000000000000000..deeb6867bc5af84afa843e07762e409974576322 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/swipe.js @@ -0,0 +1,204 @@ +import { getWidth, getHeight } from '../core/utils/size'; +import { eventData } from './utils/index'; +import GestureEmitter from './gesture/emitter.gesture'; +import registerEmitter from './core/emitter_registrator'; + +const SWIPE_START_EVENT = 'dxswipestart'; +const SWIPE_EVENT = 'dxswipe'; +const SWIPE_END_EVENT = 'dxswipeend'; + + +const HorizontalStrategy = { + defaultItemSizeFunc: function() { + return getWidth(this.getElement()); + }, + + getBounds: function() { + return [ + this._maxLeftOffset, + this._maxRightOffset + ]; + }, + + calcOffsetRatio: function(e) { + const endEventData = eventData(e); + return (endEventData.x - (this._savedEventData && this._savedEventData.x || 0)) / this._itemSizeFunc().call(this, e); + }, + + isFastSwipe: function(e) { + const endEventData = eventData(e); + return this.FAST_SWIPE_SPEED_LIMIT * Math.abs(endEventData.x - this._tickData.x) >= (endEventData.time - this._tickData.time); + } +}; + +const VerticalStrategy = { + defaultItemSizeFunc: function() { + return getHeight(this.getElement()); + }, + + getBounds: function() { + return [ + this._maxTopOffset, + this._maxBottomOffset + ]; + }, + + calcOffsetRatio: function(e) { + const endEventData = eventData(e); + return (endEventData.y - (this._savedEventData && this._savedEventData.y || 0)) / this._itemSizeFunc().call(this, e); + }, + + isFastSwipe: function(e) { + const endEventData = eventData(e); + return this.FAST_SWIPE_SPEED_LIMIT * Math.abs(endEventData.y - this._tickData.y) >= (endEventData.time - this._tickData.time); + } +}; + + +const STRATEGIES = { + 'horizontal': HorizontalStrategy, + 'vertical': VerticalStrategy +}; + +const SwipeEmitter = GestureEmitter.inherit({ + + TICK_INTERVAL: 300, + FAST_SWIPE_SPEED_LIMIT: 10, + + ctor: function(element) { + this.callBase(element); + + this.direction = 'horizontal'; + this.elastic = true; + }, + + _getStrategy: function() { + return STRATEGIES[this.direction]; + }, + + _defaultItemSizeFunc: function() { + return this._getStrategy().defaultItemSizeFunc.call(this); + }, + + _itemSizeFunc: function() { + return this.itemSizeFunc || this._defaultItemSizeFunc; + }, + + _init: function(e) { + this._tickData = eventData(e); + }, + + _start: function(e) { + this._savedEventData = eventData(e); + + e = this._fireEvent(SWIPE_START_EVENT, e); + + if(!e.cancel) { + this._maxLeftOffset = e.maxLeftOffset; + this._maxRightOffset = e.maxRightOffset; + this._maxTopOffset = e.maxTopOffset; + this._maxBottomOffset = e.maxBottomOffset; + } + }, + + _move: function(e) { + const strategy = this._getStrategy(); + const moveEventData = eventData(e); + let offset = strategy.calcOffsetRatio.call(this, e); + + offset = this._fitOffset(offset, this.elastic); + + if(moveEventData.time - this._tickData.time > this.TICK_INTERVAL) { + this._tickData = moveEventData; + } + + this._fireEvent(SWIPE_EVENT, e, { + offset: offset + }); + + e.preventDefault(); + }, + + _end: function(e) { + const strategy = this._getStrategy(); + const offsetRatio = strategy.calcOffsetRatio.call(this, e); + const isFast = strategy.isFastSwipe.call(this, e); + let startOffset = offsetRatio; + let targetOffset = this._calcTargetOffset(offsetRatio, isFast); + + startOffset = this._fitOffset(startOffset, this.elastic); + targetOffset = this._fitOffset(targetOffset, false); + + this._fireEvent(SWIPE_END_EVENT, e, { + offset: startOffset, + targetOffset: targetOffset + }); + }, + + _fitOffset: function(offset, elastic) { + const strategy = this._getStrategy(); + const bounds = strategy.getBounds.call(this); + + if(offset < -bounds[0]) { + return elastic ? (-2 * bounds[0] + offset) / 3 : -bounds[0]; + } + + if(offset > bounds[1]) { + return elastic ? (2 * bounds[1] + offset) / 3 : bounds[1]; + } + + return offset; + }, + + _calcTargetOffset: function(offsetRatio, isFast) { + let result; + if(isFast) { + result = Math.ceil(Math.abs(offsetRatio)); + if(offsetRatio < 0) { + result = -result; + } + } else { + result = Math.round(offsetRatio); + } + return result; + } +}); + +/** + * @name UI Events.dxswipestart + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 cancel:boolean + * @module events/swipe +*/ +/** + * @name UI Events.dxswipe + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 offset:number + * @type_function_param1_field2 cancel:boolean + * @module events/swipe +*/ +/** + * @name UI Events.dxswipeend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 offset:number + * @type_function_param1_field2 targetOffset:number + * @module events/swipe +*/ + +registerEmitter({ + emitter: SwipeEmitter, + events: [ + SWIPE_START_EVENT, + SWIPE_EVENT, + SWIPE_END_EVENT + ] +}); + +export { + SWIPE_EVENT as swipe, + SWIPE_START_EVENT as start, + SWIPE_END_EVENT as end +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/transform.js b/packages/f-theme-editor/farris-theme-editor/js/events/transform.js new file mode 100644 index 0000000000000000000000000000000000000000..9e34d9c39b3fc4d28689f598591b2797a3e14671 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/transform.js @@ -0,0 +1,297 @@ +import { sign as mathSign, fitIntoRange } from '../core/utils/math'; +import * as iteratorUtils from '../core/utils/iterator'; +import { hasTouches } from './utils/index'; +import Emitter from './core/emitter'; +import registerEmitter from './core/emitter_registrator'; + +const DX_PREFIX = 'dx'; + +const TRANSFORM = 'transform'; +const TRANSLATE = 'translate'; +const PINCH = 'pinch'; +const ROTATE = 'rotate'; + +const START_POSTFIX = 'start'; +const UPDATE_POSTFIX = ''; +const END_POSTFIX = 'end'; + +const eventAliases = []; +const addAlias = function(eventName, eventArgs) { + eventAliases.push({ + name: eventName, + args: eventArgs + }); +}; + +addAlias(TRANSFORM, { + scale: true, + deltaScale: true, + rotation: true, + deltaRotation: true, + translation: true, + deltaTranslation: true +}); + +addAlias(TRANSLATE, { + translation: true, + deltaTranslation: true +}); + +addAlias(PINCH, { + scale: true, + deltaScale: true +}); + +addAlias(ROTATE, { + rotation: true, + deltaRotation: true +}); + + +const getVector = function(first, second) { + return { + x: second.pageX - first.pageX, + y: -second.pageY + first.pageY, + centerX: (second.pageX + first.pageX) * 0.5, + centerY: (second.pageY + first.pageY) * 0.5 + }; +}; + +const getEventVector = function(e) { + const pointers = e.pointers; + + return getVector(pointers[0], pointers[1]); +}; + +const getDistance = function(vector) { + return Math.sqrt(vector.x * vector.x + vector.y * vector.y); +}; + +const getScale = function(firstVector, secondVector) { + return getDistance(firstVector) / getDistance(secondVector); +}; + +const getRotation = function(firstVector, secondVector) { + const scalarProduct = firstVector.x * secondVector.x + firstVector.y * secondVector.y; + const distanceProduct = getDistance(firstVector) * getDistance(secondVector); + + if(distanceProduct === 0) { + return 0; + } + + const sign = mathSign(firstVector.x * secondVector.y - secondVector.x * firstVector.y); + const angle = Math.acos(fitIntoRange(scalarProduct / distanceProduct, -1, 1)); + + return sign * angle; +}; + +const getTranslation = function(firstVector, secondVector) { + return { + x: firstVector.centerX - secondVector.centerX, + y: firstVector.centerY - secondVector.centerY + }; +}; + +const TransformEmitter = Emitter.inherit({ + + validatePointers: function(e) { + return hasTouches(e) > 1; + }, + + start: function(e) { + this._accept(e); + + const startVector = getEventVector(e); + this._startVector = startVector; + this._prevVector = startVector; + + this._fireEventAliases(START_POSTFIX, e); + }, + + move: function(e) { + const currentVector = getEventVector(e); + const eventArgs = this._getEventArgs(currentVector); + + this._fireEventAliases(UPDATE_POSTFIX, e, eventArgs); + this._prevVector = currentVector; + }, + + end: function(e) { + const eventArgs = this._getEventArgs(this._prevVector); + this._fireEventAliases(END_POSTFIX, e, eventArgs); + }, + + _getEventArgs: function(vector) { + return { + scale: getScale(vector, this._startVector), + deltaScale: getScale(vector, this._prevVector), + rotation: getRotation(vector, this._startVector), + deltaRotation: getRotation(vector, this._prevVector), + translation: getTranslation(vector, this._startVector), + deltaTranslation: getTranslation(vector, this._prevVector) + }; + }, + + _fireEventAliases: function(eventPostfix, originalEvent, eventArgs) { + eventArgs = eventArgs || {}; + + iteratorUtils.each(eventAliases, (function(_, eventAlias) { + const args = {}; + iteratorUtils.each(eventAlias.args, function(name) { + if(name in eventArgs) { + args[name] = eventArgs[name]; + } + }); + + this._fireEvent(DX_PREFIX + eventAlias.name + eventPostfix, originalEvent, args); + }).bind(this)); + } + +}); + + +/** + * @name UI Events.dxtransformstart + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxtransform + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 scale:number + * @type_function_param1_field2 deltaScale:number + * @type_function_param1_field3 rotation:number + * @type_function_param1_field4 deltaRotation:number + * @type_function_param1_field5 translation:object + * @type_function_param1_field6 deltaTranslation:object + * @type_function_param1_field7 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxtransformend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 scale:number + * @type_function_param1_field2 deltaScale:number + * @type_function_param1_field3 rotation:number + * @type_function_param1_field4 deltaRotation:number + * @type_function_param1_field5 translation:object + * @type_function_param1_field6 deltaTranslation:object + * @type_function_param1_field7 cancel:boolean + * @module events/transform +*/ + +/** + * @name UI Events.dxtranslatestart + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxtranslate + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 translation:object + * @type_function_param1_field2 deltaTranslation:object + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxtranslateend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 translation:object + * @type_function_param1_field2 deltaTranslation:object + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ + +/** +* @name UI Events.dxpinchstart +* @type eventType +* @type_function_param1 event:event +* @type_function_param1_field1 cancel:boolean +* @module events/transform + */ +/** + * @name UI Events.dxpinch + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 scale:number + * @type_function_param1_field2 deltaScale:number + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxpinchend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 scale:number + * @type_function_param1_field2 deltaScale:number + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ + +/** + * @name UI Events.dxrotatestart + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxrotate + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 rotation:number + * @type_function_param1_field2 deltaRotation:number + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ +/** + * @name UI Events.dxrotateend + * @type eventType + * @type_function_param1 event:event + * @type_function_param1_field1 rotation:number + * @type_function_param1_field2 deltaRotation:number + * @type_function_param1_field3 cancel:boolean + * @module events/transform +*/ + +const eventNames = eventAliases.reduce((result, eventAlias) => { + [START_POSTFIX, UPDATE_POSTFIX, END_POSTFIX].forEach(eventPostfix => { + result.push(DX_PREFIX + eventAlias.name + eventPostfix); + }); + return result; +}, []); + +registerEmitter({ + emitter: TransformEmitter, + events: eventNames +}); +const exportNames = {}; +iteratorUtils.each(eventNames, function(_, eventName) { + exportNames[eventName.substring(DX_PREFIX.length)] = eventName; +}); +/* eslint-disable spellcheck/spell-checker */ +export const { + transformstart, + transform, + transformend, + translatestart, + translate, + translateend, + zoomstart, + zoom, + zoomend, + pinchstart, + pinch, + pinchend, + rotatestart, + rotate, + rotateend +} = exportNames; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/utils/add_namespace.js b/packages/f-theme-editor/farris-theme-editor/js/events/utils/add_namespace.js new file mode 100644 index 0000000000000000000000000000000000000000..c41b78ce9a034bdf891c29b80c8365df8b0c0fe4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/utils/add_namespace.js @@ -0,0 +1,21 @@ +import errors from '../../core/errors'; + +const addNamespace = (eventNames, namespace) => { + if(!namespace) { + throw errors.Error('E0017'); + } + + if(Array.isArray(eventNames)) { + return eventNames + .map(eventName => addNamespace(eventName, namespace)) + .join(' '); + } + + if(eventNames.indexOf(' ') !== -1) { + return addNamespace(eventNames.split(/\s+/g), namespace); + } + + return `${eventNames}.${namespace}`; +}; + +export default addNamespace; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/utils/event_nodes_disposing.js b/packages/f-theme-editor/farris-theme-editor/js/events/utils/event_nodes_disposing.js new file mode 100644 index 0000000000000000000000000000000000000000..ae6513a267bae6b3e2d6f4b81909ca6e8b2a4cd6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/utils/event_nodes_disposing.js @@ -0,0 +1,19 @@ +import eventsEngine from '../core/events_engine'; +import { removeEvent } from '../remove'; + +function nodesByEvent(event) { + return event && [ + event.target, + event.delegateTarget, + event.relatedTarget, + event.currentTarget + ].filter(node => !!node); +} + +export const subscribeNodesDisposing = (event, callback) => { + eventsEngine.one(nodesByEvent(event), removeEvent, callback); +}; + +export const unsubscribeNodesDisposing = (event, callback) => { + eventsEngine.off(nodesByEvent(event), removeEvent, callback); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/utils/index.js b/packages/f-theme-editor/farris-theme-editor/js/events/utils/index.js new file mode 100644 index 0000000000000000000000000000000000000000..94d4c39b1bc378180d1070927d80297704b99c8b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/utils/index.js @@ -0,0 +1,209 @@ +import $ from '../../core/renderer'; +import mappedAddNamespace from './add_namespace'; +import eventsEngine from '../core/events_engine'; +import { each } from '../../core/utils/iterator'; +import { extend } from '../../core/utils/extend'; +import { focused } from '../../ui/widget/selectors'; + +const KEY_MAP = { + 'backspace': 'backspace', + 'tab': 'tab', + 'enter': 'enter', + 'escape': 'escape', + 'pageup': 'pageUp', + 'pagedown': 'pageDown', + 'end': 'end', + 'home': 'home', + 'arrowleft': 'leftArrow', + 'arrowup': 'upArrow', + 'arrowright': 'rightArrow', + 'arrowdown': 'downArrow', + 'delete': 'del', + ' ': 'space', + 'f': 'F', + 'a': 'A', + '*': 'asterisk', + '-': 'minus', + 'alt': 'alt', + 'control': 'control', + 'shift': 'shift', +}; + +const LEGACY_KEY_CODES = { + // iOS 10.2 and lower didn't supports KeyboardEvent.key + '8': 'backspace', + '9': 'tab', + '13': 'enter', + '27': 'escape', + '33': 'pageUp', + '34': 'pageDown', + '35': 'end', + '36': 'home', + '37': 'leftArrow', + '38': 'upArrow', + '39': 'rightArrow', + '40': 'downArrow', + '46': 'del', + '32': 'space', + '70': 'F', + '65': 'A', + '106': 'asterisk', + '109': 'minus', + '189': 'minus', + '173': 'minus', + '16': 'shift', + '17': 'control', + '18': 'alt' +}; + +const EVENT_SOURCES_REGEX = { + dx: /^dx/i, + mouse: /(mouse|wheel)/i, + touch: /^touch/i, + keyboard: /^key/i, + pointer: /^(ms)?pointer/i +}; + +let fixMethod = e => e; +const copyEvent = originalEvent => fixMethod(eventsEngine.Event(originalEvent, originalEvent), originalEvent); +const isDxEvent = e => eventSource(e) === 'dx'; +const isNativeMouseEvent = e => eventSource(e) === 'mouse'; +const isNativeTouchEvent = e => eventSource(e) === 'touch'; + +export const eventSource = ({ type }) => { + let result = 'other'; + + each(EVENT_SOURCES_REGEX, function(key) { + if(this.test(type)) { + result = key; + + return false; + } + }); + + return result; +}; + +export const isPointerEvent = e => eventSource(e) === 'pointer'; + +export const isMouseEvent = e => isNativeMouseEvent(e) || + ((isPointerEvent(e) || isDxEvent(e)) && e.pointerType === 'mouse'); + +export const isDxMouseWheelEvent = e => e && e.type === 'dxmousewheel'; + +export const isTouchEvent = e => isNativeTouchEvent(e) || + ((isPointerEvent(e) || isDxEvent(e)) && e.pointerType === 'touch'); + +export const isKeyboardEvent = e => eventSource(e) === 'keyboard'; + +export const isFakeClickEvent = ({ screenX, offsetX, pageX }) => screenX === 0 && !offsetX && pageX === 0; + +export const eventData = ({ pageX, pageY, timeStamp }) => ({ + x: pageX, + y: pageY, + time: timeStamp +}); + +export const eventDelta = (from, to) => ({ + x: to.x - from.x, + y: to.y - from.y, + time: to.time - from.time || 1 +}); + +export const hasTouches = e => { + const { originalEvent, pointers } = e; + + if(isNativeTouchEvent(e)) { + return (originalEvent.touches || []).length; + } + + if(isDxEvent(e)) { + return (pointers || []).length; + } + + return 0; +}; + +// TODO: for tests +let skipEvents = false; +export const forceSkipEvents = () => skipEvents = true; +export const stopEventsSkipping = () => skipEvents = false; + +export const needSkipEvent = e => { + // TODO: for tests + if(skipEvents) { + return true; + } + + // TODO: this checking used in swipeable first move handler. is it correct? + const { target } = e; + const $target = $(target); + const isDropDown = $target.is('.dx-dropdownlist-popup-wrapper *, .dx-dropdownlist-popup-wrapper'); + const isContentEditable = target?.isContentEditable || target?.hasAttribute('contenteditable'); + const touchInEditable = $target.is('input, textarea, select') || isContentEditable; + + if($target.is('.dx-skip-gesture-event *, .dx-skip-gesture-event') && !isDropDown) { + return true; + } + + if(isDxMouseWheelEvent(e)) { + const isTextArea = $target.is('textarea') && $target.hasClass('dx-texteditor-input'); + + if(isTextArea || isContentEditable) { + return false; + } + + const isInputFocused = $target.is('input[type=\'number\'], textarea, select') && $target.is(':focus'); + + return isInputFocused; + } + + if(isMouseEvent(e)) { + return touchInEditable || e.which > 1; // only left mouse button + } + + if(isTouchEvent(e)) { + return touchInEditable && focused($target); + } +}; + +export const setEventFixMethod = func => fixMethod = func; + +export const createEvent = (originalEvent, args) => { + const event = copyEvent(originalEvent); + + args && extend(event, args); + + return event; +}; + +export const fireEvent = props => { + const { originalEvent, delegateTarget } = props; + const event = createEvent(originalEvent, props); + + eventsEngine.trigger(delegateTarget || event.target, event); + + return event; +}; + +export const normalizeKeyName = ({ key, which }) => { + const isKeySupported = !!key; + + key = isKeySupported ? key : which; + + if(key) { + if(isKeySupported) { + key = KEY_MAP[key.toLowerCase()] || key; + } else { + key = LEGACY_KEY_CODES[key] || String.fromCharCode(key); + } + + return key; + } +}; + +export const getChar = ({ key, which }) => key || String.fromCharCode(which); + +export const addNamespace = mappedAddNamespace; + +export const isCommandKeyPressed = ({ ctrlKey, metaKey }) => ctrlKey || metaKey; diff --git a/packages/f-theme-editor/farris-theme-editor/js/events/visibility_change.js b/packages/f-theme-editor/farris-theme-editor/js/events/visibility_change.js new file mode 100644 index 0000000000000000000000000000000000000000..623329c76d452f051adc3d3e554b1f4027e2447c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/events/visibility_change.js @@ -0,0 +1,22 @@ +import $ from '../core/renderer'; +import eventsEngine from './core/events_engine'; + +const triggerVisibilityChangeEvent = function(eventName) { + const VISIBILITY_CHANGE_SELECTOR = '.dx-visibility-change-handler'; + + return function(element) { + const $element = $(element || 'body'); + + const changeHandlers = $element.filter(VISIBILITY_CHANGE_SELECTOR). + add($element.find(VISIBILITY_CHANGE_SELECTOR)); + + for(let i = 0; i < changeHandlers.length; i++) { + eventsEngine.triggerHandler(changeHandlers[i], eventName); + } + }; +}; + + +export const triggerShownEvent = triggerVisibilityChangeEvent('dxshown'); +export const triggerHidingEvent = triggerVisibilityChangeEvent('dxhiding'); +export const triggerResizeEvent = triggerVisibilityChangeEvent('dxresize'); diff --git a/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.d.ts b/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a15e823eeb6c7fd2b639694ce40e85df9b4491e0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.d.ts @@ -0,0 +1,245 @@ +import { DxPromise } from './core/utils/deferred'; +import dxDataGrid, { Column } from './ui/data_grid'; +import dxPivotGrid, { Cell } from './ui/pivot_grid'; +import { ExportLoadPanel } from './exporter/export_load_panel'; + +/** + * @public + * @namespace DevExpress.excelExporter + */ +export type DataGridCell = ExcelDataGridCell; + +/** + * @namespace DevExpress.excelExporter + * @deprecated Use DataGridCell instead + */ +export interface ExcelDataGridCell { + /** + * @docid + * @public + * @type dxDataGridColumn + */ + column?: Column; + /** + * @docid + * @public + */ + data?: any; + /** + * @docid + * @public + */ + groupIndex?: number; + /** + * @docid + * @public + */ + groupSummaryItems?: Array<{ + /** + * @docid + */ + name?: string; + /** + * @docid + */ + value?: any; + }>; + /** + * @docid + * @public + */ + rowType?: string; + /** + * @docid + * @public + */ + totalSummaryItemName?: string; + /** + * @docid + * @public + */ + value?: any; +} + +/** + * @public + * @namespace DevExpress.excelExporter + */ +export type PivotGridCell = ExcelPivotGridCell; + +/** + * @namespace DevExpress.excelExporter + * @deprecated Use PivotGridCell instead + */ +export interface ExcelPivotGridCell extends Cell { + /** + * @docid + * @public + */ + area?: string; + /** + * @docid + * @public + */ + rowIndex?: number; + /** + * @docid + * @public + */ + columnIndex?: number; +} + +/** + * @docid + * @namespace DevExpress.excelExporter + * @type object + */ +export interface CellAddress { + /** + * @docid + * @public + */ + row?: number; + /** + * @docid + * @public + */ + column?: number; +} + +/** + * @docid + * @namespace DevExpress.excelExporter + * @type object + */ +export interface CellRange { + /** + * @docid + * @public + */ + from?: CellAddress; + /** + * @docid + * @public + */ + to?: CellAddress; +} + +/** + * @docid + * @namespace DevExpress.excelExporter + * @hidden + */ +export interface ExcelExportBaseProps { + /** + * @docid + * @default undefined + * @public + */ + worksheet?: object; + /** + * @docid + * @default { row: 1, column: 1 } + * @public + */ + topLeftCell?: CellAddress | string; + /** + * @docid + * @default true + * @public + */ + keepColumnWidths?: boolean; + /** + * @docid + * @public + */ + loadPanel?: ExportLoadPanel; +} + +/** + * @docid + * @namespace DevExpress.excelExporter + * @inherits ExcelExportBaseProps + */ +export interface ExcelExportDataGridProps extends ExcelExportBaseProps { + /** + * @docid + * @default undefined + * @public + */ + component?: dxDataGrid; + /** + * @docid + * @default false + * @public + */ + selectedRowsOnly?: boolean; + /** + * @docid + * @default false + * @public + */ + autoFilterEnabled?: boolean; + /** + * @docid + * @type_function_param1 options:Object + * @type_function_param1_field1 gridCell:ExcelDataGridCell + * @type_function_param1_field2 excelCell:Object + * @public + */ + customizeCell?: ((options: { gridCell?: DataGridCell; excelCell?: any }) => void); +} + +/** + * @docid + * @namespace DevExpress.excelExporter + * @inherits ExcelExportBaseProps + */ +export interface ExcelExportPivotGridProps extends ExcelExportBaseProps { + /** + * @docid + * @default undefined + * @public + */ + component?: dxPivotGrid; + /** + * @docid + * @default true + * @public + */ + mergeRowFieldValues?: boolean; + /** + * @docid + * @default true + * @public + */ + mergeColumnFieldValues?: boolean; + /** + * @docid + * @type_function_param1 options:Object + * @type_function_param1_field1 pivotCell:ExcelPivotGridCell + * @type_function_param1_field2 excelCell:Object + * @public + */ + customizeCell?: ((options: { pivotCell?: PivotGridCell; excelCell?: any }) => void); +} + +/** + * @docid excelExporter.exportDataGrid + * @publicName exportDataGrid(options) + * @return Promise + * @namespace DevExpress.excelExporter + * @static + * @public + */ +export function exportDataGrid(options: ExcelExportDataGridProps): DxPromise; + +/** + * @docid excelExporter.exportPivotGrid + * @publicName exportPivotGrid(options) + * @return Promise + * @namespace DevExpress.excelExporter + * @static + * @public + */ +export function exportPivotGrid(options: ExcelExportPivotGridProps): DxPromise; diff --git a/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.js b/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.js new file mode 100644 index 0000000000000000000000000000000000000000..811a52494b3922e35d6edd0a4c001a66ebd5a3cb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/excel_exporter.js @@ -0,0 +1,22 @@ +import { exportDataGrid } from './exporter/exceljs/export_data_grid'; +import { exportPivotGrid } from './exporter/exceljs/export_pivot_grid'; + +/** +* @name excelExporter +* @section utils +*/ + +/** + * @name ExcelDataGridCell + * @type object + */ + +/** + * @name ExcelPivotGridCell + * @inherits dxPivotGridPivotGridCell + */ + +export { + exportDataGrid, + exportPivotGrid +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter.js b/packages/f-theme-editor/farris-theme-editor/js/exporter.js new file mode 100644 index 0000000000000000000000000000000000000000..28564187569cd5ebe4c1a47dc424558e025ec875 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter.js @@ -0,0 +1,85 @@ +import { fileSaver } from './exporter/file_saver'; +import { ///#DEBUG + __internals, + ///#ENDDEBUG + ExcelCreator, + getData as getExcelData +} from './exporter/excel_creator'; +import { + imageCreator, testFormats, getData as getImageData, + ///#DEBUG + asyncEach + ///#ENDDEBUG +} from './exporter/image_creator'; +import { svgCreator, getData as getSvgData } from './exporter/svg_creator'; +import { isFunction as _isFunction } from './core/utils/type'; +import { Deferred } from './core/utils/deferred'; +import formatConverter from './exporter/excel_format_converter'; +import { getData } from './exporter/pdf_creator'; + +function _export(data, options, getData) { + if(!data) { + return new Deferred().resolve(); + } + + // TODO: Can the following actions be not defined? (since they are provided by a widget not by a user) + const exportingAction = options.exportingAction; + const exportedAction = options.exportedAction; + const fileSavingAction = options.fileSavingAction; + const eventArgs = { + fileName: options.fileName, + format: options.format, + cancel: false + }; + + _isFunction(exportingAction) && exportingAction(eventArgs); + + if(!eventArgs.cancel) { + return getData(data, options).then(blob => { + _isFunction(exportedAction) && exportedAction(); + + if(_isFunction(fileSavingAction)) { + eventArgs.data = blob; + fileSavingAction(eventArgs); + } + + if(!eventArgs.cancel) { + fileSaver.saveAs(eventArgs.fileName, options.format, blob, options.proxyUrl, options.forceProxy); + } + }); + } + + return new Deferred().resolve(); +} + +export { + _export as export, + fileSaver +}; + +export const excel = { + ///#DEBUG + __internals: __internals, + ///#ENDDEBUG + creator: ExcelCreator, + getData: getExcelData, + formatConverter: formatConverter +}; + +export const image = { + ///#DEBUG + asyncEach, + ///#ENDDEBUG + creator: imageCreator, + getData: getImageData, + testFormats: testFormats +}; + +export const pdf = { + getData: getData +}; + +export const svg = { + creator: svgCreator, + getData: getSvgData +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/common/export_load_panel.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/common/export_load_panel.js new file mode 100644 index 0000000000000000000000000000000000000000..ba841c62ce9d02b8ce061c5a477bdc2ce2cc1914 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/common/export_load_panel.js @@ -0,0 +1,49 @@ +import $ from '../../core/renderer'; +import { extend } from '../../core/utils/extend'; +import messageLocalization from '../../localization/message'; +import { isDefined } from '../../core/utils/type'; +import LoadPanel from '../../ui/load_panel'; +import gridUtils from '../../ui/grid_core/ui.grid_core.utils'; + + +const EXPORT_LOAD_PANEL_CLASS = 'dx-export-loadpanel'; +class ExportLoadPanel { + constructor(component, $targetElement, $container, options) { + this._$targetElement = $targetElement; + this._$container = $container; + + this._loadPanel = component._createComponent($('
').addClass(EXPORT_LOAD_PANEL_CLASS).appendTo(this._$container), LoadPanel, this.getOptions(options)); + } + + getDefaultOptions() { + return { + animation: null, + shading: false, + height: 90, + width: 200, + container: this._$container + }; + } + + getOptions(options) { + if(isDefined(options.text)) { + options.message = options.text; + } else { + options.message = messageLocalization.format('dxDataGrid-exporting'); + } + + return extend(this.getDefaultOptions(), options); + } + + show() { + this._loadPanel.option('position', gridUtils.calculateLoadPanelPosition(this._$targetElement)); + this._loadPanel.show(); + } + + dispose() { + $(this._loadPanel.element()).remove(); + delete this._loadPanel; + } +} + +export { ExportLoadPanel }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_alignment_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_alignment_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..f2fc3c814dff84de115782c7bb1b07c95a804454 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_alignment_helper.js @@ -0,0 +1,65 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; + +const cellAlignmentHelper = { + tryCreateTag: function(sourceObj) { + let result = null; + if(isDefined(sourceObj)) { + result = { + vertical: sourceObj.vertical, + wrapText: sourceObj.wrapText, + horizontal: sourceObj.horizontal, + }; + if(cellAlignmentHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + copy: function(source) { + let result = null; + if(isDefined(source)) { + result = {}; + if(source.horizontal !== undefined) { + result.horizontal = source.horizontal; + } + if(source.vertical !== undefined) { + result.vertical = source.vertical; + } + if(source.wrapText !== undefined) { + result.wrapText = source.wrapText; + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return cellAlignmentHelper.isEmpty(leftTag) && cellAlignmentHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.vertical === rightTag.vertical && + leftTag.wrapText === rightTag.wrapText && + leftTag.horizontal === rightTag.horizontal + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || + !isDefined(tag.vertical) && !isDefined(tag.wrapText) && !isDefined(tag.horizontal); + }, + + toXml: function(tag) { + // §18.8.1 alignment (Alignment), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml( + 'alignment', + { + vertical: tag.vertical, // 18.18.88 ST_VerticalAlignment (Vertical Alignment Types) + wrapText: isDefined(tag.wrapText) ? Number(tag.wrapText) : undefined, + horizontal: tag.horizontal // 18.18.40 ST_HorizontalAlignment (Horizontal Alignment Type) + } + ); + } +}; + +export default cellAlignmentHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_format_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_format_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..c16f9074eb7f7215378b343bcd7a96cfd0d15f6d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.cell_format_helper.js @@ -0,0 +1,105 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; +import cellAlignmentHelper from './excel.cell_alignment_helper'; +import fillHelper from './excel.fill_helper'; +import fontHelper from './excel.font_helper'; + +const cellFormatHelper = { + tryCreateTag: function(sourceObj, sharedItemsContainer) { + let result = null; + if(isDefined(sourceObj)) { + let numberFormatId; + if(typeof sourceObj.numberFormat === 'number') { + numberFormatId = sourceObj.numberFormat; + } else { + numberFormatId = sharedItemsContainer.registerNumberFormat(sourceObj.numberFormat); + } + + let fill = sourceObj.fill; + if(!isDefined(fill)) { + fill = fillHelper.tryCreateFillFromSimpleFormat(sourceObj); + } + + result = { + numberFormatId, + alignment: cellAlignmentHelper.tryCreateTag(sourceObj.alignment), + fontId: sharedItemsContainer.registerFont(sourceObj.font), + fillId: sharedItemsContainer.registerFill(fill), + }; + if(cellFormatHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + copy: function(source) { + let result; + if(source === null) { + result = null; + } else if(isDefined(source)) { + result = {}; + + if(source.numberFormat !== undefined) { + result.numberFormat = source.numberFormat; + } + + if(source.fill !== undefined) { + result.fill = fillHelper.copy(source.fill); + } else { + fillHelper.copySimpleFormat(source, result); + } + + if(source.alignment !== undefined) { + result.alignment = cellAlignmentHelper.copy(source.alignment); + } + if(source.font !== undefined) { + result.font = fontHelper.copy(source.font); + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return cellFormatHelper.isEmpty(leftTag) && cellFormatHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.fontId === rightTag.fontId && + leftTag.numberFormatId === rightTag.numberFormatId && + leftTag.fillId === rightTag.fillId && + cellAlignmentHelper.areEqual(leftTag.alignment, rightTag.alignment) + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || + !isDefined(tag.fontId) && + !isDefined(tag.numberFormatId) && + !isDefined(tag.fillId) && + cellAlignmentHelper.isEmpty(tag.alignment); + }, + + toXml: function(tag) { + const isAlignmentEmpty = cellAlignmentHelper.isEmpty(tag.alignment); + let applyNumberFormat; + if(isDefined(tag.numberFormatId)) { + applyNumberFormat = tag.numberFormatId > 0 ? 1 : 0; + } + + // §18.8.45 xf (Format), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml( + 'xf', + { + 'xfId': 0, + applyAlignment: isAlignmentEmpty ? null : 1, + fontId: tag.fontId, + applyNumberFormat, + fillId: tag.fillId, + 'numFmtId': tag.numberFormatId, + }, + isAlignmentEmpty ? null : cellAlignmentHelper.toXml(tag.alignment) + ); + } +}; + +export default cellFormatHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.color_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.color_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..86bb457eda66701b3b79cc6bd8cc2e65c8b9ccf8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.color_helper.js @@ -0,0 +1,89 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; + +const colorHelper = { + _tryConvertColor: function(source) { + if(typeof source !== 'string') { + return source; + } + let result; + if(source.length > 0 && source[0] === '#') { + const colorCode = source.substr(1, source.length); + if(colorCode.length === 6) { // RRGGBB + result = 'FF' + colorCode; + } else if(colorCode.length === 8) { // RRGGBBAA + result = colorCode[6] + colorCode[7] + colorCode.substr(0, 6); + } else { + result = colorCode; + } + } else { + result = source; + } + + return result; + }, + + tryCreateTag: function(sourceObj) { + let result = null; + if(isDefined(sourceObj)) { + if(typeof sourceObj === 'string') { + result = { + rgb: this._tryConvertColor(sourceObj) + }; + } else { + result = { + rgb: this._tryConvertColor(sourceObj.rgb), + theme: sourceObj.theme, + }; + } + if(colorHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + copy: function(source) { + let result = null; + if(isDefined(source)) { + if(typeof source === 'string') { + result = source; + } else { + result = {}; + if(source.rgb !== undefined) { + result.rgb = source.rgb; + } + if(source.theme !== undefined) { + result.theme = source.theme; + } + } + } + return result; + }, + + isEmpty: function(tag) { + return !isDefined(tag) || + !isDefined(tag.rgb) && + !isDefined(tag.theme); + }, + + areEqual: function(leftTag, rightTag) { + return colorHelper.isEmpty(leftTag) && colorHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.rgb === rightTag.rgb && + leftTag.theme === rightTag.theme + ); + }, + + toXml: function(tagName, tag) { + // 'CT_Color', 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml(tagName, + { + rgb: tag.rgb, + theme: tag.theme + }); + }, +}; + +export default colorHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.doc_comments.d.ts b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.doc_comments.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..ce752bb13b991ce647aca3548595290cf397ec5a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.doc_comments.d.ts @@ -0,0 +1,38 @@ +/** + * @docid + * @deprecated + * @type object + */ +export interface ExcelFont { + /** + * @docid + * @public + */ + bold?: boolean; + /** + * @docid + * @public + */ + color?: string; + /** + * @docid + * @public + */ + italic?: boolean; + /** + * @docid + * @public + */ + name?: string; + /** + * @docid + * @public + */ + size?: number; + /** + * @docid + * @type Enums.ExcelFontUnderlineType + * @public + */ + underline?: 'double' | 'doubleAccounting' | 'none' | 'single' | 'singleAccounting'; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.file.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.file.js new file mode 100644 index 0000000000000000000000000000000000000000..4ba49e7d69dd572b73d5acc3a0f9e3149cd38e00 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.file.js @@ -0,0 +1,143 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; +import cellFormatHelper from './excel.cell_format_helper'; +import fillHelper from './excel.fill_helper'; +import fontHelper from './excel.font_helper'; +import numberFormatHelper from './excel.number_format_helper'; + +export default class ExcelFile { + + constructor() { + this._cellFormatTags = []; + this._fillTags = []; + this._fontTags = []; + this._numberFormatTags = []; + + // the [0, 1] indexes are reserved: + // - https://stackoverflow.com/questions/11116176/cell-styles-in-openxml-spreadsheet-spreadsheetml + // - https://social.msdn.microsoft.com/Forums/office/en-US/a973335c-9f9b-4e70-883a-02a0bcff43d2/coloring-cells-in-excel-sheet-using-openxml-in-c + this._fillTags.push(fillHelper.tryCreateTag({ patternFill: { patternType: 'none' } })); + } + + registerCellFormat(cellFormat) { + let result; + const cellFormatTag = cellFormatHelper.tryCreateTag( + cellFormat, + { + registerFill: this.registerFill.bind(this), + registerFont: this.registerFont.bind(this), + registerNumberFormat: this.registerNumberFormat.bind(this) + }); + if(isDefined(cellFormatTag)) { + for(let i = 0; i < this._cellFormatTags.length; i++) { + if(cellFormatHelper.areEqual(this._cellFormatTags[i], cellFormatTag)) { + result = i; + break; + } + } + if(result === undefined) { + result = this._cellFormatTags.push(cellFormatTag) - 1; + } + } + return result; + } + + static copyCellFormat(source) { + return cellFormatHelper.copy(source); + } + + generateCellFormatsXml() { + // §18.8.10 cellXfs (Cell Formats), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + const cellFormatTagsAsXmlStringsArray = this._cellFormatTags.map(tag => cellFormatHelper.toXml(tag)); + return tagHelper.toXml('cellXfs', { count: cellFormatTagsAsXmlStringsArray.length }, cellFormatTagsAsXmlStringsArray.join('')); + } + + registerFill(fill) { + let result; + const fillTag = fillHelper.tryCreateTag(fill); + if(isDefined(fillTag)) { + for(let i = 0; i < this._fillTags.length; i++) { + if(fillHelper.areEqual(this._fillTags[i], fillTag)) { + result = i; + break; + } + } + if(result === undefined) { + if(this._fillTags.length < 2) { + // the [0, 1] indexes are reserved: + // - https://stackoverflow.com/questions/11116176/cell-styles-in-openxml-spreadsheet-spreadsheetml + // - https://social.msdn.microsoft.com/Forums/office/en-US/a973335c-9f9b-4e70-883a-02a0bcff43d2/coloring-cells-in-excel-sheet-using-openxml-in-c + this._fillTags.push(fillHelper.tryCreateTag({ patternFill: { patternType: 'Gray125' } })); // Index 1 - reserved + } + result = this._fillTags.push(fillTag) - 1; + } + } + return result; + } + + generateFillsXml() { + // §18.8.21, 'fills (Fills)', 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + const tagsAsXmlStringsArray = this._fillTags.map(tag => fillHelper.toXml(tag)); + return tagHelper.toXml('fills', { count: tagsAsXmlStringsArray.length }, tagsAsXmlStringsArray.join('')); + } + + registerFont(font) { + let result; + const fontTag = fontHelper.tryCreateTag(font); + if(isDefined(fontTag)) { + for(let i = 0; i < this._fontTags.length; i++) { + if(fontHelper.areEqual(this._fontTags[i], fontTag)) { + result = i; + break; + } + } + if(result === undefined) { + result = this._fontTags.push(fontTag) - 1; + } + } + return result; + } + + generateFontsXml() { + // §18.8.23, 'fonts (Fonts)', 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + const xmlStringsArray = this._fontTags.map(tag => fontHelper.toXml(tag)); + return tagHelper.toXml('fonts', { count: xmlStringsArray.length }, xmlStringsArray.join('')); + } + + _convertNumberFormatIndexToId(index) { + // Number format ids less than 164 (magic const) represent builtin formats. + // §18.8.30 numFmt (Number Format), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + const CUSTOM_FORMAT_ID_START_VALUE = 165; + return CUSTOM_FORMAT_ID_START_VALUE + index; + } + + registerNumberFormat(numberFormat) { + let result; + const tag = numberFormatHelper.tryCreateTag(numberFormat); + if(isDefined(tag)) { + for(let i = 0; i < this._numberFormatTags.length; i++) { + if(numberFormatHelper.areEqual(this._numberFormatTags[i], tag)) { + result = this._numberFormatTags[i][numberFormatHelper.ID_PROPERTY_NAME]; + break; + } + } + if(result === undefined) { + tag[numberFormatHelper.ID_PROPERTY_NAME] = this._convertNumberFormatIndexToId(this._numberFormatTags.length); + result = tag[numberFormatHelper.ID_PROPERTY_NAME]; + this._numberFormatTags.push(tag); + } + } + + return result; + } + + generateNumberFormatsXml() { + if(this._numberFormatTags.length > 0) { + // §18.8.31 numFmts (Number Formats) + const xmlStringsArray = this._numberFormatTags.map((tag) => numberFormatHelper.toXml(tag)); + return tagHelper.toXml('numFmts', { count: xmlStringsArray.length }, xmlStringsArray.join('')); + } else { + return ''; + } + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.fill_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.fill_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..793a830ae23388d0a95f866656cc3056ed6a06d2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.fill_helper.js @@ -0,0 +1,87 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; +import patternFillHelper from './excel.pattern_fill_helper'; + +const fillHelper = { + tryCreateTag: function(sourceObj) { + let result = null; + if(isDefined(sourceObj)) { + result = { patternFill: patternFillHelper.tryCreateTag(sourceObj.patternFill) }; + if(fillHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + tryCreateFillFromSimpleFormat: function({ backgroundColor, fillPatternType, fillPatternColor } = {}) { + if(isDefined(backgroundColor) && !(isDefined(fillPatternType) && isDefined(fillPatternColor))) { + return { + patternFill: { + patternType: 'solid', + foregroundColor: { + rgb: backgroundColor + } + } + }; + } else if(isDefined(fillPatternType) && isDefined(fillPatternColor)) { + return { + patternFill: { + patternType: fillPatternType, + foregroundColor: { + rgb: fillPatternColor + }, + backgroundColor: { + rgb: backgroundColor + }, + } + }; + } + }, + + copySimpleFormat: function(source, target) { + if(source.backgroundColor !== undefined) { + target.backgroundColor = source.backgroundColor; + } + if(source.fillPatternType !== undefined) { + target.fillPatternType = source.fillPatternType; + } + if(source.fillPatternColor !== undefined) { + target.fillPatternColor = source.fillPatternColor; + } + }, + + copy: function(source) { + let result = null; + if(isDefined(source)) { + result = {}; + if(source.patternFill !== undefined) { + result.patternFill = patternFillHelper.copy(source.patternFill); + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return fillHelper.isEmpty(leftTag) && fillHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + patternFillHelper.areEqual(leftTag.patternFill, rightTag.patternFill) + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || patternFillHelper.isEmpty(tag.patternFill); + }, + + toXml: function(tag) { + // §18.8.20 fill (Fill), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml( + 'fill', + {}, + patternFillHelper.toXml(tag.patternFill) + ); + } +}; + +export default fillHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.font_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.font_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..26f52d6d7e9461d6c9885016a580db413b8f8f50 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.font_helper.js @@ -0,0 +1,106 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; +import colorHelper from './excel.color_helper'; + +const fontHelper = { + tryCreateTag: function(sourceObj) { + let result = null; + if(isDefined(sourceObj)) { + result = { + size: sourceObj.size, + name: sourceObj.name, + family: sourceObj.family, + scheme: sourceObj.scheme, + bold: sourceObj.bold, + italic: sourceObj.italic, + underline: sourceObj.underline, + color: colorHelper.tryCreateTag(sourceObj.color), + }; + if(fontHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + copy: function(source) { + let result = null; + if(isDefined(source)) { + result = {}; + if(source.size !== undefined) { + result.size = source.size; + } + if(source.name !== undefined) { + result.name = source.name; + } + if(source.family !== undefined) { + result.family = source.family; + } + if(source.scheme !== undefined) { + result.scheme = source.scheme; + } + if(source.bold !== undefined) { + result.bold = source.bold; + } + if(source.italic !== undefined) { + result.italic = source.italic; + } + if(source.underline !== undefined) { + result.underline = source.underline; + } + if(source.color !== undefined) { + result.color = colorHelper.copy(source.color); + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return fontHelper.isEmpty(leftTag) && fontHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.size === rightTag.size && + leftTag.name === rightTag.name && + leftTag.family === rightTag.family && + leftTag.scheme === rightTag.scheme && + (leftTag.bold === rightTag.bold || !leftTag.bold === !rightTag.bold) && + (leftTag.italic === rightTag.italic || !leftTag.italic === !rightTag.italic) && + leftTag.underline === rightTag.underline && + colorHelper.areEqual(leftTag.color, rightTag.color) + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || + !isDefined(tag.size) && + !isDefined(tag.name) && + !isDefined(tag.family) && + !isDefined(tag.scheme) && + (!isDefined(tag.bold) || !tag.bold) && + (!isDefined(tag.italic) || !tag.italic) && + !isDefined(tag.underline) && + colorHelper.isEmpty(tag.color); + }, + + toXml: function(tag) { + const content = [ + isDefined(tag.bold) && tag.bold ? tagHelper.toXml('b', {}) : '', // 18.8.2 b (Bold) + isDefined(tag.size) ? tagHelper.toXml('sz', { 'val': tag.size }) : '', // 18.4.11 sz (Font Size) + isDefined(tag.color) ? colorHelper.toXml('color', tag.color) : '', + isDefined(tag.name) ? tagHelper.toXml('name', { 'val': tag.name }) : '', // 18.8.29 name (Font Name) + isDefined(tag.family) ? tagHelper.toXml('family', { 'val': tag.family }) : '', // 18.8.18 family (Font Family) + isDefined(tag.scheme) ? tagHelper.toXml('scheme', { 'val': tag.scheme }) : '', // 18.8.35 scheme (Scheme) + isDefined(tag.italic) && tag.italic ? tagHelper.toXml('i', {}) : '', // 18.8.26 i (Italic) + isDefined(tag.underline) ? tagHelper.toXml('u', { 'val': tag.underline }) : '', // 18.4.13 u (Underline) + ].join(''); + + // §18.8.22, 'font (Font)', 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml( + 'font', + {}, + content + ); + } +}; + +export default fontHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.number_format_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.number_format_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..c4d09c144d6bc03f8ed5c795872a0cf693e501a8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.number_format_helper.js @@ -0,0 +1,43 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; + +const numberFormatHelper = { + ID_PROPERTY_NAME: 'id', + + tryCreateTag: function(sourceObj) { + let result = null; + if(typeof sourceObj === 'string') { + result = { formatCode: sourceObj }; + + if(numberFormatHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return numberFormatHelper.isEmpty(leftTag) && numberFormatHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.formatCode === rightTag.formatCode + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || !isDefined(tag.formatCode) || tag.formatCode === ''; + }, + + toXml: function(tag) { + // §18.8.30 numFmt (Number Format) + return tagHelper.toXml( + 'numFmt', + { + 'numFmtId': tag[numberFormatHelper.ID_PROPERTY_NAME], + formatCode: tag.formatCode // §21.2.2.71 formatCode (Format Code), §18.8.31 numFmts (Number Formats) + } + ); + } +}; + +export default numberFormatHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.pattern_fill_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.pattern_fill_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..2e9b4afd6dbf8fa006557913ca474cf28449ea48 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.pattern_fill_helper.js @@ -0,0 +1,68 @@ +import { isDefined } from '../../core/utils/type'; +import tagHelper from './excel.tag_helper'; +import colorHelper from './excel.color_helper'; + +const patternFillHelper = { + tryCreateTag: function(sourceObj) { + let result = null; + if(isDefined(sourceObj)) { + result = { + patternType: sourceObj.patternType, + backgroundColor: colorHelper.tryCreateTag(sourceObj.backgroundColor), + foregroundColor: colorHelper.tryCreateTag(sourceObj.foregroundColor), + }; + if(patternFillHelper.isEmpty(result)) { + result = null; + } + } + return result; + }, + + copy: function(source) { + let result = null; + if(isDefined(source)) { + result = {}; + if(source.patternType !== undefined) { + result.patternType = source.patternType; + } + if(source.backgroundColor !== undefined) { + result.backgroundColor = colorHelper.copy(source.backgroundColor); + } + if(source.foregroundColor !== undefined) { + result.foregroundColor = colorHelper.copy(source.foregroundColor); + } + } + return result; + }, + + areEqual: function(leftTag, rightTag) { + return patternFillHelper.isEmpty(leftTag) && patternFillHelper.isEmpty(rightTag) || + ( + isDefined(leftTag) && isDefined(rightTag) && + leftTag.patternType === rightTag.patternType && + colorHelper.areEqual(leftTag.backgroundColor, rightTag.backgroundColor) && + colorHelper.areEqual(leftTag.foregroundColor, rightTag.foregroundColor) + ); + }, + + isEmpty: function(tag) { + return !isDefined(tag) || !isDefined(tag.patternType); + }, + + toXml: function(tag) { + const content = + [ + isDefined(tag.foregroundColor) ? colorHelper.toXml('fgColor', tag.foregroundColor) : '', // 18.8.19 fgColor (Foreground Color) + isDefined(tag.backgroundColor) ? colorHelper.toXml('bgColor', tag.backgroundColor) : '', // 18.8.3 bgColor (Background Color) + ].join(''); + + // §18.8.32 patternFill (Pattern), 'ECMA-376 5th edition Part 1' (http://www.ecma-international.org/publications/standards/Ecma-376.htm) + return tagHelper.toXml( + 'patternFill', + { patternType: tag.patternType }, // 18.18.55 ST_PatternType (Pattern Type) + content + ); + } +}; + +export default patternFillHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.tag_helper.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.tag_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..497f9dac723dac762ed4da6071c6b60662a9e7cf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel/excel.tag_helper.js @@ -0,0 +1,24 @@ +import { isDefined } from '../../core/utils/type'; + +const tagHelper = { + toXml: function(tagName, attributes, content) { + const result = ['<', tagName]; + + for(const attributeName in attributes) { + const attributeValue = attributes[attributeName]; + if(isDefined(attributeValue)) { + result.push(' ', attributeName, '="', attributeValue, '"'); + } + } + + if(isDefined(content) && content !== '') { + result.push('>', content, ''); + } else { + result.push(' />'); + } + + return result.join(''); + } +}; + +export default tagHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_creator.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_creator.js new file mode 100644 index 0000000000000000000000000000000000000000..146e504eadbc19bd5368589b4ef56ff84e24fb61 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_creator.js @@ -0,0 +1,732 @@ +import Class from '../core/class'; +import { getWindow } from '../core/utils/window'; +import { isDefined, isString, isDate, isBoolean, isObject, isFunction } from '../core/utils/type'; +import { extend } from '../core/utils/extend'; +import errors from '../ui/widget/ui.errors'; +import { encodeHtml } from '../core/utils/string'; +import JSZip from 'jszip'; +import { MIME_TYPES } from './file_saver'; +import excelFormatConverter from './excel_format_converter'; +import ExcelFile from './excel/excel.file'; +import { Deferred } from '../core/utils/deferred'; + +const XML_TAG = ''; +const GROUP_SHEET_PR_XML = ''; +const SINGLE_SHEET_PR_XML = ''; +const BASE_STYLE_XML2 = '' + + '' + + ''; +const OPEN_XML_FORMAT_URL = 'http://schemas.openxmlformats.org'; +const RELATIONSHIP_PART_NAME = 'rels'; +const XL_FOLDER_NAME = 'xl'; +const WORKBOOK_FILE_NAME = 'workbook.xml'; +const CONTENTTYPES_FILE_NAME = '[Content_Types].xml'; +const SHAREDSTRING_FILE_NAME = 'sharedStrings.xml'; +const STYLE_FILE_NAME = 'styles.xml'; +const WORKSHEETS_FOLDER = 'worksheets'; +const WORKSHEET_FILE_NAME = 'sheet1.xml'; +const WORKSHEET_HEADER_XML = ''; +const VALID_TYPES = { + // §18.18.11, ST_CellType (Cell Type) + 'boolean': 'b', + 'date': 'd', + 'number': 'n', + 'string': 's' +}; +const EXCEL_START_TIME = Date.UTC(1899, 11, 30); +const DAYS_COUNT_BEFORE_29_FEB_1900 = 60; + +const MAX_DIGIT_WIDTH_IN_PIXELS = 7; // Calibri font with 11pt size +const UNSUPPORTED_FORMAT_MAPPING = { + quarter: 'shortDate', + quarterAndYear: 'shortDate', + minute: 'longTime', + millisecond: 'longTime' +}; + +export const ExcelCreator = Class.inherit({ + _getXMLTag: function(tagName, attributes, content) { + let result = '<' + tagName; + let i; + const length = attributes.length; + let attr; + + for(i = 0; i < length; i++) { + attr = attributes[i]; + if(attr.value !== undefined) { + result = result + ' ' + attr.name + '="' + attr.value + '"'; + } + } + + return isDefined(content) ? result + '>' + content + '' : result + ' />'; + }, + + _convertToExcelCellRef: function(zeroBasedRowIndex, zeroBasedCellIndex) { + // pass (0, 0) to get 'A1' + let columnName = ''; + const max = 26; + let charCode; + let isCellIndexFound; + + while(!isCellIndexFound) { + charCode = 65 + ((zeroBasedCellIndex >= max) ? (zeroBasedCellIndex % max) : Math.ceil(zeroBasedCellIndex)); + columnName = String.fromCharCode(charCode) + columnName; + + if(zeroBasedCellIndex >= max) { + zeroBasedCellIndex = Math.floor(zeroBasedCellIndex / max) - 1; + } else { + isCellIndexFound = true; + } + } + + return columnName + (zeroBasedRowIndex + 1); + }, + + _convertToExcelCellRefAndTrackMaxIndex: function(rowIndex, cellIndex) { + if(this._maxRowIndex < Number(rowIndex)) { + this._maxRowIndex = Number(rowIndex); + } + + if(this._maxColumnIndex < Number(cellIndex)) { + this._maxColumnIndex = Number(cellIndex); + } + + return this._convertToExcelCellRef(rowIndex, cellIndex); + }, + + _getDataType: function(dataType) { + return VALID_TYPES[dataType] || VALID_TYPES.string; + }, + + _tryGetExcelCellDataType: function(object) { + if(isDefined(object)) { + if((typeof object === 'number')) { + if(isFinite(object)) { + return VALID_TYPES['number']; + } else { + return VALID_TYPES['string']; + } + } else if(isString(object)) { + return VALID_TYPES['string']; + } else if(isDate(object)) { + return VALID_TYPES['number']; + } else if(isBoolean(object)) { + return VALID_TYPES['boolean']; + } + } + }, + + _formatObjectConverter: function(format, dataType) { + const result = { + format: format, + precision: format && format.precision, + dataType: dataType + }; + + if(isObject(format)) { + return extend(result, format, { + format: format.formatter || format.type, + currency: format.currency + }); + } + + return result; + }, + _tryConvertToExcelNumberFormat: function(format, dataType) { + const newFormat = this._formatObjectConverter(format, dataType); + + format = newFormat.format; + const currency = newFormat.currency; + dataType = newFormat.dataType; + + if(isDefined(format) && dataType === 'date') { + format = UNSUPPORTED_FORMAT_MAPPING[format && format.type || format] || format; + } + + return excelFormatConverter.convertFormat(format, newFormat.precision, dataType, currency); + }, + + _appendString: function(value) { + if(isDefined(value)) { + value = String(value); + if(value.length) { + value = encodeHtml(value); + if(this._stringHash[value] === undefined) { + this._stringHash[value] = this._stringArray.length; + this._stringArray.push(value); + } + return this._stringHash[value]; + } + } + }, + + _tryGetExcelDateValue: function(date) { + let days; + let totalTime; + + if(isDate(date)) { + days = Math.floor((Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - EXCEL_START_TIME) / (1000 * 60 * 60 * 24)); + if(days < DAYS_COUNT_BEFORE_29_FEB_1900) { + days--; + } + + totalTime = (date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds()) / (24 * 3600); + return days + totalTime; + } + }, + + _prepareValue: function(rowIndex, cellIndex) { + const dataProvider = this._dataProvider; + const { cellSourceData } = dataProvider.getCellData(rowIndex, cellIndex) || {}; + + let { value } = dataProvider.getCellData(rowIndex, cellIndex) || {}; + let sourceValue; + let type = this._getDataType(dataProvider.getCellType(rowIndex, cellIndex)); + + if(type === VALID_TYPES.date && !isDate(value)) { + type = VALID_TYPES.string; + } + + switch(type) { + case VALID_TYPES.string: + sourceValue = value; + value = this._appendString(value); + break; + + case VALID_TYPES.date: + sourceValue = value; + value = this._tryGetExcelDateValue(value); + type = VALID_TYPES.number; + break; + } + + return { + value: value, + type: type, + sourceValue, + cellSourceData: cellSourceData + }; + }, + + _callCustomizeExcelCell: function({ dataProvider, value, style, sourceData }) { + const styleCopy = ExcelFile.copyCellFormat(style); + + const args = { + value: value, + numberFormat: styleCopy.numberFormat, + clearStyle: function() { + this.horizontalAlignment = null; + this.verticalAlignment = null; + this.wrapTextEnabled = null; + this.font = null; + this.numberFormat = null; + } + }; + + if(isDefined(styleCopy)) { + if(isDefined(styleCopy.alignment)) { + args.horizontalAlignment = styleCopy.alignment.horizontal; + args.verticalAlignment = styleCopy.alignment.vertical; + args.wrapTextEnabled = styleCopy.alignment.wrapText; + } + args.backgroundColor = styleCopy.backgroundColor; + args.fillPatternType = styleCopy.fillPatternType; + args.fillPatternColor = styleCopy.fillPatternColor; + args.font = styleCopy.font; + } + + dataProvider.customizeExcelCell(args, sourceData); + + const newStyle = styleCopy || {}; + + newStyle.font = args.font; + + newStyle.alignment = newStyle.alignment || {}; + newStyle.alignment.horizontal = args.horizontalAlignment; + newStyle.alignment.vertical = args.verticalAlignment; + newStyle.alignment.wrapText = args.wrapTextEnabled; + + newStyle.backgroundColor = args.backgroundColor; + newStyle.fillPatternType = args.fillPatternType; + newStyle.fillPatternColor = args.fillPatternColor; + + newStyle.numberFormat = args.numberFormat; + + return { + value: args.value, + style: newStyle, + }; + }, + + _getDataArray: function() { + const that = this; + let rowIndex; + let cellIndex; + let cellsArray; + let cellData; + const result = []; + const dataProvider = that._dataProvider; + const rowsLength = dataProvider.getRowsCount(); + const columns = dataProvider.getColumns(); + let cellsLength; + + for(rowIndex = 0; rowIndex < rowsLength; rowIndex++) { + cellsArray = []; + cellsLength = columns.length; + + for(cellIndex = 0; cellIndex !== cellsLength; cellIndex++) { + cellData = that._prepareValue(rowIndex, cellIndex); + const styleArrayIndex = dataProvider.getStyleId(rowIndex, cellIndex); + let cellStyleId = this._styleArrayIndexToCellStyleIdMap[styleArrayIndex]; + if(dataProvider.hasCustomizeExcelCell && dataProvider.hasCustomizeExcelCell()) { + const value = cellData.sourceValue || cellData.value; + const modifiedExcelCell = this._callCustomizeExcelCell({ + dataProvider: dataProvider, + value: value, + style: that._styleArray[styleArrayIndex], + sourceData: cellData.cellSourceData, + }); + + if(modifiedExcelCell.value !== value) { + if(typeof modifiedExcelCell.value !== typeof value || (typeof modifiedExcelCell.value === 'number') && !isFinite(modifiedExcelCell.value)) { + const cellDataType = this._tryGetExcelCellDataType(modifiedExcelCell.value); + if(isDefined(cellDataType)) { + cellData.type = cellDataType; + } + } + // 18.18.11 ST_CellType (Cell Type) + switch(cellData.type) { + case VALID_TYPES.string: + cellData.value = this._appendString(modifiedExcelCell.value); + break; + case VALID_TYPES.date: + cellData.value = modifiedExcelCell.value; + break; + case VALID_TYPES.number: { + let newValue = modifiedExcelCell.value; + const excelDateValue = this._tryGetExcelDateValue(newValue); + if(isDefined(excelDateValue)) { + newValue = excelDateValue; + } + cellData.value = newValue; + break; + } + default: + cellData.value = modifiedExcelCell.value; + } + } + cellStyleId = this._excelFile.registerCellFormat(modifiedExcelCell.style); + } + cellsArray.push({ + style: cellStyleId, + value: cellData.value, + type: cellData.type + }); + } + + if(!that._needSheetPr && dataProvider.getGroupLevel(rowIndex) > 0) { + that._needSheetPr = true; + } + + result.push(cellsArray); + } + + return result; + }, + + _calculateWidth: function(pixelsWidth) { + pixelsWidth = parseInt(pixelsWidth, 10); + if(!pixelsWidth || pixelsWidth < 5) pixelsWidth = 100; + return Math.min(255, Math.floor((pixelsWidth - 5) / MAX_DIGIT_WIDTH_IN_PIXELS * 100 + 0.5) / 100); + }, + + _prepareStyleData: function() { + const that = this; + const styles = that._dataProvider.getStyles(); + + that._dataProvider.getColumns().forEach(function(column) { + that._colsArray.push(that._calculateWidth(column.width)); + }); + + const fonts = [ + { size: 11, color: { theme: 1 }, name: 'Calibri', family: 2, scheme: 'minor', bold: false }, + { size: 11, color: { theme: 1 }, name: 'Calibri', family: 2, scheme: 'minor', bold: true } + ]; + this._excelFile.registerFont(fonts[0]); + this._excelFile.registerFont(fonts[1]); + + styles.forEach(function(style) { + let numberFormat = that._tryConvertToExcelNumberFormat(style.format, style.dataType); + if(!isDefined(numberFormat)) { + numberFormat = 0; + } + that._styleArray.push({ + font: fonts[Number(!!style.bold)], + numberFormat, + alignment: { + vertical: 'top', + wrapText: !!style.wrapText, + horizontal: style.alignment || 'left' + } + }); + }); + that._styleArrayIndexToCellStyleIdMap = that._styleArray.map(item => this._excelFile.registerCellFormat(item)); + }, + + _prepareCellData: function() { + this._cellsArray = this._getDataArray(); + }, + + _createXMLRelationships: function(xmlRelationships) { + return this._getXMLTag('Relationships', [{ + name: 'xmlns', + value: OPEN_XML_FORMAT_URL + '/package/2006/relationships' + }], xmlRelationships); + }, + + _createXMLRelationship: function(id, type, target) { + return this._getXMLTag('Relationship', [ + { name: 'Id', value: 'rId' + id }, + { name: 'Type', value: OPEN_XML_FORMAT_URL + '/officeDocument/2006/relationships/' + type }, + { name: 'Target', value: target } + ]); + }, + + _getWorkbookContent: function() { + const content = '' + + '' + + 'Sheet!$1:$1' + + ''; + return XML_TAG + this._getXMLTag('workbook', [{ + name: 'xmlns:r', + value: OPEN_XML_FORMAT_URL + '/officeDocument/2006/relationships' + }, { + name: 'xmlns', + value: OPEN_XML_FORMAT_URL + '/spreadsheetml/2006/main' + }], content); + }, + + _getContentTypesContent: function() { + return XML_TAG + '' + + '' + + '' + + ''; + }, + + _generateStylesXML: function() { + const that = this; + const folder = that._zip.folder(XL_FOLDER_NAME); + let XML = ''; + + XML = XML + this._excelFile.generateNumberFormatsXml(); + XML = XML + this._excelFile.generateFontsXml(); + XML = XML + this._excelFile.generateFillsXml(); + XML = XML + BASE_STYLE_XML2; + + XML = XML + this._excelFile.generateCellFormatsXml(); + + XML = XML + that._getXMLTag('cellStyles', [{ name: 'count', value: 1 }], that._getXMLTag('cellStyle', [ + { name: 'name', value: 'Normal' }, + { name: 'xfId', value: 0 }, + { name: 'builtinId', value: 0 } + ])); + + XML = XML_TAG + that._getXMLTag('styleSheet', [{ name: 'xmlns', value: OPEN_XML_FORMAT_URL + '/spreadsheetml/2006/main' }], XML); + folder.file(STYLE_FILE_NAME, XML); + + that._styleArray = []; + }, + + _generateStringsXML: function() { + const folder = this._zip.folder(XL_FOLDER_NAME); + let stringIndex; + const stringsLength = this._stringArray.length; + let sharedStringXml = XML_TAG; + + for(stringIndex = 0; stringIndex < stringsLength; stringIndex++) { + this._stringArray[stringIndex] = this._getXMLTag('si', [], this._getXMLTag('t', [], this._stringArray[stringIndex])); + } + sharedStringXml = sharedStringXml + this._getXMLTag('sst', [ + { name: 'xmlns', value: OPEN_XML_FORMAT_URL + '/spreadsheetml/2006/main' }, + { name: 'count', value: this._stringArray.length }, + { name: 'uniqueCount', value: this._stringArray.length } + ], this._stringArray.join('')); + + folder.file(SHAREDSTRING_FILE_NAME, sharedStringXml); + + this._stringArray = []; + }, + + _getPaneXML: function() { + const attributes = [{ name: 'activePane', value: 'bottomLeft' }, { name: 'state', value: 'frozen' }]; + const frozenArea = this._dataProvider.getFrozenArea(); + + if(!(frozenArea.x || frozenArea.y)) return ''; + + if(frozenArea.x) { + attributes.push({ name: 'xSplit', value: frozenArea.x }); + } + if(frozenArea.y) { + attributes.push({ name: 'ySplit', value: frozenArea.y }); + } + + attributes.push({ name: 'topLeftCell', value: this._convertToExcelCellRefAndTrackMaxIndex(frozenArea.y, frozenArea.x) }); + + return this._getXMLTag('pane', attributes); + }, + + _getAutoFilterXML: function(maxCellIndex) { + if(this._options.autoFilterEnabled) { + // 18.3.1.2 autoFilter (AutoFilter Settings) + return ''; + } + + return ''; + }, + + _getIgnoredErrorsXML: function(maxCellIndex) { + if(this._options.ignoreErrors) { + return ''; + } + + return ''; + }, + + _generateWorksheetXML: function() { + let colIndex; + let rowIndex; + let cellData; + let xmlCells; + let xmlRows = []; + const rowsLength = this._cellsArray.length; + let cellsLength; + const colsLength = this._colsArray.length; + const rSpans = '1:' + colsLength; + const headerRowCount = this._dataProvider.getHeaderRowCount ? this._dataProvider.getHeaderRowCount() : 1; + let xmlResult = [WORKSHEET_HEADER_XML]; + + xmlResult.push((this._needSheetPr) ? GROUP_SHEET_PR_XML : SINGLE_SHEET_PR_XML); + xmlResult.push(''); // 18.3.1.35 dimension (Worksheet Dimensions) + xmlResult.push(''); + xmlResult.push(this._getPaneXML()); + xmlResult.push(''); + xmlResult.push(''); + + for(colIndex = 0; colIndex < colsLength; colIndex++) { + this._colsArray[colIndex] = this._getXMLTag('col', [ + { name: 'width', value: this._colsArray[colIndex] }, + { name: 'min', value: Number(colIndex) + 1 }, + { name: 'max', value: Number(colIndex) + 1 }, + { name: 'customWidth', value: 1 } + ]); + } + + xmlResult.push(this._getXMLTag('cols', [], this._colsArray.join('')) + ''); + + for(rowIndex = 0; rowIndex < rowsLength; rowIndex++) { + xmlCells = []; + cellsLength = this._cellsArray[rowIndex].length; + + for(colIndex = 0; colIndex < cellsLength; colIndex++) { + rowIndex = Number(rowIndex); + cellData = this._cellsArray[rowIndex][colIndex]; + + xmlCells.push(this._getXMLTag('c', [ // 18.3.1.4 c (Cell) + { name: 'r', value: this._convertToExcelCellRefAndTrackMaxIndex(rowIndex, colIndex) }, + { name: 's', value: cellData.style }, + { name: 't', value: cellData.type } // 18.18.11 ST_CellType (Cell Type) + ], (isDefined(cellData.value)) ? this._getXMLTag('v', [], cellData.value) : null)); + } + xmlRows.push(this._getXMLTag('row', [ + { name: 'r', value: Number(rowIndex) + 1 }, + { name: 'spans', value: rSpans }, + { + name: 'outlineLevel', + value: (rowIndex >= headerRowCount) ? this._dataProvider.getGroupLevel(rowIndex) : 0 + }, + { name: 'x14ac:dyDescent', value: '0.25' } + ], xmlCells.join(''))); + + this._cellsArray[rowIndex] = null; + if(xmlRows.length > 10000) { + xmlResult.push(xmlRows.join('')); + xmlRows = []; + } + } + + xmlResult.push(xmlRows.join('')); + xmlRows = []; + + const rightBottomCellRef = this._convertToExcelCellRef(this._maxRowIndex, this._maxColumnIndex); + xmlResult.push( + '' + + this._getAutoFilterXML(rightBottomCellRef) + + this._generateMergingXML() + + this._getIgnoredErrorsXML(rightBottomCellRef) + + ''); + + this._zip.folder(XL_FOLDER_NAME).folder(WORKSHEETS_FOLDER).file(WORKSHEET_FILE_NAME, xmlResult.join('')); + + this._colsArray = []; + this._cellsArray = []; + xmlResult = []; + }, + + _generateMergingXML: function() { + let k; + let l; + let cellIndex; + let rowIndex; + const rowsLength = isDefined(this._dataProvider.getHeaderRowCount) ? this._dataProvider.getHeaderRowCount() : this._dataProvider.getRowsCount(); + const columnsLength = this._dataProvider.getColumns().length; + const usedArea = []; + const mergeArray = []; + let mergeIndex; + let mergeXML = ''; + + for(rowIndex = 0; rowIndex < rowsLength; rowIndex++) { + for(cellIndex = 0; cellIndex !== columnsLength; cellIndex++) { + if(!isDefined(usedArea[rowIndex]) || !isDefined(usedArea[rowIndex][cellIndex])) { + const cellMerge = this._dataProvider.getCellMerging(rowIndex, cellIndex); + if(cellMerge.colspan || cellMerge.rowspan) { + mergeArray.push({ + start: this._convertToExcelCellRefAndTrackMaxIndex(rowIndex, cellIndex), + end: this._convertToExcelCellRefAndTrackMaxIndex(rowIndex + (cellMerge.rowspan || 0), cellIndex + (cellMerge.colspan || 0)) + }); + for(k = rowIndex; k <= rowIndex + cellMerge.rowspan || 0; k++) { + for(l = cellIndex; l <= cellIndex + cellMerge.colspan || 0; l++) { + if(!isDefined(usedArea[k])) { + usedArea[k] = []; + } + usedArea[k][l] = true; + } + } + } + } + } + } + + const mergeArrayLength = mergeArray.length; + for(mergeIndex = 0; mergeIndex < mergeArrayLength; mergeIndex++) { + mergeXML = mergeXML + this._getXMLTag('mergeCell', [{ name: 'ref', value: mergeArray[mergeIndex].start + ':' + mergeArray[mergeIndex].end }]); + } + + return mergeXML.length ? this._getXMLTag('mergeCells', [{ name: 'count', value: mergeArrayLength }], mergeXML) : ''; + }, + + _generateCommonXML: function() { + const relsFileContent = XML_TAG + this._createXMLRelationships(this._createXMLRelationship(1, 'officeDocument', 'xl/' + WORKBOOK_FILE_NAME)); + const folder = this._zip.folder(XL_FOLDER_NAME); + let relsXML = XML_TAG; + + this._zip.folder('_' + RELATIONSHIP_PART_NAME).file('.' + RELATIONSHIP_PART_NAME, relsFileContent); + const xmlRelationships = this._createXMLRelationship(1, 'worksheet', 'worksheets/' + WORKSHEET_FILE_NAME) + this._createXMLRelationship(2, 'styles', STYLE_FILE_NAME) + this._createXMLRelationship(3, 'sharedStrings', SHAREDSTRING_FILE_NAME); + relsXML = relsXML + this._createXMLRelationships(xmlRelationships); + + folder.folder('_' + RELATIONSHIP_PART_NAME).file(WORKBOOK_FILE_NAME + '.rels', relsXML); + folder.file(WORKBOOK_FILE_NAME, this._getWorkbookContent()); + + this._zip.file(CONTENTTYPES_FILE_NAME, this._getContentTypesContent()); + }, + + _generateContent: function() { + this._prepareStyleData(); + this._prepareCellData(); + this._generateWorkXML(); + this._generateCommonXML(); + }, + + _generateWorkXML: function() { + this._generateStylesXML(); + this._generateStringsXML(); + this._generateWorksheetXML(); + }, + + ctor: function(dataProvider, options) { + this._rtlEnabled = options && !!options.rtlEnabled; + this._options = options; + this._maxRowIndex = 0; + this._maxColumnIndex = 0; + this._stringArray = []; + this._stringHash = {}; + this._styleArray = []; + this._colsArray = []; + this._cellsArray = []; + this._needSheetPr = false; + this._dataProvider = dataProvider; + this._excelFile = new ExcelFile(); + + if(isDefined(ExcelCreator.JSZip)) { + this._zip = new ExcelCreator.JSZip(); + } else { + this._zip = null; + } + }, + + _checkZipState: function() { + if(!this._zip) { + throw errors.Error('E1041', 'JSZip'); + } + }, + + ready: function() { + return this._dataProvider.ready(); + }, + + getData: function(isBlob) { + const options = { + type: isBlob ? 'blob' : 'base64', + compression: 'DEFLATE', + mimeType: MIME_TYPES['EXCEL'] + }; + const deferred = new Deferred(); + + this._checkZipState(); + this._generateContent(); + + if(this._zip.generateAsync) { + this._zip.generateAsync(options).then(deferred.resolve); + } else { + deferred.resolve(this._zip.generate(options)); + } + return deferred; + } +}); + +ExcelCreator.JSZip = JSZip; + +export function getData(data, options) { + // TODO: Looks like there is no need to export ExcelCreator any more? + const excelCreator = new ExcelCreator(data, options); + + excelCreator._checkZipState(); + + return excelCreator.ready().then(() => excelCreator.getData(isFunction(getWindow().Blob))); +} + +///#DEBUG +export const __internals = { + CONTENTTYPES_FILE_NAME: CONTENTTYPES_FILE_NAME, + RELATIONSHIP_PART_NAME: RELATIONSHIP_PART_NAME, + XL_FOLDER_NAME: XL_FOLDER_NAME, + WORKBOOK_FILE_NAME: WORKBOOK_FILE_NAME, + STYLE_FILE_NAME: STYLE_FILE_NAME, + WORKSHEET_FILE_NAME: WORKSHEET_FILE_NAME, + WORKSHEETS_FOLDER: WORKSHEETS_FOLDER, + WORKSHEET_HEADER_XML: WORKSHEET_HEADER_XML, + SHAREDSTRING_FILE_NAME: SHAREDSTRING_FILE_NAME, + GROUP_SHEET_PR_XML: GROUP_SHEET_PR_XML, + SINGLE_SHEET_PR_XML: SINGLE_SHEET_PR_XML, + BASE_STYLE_XML2: BASE_STYLE_XML2, + XML_TAG: XML_TAG +}; +///#ENDDEBUG diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_format_converter.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_format_converter.js new file mode 100644 index 0000000000000000000000000000000000000000..868a56552602b7575e908107a37f14791cadd66e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/excel_format_converter.js @@ -0,0 +1,133 @@ +import { format as stringFormat } from '../core/utils/string'; +import numberFormatter from '../localization/number'; +import dateLocalization from '../localization/date'; +import { isDefined, isString } from '../core/utils/type'; +import { getFormat } from '../localization/ldml/date.format'; +import { getLanguageId } from '../localization/language_codes'; +import '../localization/currency'; + +const ARABIC_ZERO_CODE = 1632; +const DEFINED_NUMBER_FORMTATS = { + thousands: '#,##0{0},"K"', + millions: '#,##0{0},,"M"', + billions: '#,##0{0},,,"B"', + trillions: '#,##0{0},,,,"T"', + percent: '0{0}%', + decimal: '#{0}', + 'fixedpoint': '#,##0{0}', + exponential: '0{0}E+00', + currency: ' ' +}; +const PERIOD_REGEXP = /a+/g; +const DAY_REGEXP = /E/g; +const DO_REGEXP = /dE+/g; +const STANDALONE_MONTH_REGEXP = /L/g; +const HOUR_REGEXP = /h/g; +const ANY_REGEXP = /./g; + +const excelFormatConverter = { + _applyPrecision: function(format, precision) { + let result; + let i; + + if(precision > 0) { + result = format !== 'decimal' ? '.' : ''; + for(i = 0; i < precision; i++) { + result = result + '0'; + } + + return result; + } + return ''; + }, + + _hasArabicDigits: function(text) { + let code; + + for(let i = 0; i < text.length; i++) { + code = text.charCodeAt(i); + if(code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10) { + return true; + } + } + return false; + }, + + _convertDateFormatToOpenXml: function(format) { + return format.split('/').join('\\/').split('\'').map(function(datePart, index) { + if(index % 2 === 0) { + return datePart + .replace(PERIOD_REGEXP, 'AM/PM') + .replace(DO_REGEXP, 'd') + .replace(DAY_REGEXP, 'd') + .replace(STANDALONE_MONTH_REGEXP, 'M') + .replace(HOUR_REGEXP, 'H') + .split('[').join('\\[') + .split(']').join('\\]'); + } if(datePart) { + return datePart.replace(ANY_REGEXP, '\\$&'); + } + return '\''; + }).join(''); + }, + + _convertDateFormat: function(format) { + const formattedValue = (dateLocalization.format(new Date(2009, 8, 8, 6, 5, 4), format) || '').toString(); + let result = getFormat(value => dateLocalization.format(value, format)); + + if(result) { + result = this._convertDateFormatToOpenXml(result); + result = this._getLanguageInfo(formattedValue) + result; + } + + return result; + }, + + _getLanguageInfo: function(defaultPattern) { + const languageID = getLanguageId(); + let languageIDStr = languageID ? languageID.toString(16) : ''; + let languageInfo = ''; + + if(this._hasArabicDigits(defaultPattern)) { + while(languageIDStr.length < 3) { + languageIDStr = '0' + languageIDStr; + } + languageInfo = '[$-2010' + languageIDStr + ']'; + } else if(languageIDStr) { + languageInfo = '[$-' + languageIDStr + ']'; + } + + return languageInfo; + }, + + _convertNumberFormat: function(format, precision, currency) { + let result; + let excelFormat; + + if(format === 'currency') { + excelFormat = numberFormatter.getOpenXmlCurrencyFormat(currency); + } else { + excelFormat = DEFINED_NUMBER_FORMTATS[format.toLowerCase()]; + } + + if(excelFormat) { + result = stringFormat(excelFormat, this._applyPrecision(format, precision)); + } + + return result; + }, + + convertFormat: function(format, precision, type, currency) { + if(isDefined(format)) { + if(type === 'date') { + return excelFormatConverter._convertDateFormat(format); + } else { + if(isString(format) && DEFINED_NUMBER_FORMTATS[format.toLowerCase()]) { + return excelFormatConverter._convertNumberFormat(format, precision, currency); + } + } + } + } +}; + +export default excelFormatConverter; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export.js new file mode 100644 index 0000000000000000000000000000000000000000..3aeb832a3c19d3e62c4efc44e16d2b99df9e44b7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export.js @@ -0,0 +1,239 @@ + +import { isDefined, isString, isDate, isObject, isFunction } from '../../core/utils/type'; +import { ExportFormat } from './export_format'; +import { MergedRangesManager } from './export_merged_ranges_manager'; +import { extend } from '../../core/utils/extend'; +import { ExportLoadPanel } from '../common/export_load_panel'; +import { hasWindow } from '../../core/utils/window'; + +// docs.microsoft.com/en-us/office/troubleshoot/excel/determine-column-widths - "Description of how column widths are determined in Excel" +const MAX_DIGIT_WIDTH_IN_PIXELS = 7; // Calibri font with 11pt size + +// support.office.com/en-us/article/change-the-column-width-and-row-height-72f5e3cc-994d-43e8-ae58-9774a0905f46 - "Column.Max - 255" +// support.office.com/en-us/article/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3 - "Column width limit - 255 characters" +const MAX_EXCEL_COLUMN_WIDTH = 255; + +export const Export = { + getFullOptions(options) { + const fullOptions = extend({}, options); + if(!(isDefined(fullOptions.worksheet) && isObject(fullOptions.worksheet))) { + throw Error('The "worksheet" field must contain an object.'); + } + if(!isDefined(fullOptions.topLeftCell)) { + fullOptions.topLeftCell = { row: 1, column: 1 }; + } else if(isString(fullOptions.topLeftCell)) { + const { row, col } = fullOptions.worksheet.getCell(fullOptions.topLeftCell); + fullOptions.topLeftCell = { row, column: col }; + } + if(!isDefined(fullOptions.keepColumnWidths)) { + fullOptions.keepColumnWidths = true; + } + if(!isDefined(fullOptions.loadPanel)) { + fullOptions.loadPanel = {}; + } + if(!isDefined(fullOptions.loadPanel.enabled)) { + fullOptions.loadPanel.enabled = true; + } + + return fullOptions; + }, + + convertDateForExcelJS(date) { + return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds())); + }, + + setNumberFormat(excelCell, numberFormat) { + excelCell.numFmt = numberFormat; + }, + + getCellStyles(dataProvider) { + const styles = dataProvider.getStyles(); + + styles.forEach((style) => { + let numberFormat = this.tryConvertToExcelNumberFormat(style.format, style.dataType); + + if(isDefined(numberFormat)) { + numberFormat = numberFormat.replace(/"/g, '"'); + } + + style.numberFormat = numberFormat; + }); + + return styles; + }, + + tryConvertToExcelNumberFormat(format, dataType) { + const newFormat = ExportFormat.formatObjectConverter(format, dataType); + const currency = newFormat.currency; + + format = newFormat.format; + dataType = newFormat.dataType; + + return ExportFormat.convertFormat(format, newFormat.precision, dataType, currency); + }, + + setAlignment(excelCell, wrapText, horizontalAlignment) { + excelCell.alignment = excelCell.alignment || {}; + + if(isDefined(wrapText)) { + excelCell.alignment.wrapText = wrapText; + } + if(isDefined(horizontalAlignment)) { + excelCell.alignment.horizontal = horizontalAlignment; + } + + excelCell.alignment.vertical = 'top'; + }, + + setColumnsWidth(worksheet, widths, startColumnIndex) { + if(!isDefined(widths)) { + return; + } + for(let i = 0; i < widths.length; i++) { + const columnWidth = widths[i]; + if((typeof columnWidth === 'number') && isFinite(columnWidth)) { + worksheet.getColumn(startColumnIndex + i).width = + Math.min(MAX_EXCEL_COLUMN_WIDTH, Math.floor(columnWidth / MAX_DIGIT_WIDTH_IN_PIXELS * 100) / 100); + } + } + }, + + export(options, helpers) { + const { + customizeCell, + component, + worksheet, + topLeftCell, + autoFilterEnabled, + keepColumnWidths, + selectedRowsOnly, + loadPanel, + mergeRowFieldValues, + mergeColumnFieldValues, + } = options; + + const internalComponent = component._getInternalInstance?.() || component; + const initialLoadPanelEnabledOption = internalComponent.option('loadPanel').enabled; + + component.option('loadPanel.enabled', false); + + let exportLoadPanel; + if(loadPanel.enabled && hasWindow()) { + const $targetElement = helpers._getLoadPanelTargetElement(component); + const $container = helpers._getLoadPanelContainer(component); + + exportLoadPanel = new ExportLoadPanel(component, $targetElement, $container, loadPanel); + exportLoadPanel.show(); + } + + const wrapText = !!component.option('wordWrapEnabled'); + + worksheet.properties.outlineProperties = { + summaryBelow: false, + summaryRight: false + }; + + const cellRange = { + from: { row: topLeftCell.row, column: topLeftCell.column }, + to: { row: topLeftCell.row, column: topLeftCell.column } + }; + + const dataProvider = component.getDataProvider(selectedRowsOnly); + + return new Promise((resolve) => { + dataProvider.ready().done(() => { + const columns = dataProvider.getColumns(); + const dataRowsCount = dataProvider.getRowsCount(); + + if(keepColumnWidths) { + this.setColumnsWidth(worksheet, dataProvider.getColumnsWidths(), cellRange.from.column); + } + + const mergedRangesManager = new MergedRangesManager(dataProvider, helpers, mergeRowFieldValues, mergeColumnFieldValues); + const styles = this.getCellStyles(dataProvider); + + for(let rowIndex = 0; rowIndex < dataRowsCount; rowIndex++) { + const row = worksheet.getRow(cellRange.from.row + rowIndex); + helpers._trySetOutlineLevel(dataProvider, row, rowIndex); + + this.exportRow(dataProvider, helpers, mergedRangesManager, rowIndex, columns.length, row, cellRange.from.column, customizeCell, wrapText, styles); + + if(rowIndex >= 1) { + cellRange.to.row++; + } + } + + mergedRangesManager.applyMergedRages(worksheet); + + cellRange.to.column += columns.length > 0 ? columns.length - 1 : 0; + + const worksheetViewSettings = worksheet.views[0] || {}; + + if(component.option('rtlEnabled')) { + worksheetViewSettings.rightToLeft = true; + } + + if(helpers._isFrozenZone(dataProvider)) { + if(Object.keys(worksheetViewSettings).indexOf('state') === -1) { + extend(worksheetViewSettings, helpers._getWorksheetFrozenState(dataProvider, cellRange)); + } + helpers._trySetAutoFilter(dataProvider, worksheet, cellRange, autoFilterEnabled); + } + + if(Object.keys(worksheetViewSettings).length > 0) { + worksheet.views = [worksheetViewSettings]; + } + + resolve(cellRange); + }).always(() => { + component.option('loadPanel.enabled', initialLoadPanelEnabledOption); + + if(loadPanel.enabled && hasWindow()) { + exportLoadPanel.dispose(); + } + }); + }); + }, + + exportRow(dataProvider, helpers, mergedRangesManager, rowIndex, cellCount, row, startColumnIndex, customizeCell, wrapText, styles) { + for(let cellIndex = 0; cellIndex < cellCount; cellIndex++) { + const cellData = dataProvider.getCellData(rowIndex, cellIndex, true); + const excelCell = row.getCell(startColumnIndex + cellIndex); + + mergedRangesManager.updateMergedRanges(excelCell, rowIndex, cellIndex); + + const cellInfo = mergedRangesManager.findMergedCellInfo(rowIndex, cellIndex); + if(isDefined(cellInfo) && (excelCell !== cellInfo.masterCell)) { + excelCell.style = cellInfo.masterCell.style; + excelCell.value = cellInfo.masterCell.value; + } else { + if(isDate(cellData.value)) { + excelCell.value = this.convertDateForExcelJS(cellData.value); + } else { + excelCell.value = cellData.value; + } + + if(isDefined(excelCell.value)) { + const { bold, alignment: horizontalAlignment, numberFormat } = styles[dataProvider.getStyleId(rowIndex, cellIndex)]; + + if(isDefined(numberFormat)) { + this.setNumberFormat(excelCell, numberFormat); + } else if(isString(excelCell.value) && /^[@=+-]/.test(excelCell.value)) { + this.setNumberFormat(excelCell, '@'); + } + + helpers._trySetFont(excelCell, bold); + this.setAlignment(excelCell, wrapText, horizontalAlignment); + } + } + + if(isFunction(customizeCell)) { + customizeCell(helpers._getCustomizeCellOptions(excelCell, cellData.cellSourceData)); + } + } + } +}; + +//#DEBUG +Export.__internals = { MAX_EXCEL_COLUMN_WIDTH, MAX_DIGIT_WIDTH_IN_PIXELS }; +//#ENDDEBUG diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_data_grid.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_data_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..5b77b5e86f9a8dd853ae9a2867c3805172ed6e77 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_data_grid.js @@ -0,0 +1,91 @@ +import { isDefined, isObject } from '../../core/utils/type'; +import { Export } from './export'; +import errors from '../../core/errors'; + +const helpers = { + _trySetAutoFilter(dataProvider, worksheet, cellRange, autoFilterEnabled) { + if(autoFilterEnabled) { + if(!isDefined(worksheet.autoFilter) && dataProvider.getRowsCount() > 0) { + const dataRange = { from: { row: cellRange.from.row + dataProvider.getHeaderRowCount() - 1, column: cellRange.from.column }, to: cellRange.to }; + + worksheet.autoFilter = dataRange; + } + } + }, + + _trySetFont(excelCell, bold) { + if(isDefined(bold)) { + excelCell.font = excelCell.font || {}; + excelCell.font.bold = bold; + } + }, + + _getWorksheetFrozenState(dataProvider, cellRange) { + return { state: 'frozen', ySplit: cellRange.from.row + dataProvider.getFrozenArea().y - 1 }; + }, + + _trySetOutlineLevel(dataProvider, row, rowIndex) { + if(rowIndex >= dataProvider.getHeaderRowCount()) { + row.outlineLevel = dataProvider.getGroupLevel(rowIndex); + } + }, + + _getCustomizeCellOptions(excelCell, gridCell) { + const options = { excelCell, gridCell }; + + Object.defineProperty(options, 'cell', { + get() { + errors.log('W0003', 'CustomizeCell handler argument', 'cell', '20.1', 'Use the \'excelCell\' field instead'); + return excelCell; + }, + }); + + return options; + }, + + _isFrozenZone(dataProvider) { + return dataProvider.getHeaderRowCount() > 0; + }, + + _isHeaderCell(dataProvider, rowIndex) { + return rowIndex < dataProvider.getHeaderRowCount(); + }, + + _allowToMergeRange() { + return true; + }, + + _getLoadPanelTargetElement(component) { + return component.getView('rowsView').element(); + }, + + _getLoadPanelContainer(component) { + return component.getView('rowsView').element().parent(); + } +}; + +function exportDataGrid(options) { + return Export.export(_getFullOptions(options), helpers); +} + +function _getFullOptions(options) { + if(!(isDefined(options) && isObject(options))) { + throw Error('The "exportDataGrid" method requires a configuration object.'); + } + if(!(isDefined(options.component) && isObject(options.component) && options.component.NAME === 'dxDataGrid')) { + throw Error('The "component" field must contain a DataGrid instance.'); + } + if(!isDefined(options.selectedRowsOnly)) { + options.selectedRowsOnly = false; + } + if(!isDefined(options.autoFilterEnabled)) { + options.autoFilterEnabled = false; + } + return Export.getFullOptions(options); +} + +//#DEBUG +exportDataGrid.__internals = { _getFullOptions }; +//#ENDDEBUG + +export { exportDataGrid }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_format.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_format.js new file mode 100644 index 0000000000000000000000000000000000000000..bad730b27b6c45d44bc2ec638ff7d3d91285cb50 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_format.js @@ -0,0 +1,149 @@ +import { format as stringFormat } from '../../core/utils/string'; +import numberFormatter from '../../localization/number'; +import dateLocalization from '../../localization/date'; +import { isDefined, isString, isObject } from '../../core/utils/type'; +import { getFormat } from '../../localization/ldml/date.format'; +import { getLanguageId } from '../../localization/language_codes'; +import { extend } from '../../core/utils/extend'; +import '../../localization/currency'; + +const ARABIC_ZERO_CODE = 1632; +const DEFINED_NUMBER_FORMTATS = { + thousands: '#,##0{0},"K"', + millions: '#,##0{0},,"M"', + billions: '#,##0{0},,,"B"', + trillions: '#,##0{0},,,,"T"', + percent: '0{0}%', + decimal: '#{0}', + 'fixedpoint': '#,##0{0}', + exponential: '0{0}E+00', + currency: ' ' +}; +const PERIOD_REGEXP = /a+/g; +const DAY_REGEXP = /E/g; +const DO_REGEXP = /dE+/g; +const STANDALONE_MONTH_REGEXP = /L/g; +const HOUR_REGEXP = /h/g; +const ANY_REGEXP = /./g; + +function _applyPrecision(format, precision) { + let result; + let i; + + if(precision > 0) { + result = format !== 'decimal' ? '.' : ''; + for(i = 0; i < precision; i++) { + result = result + '0'; + } + + return result; + } + return ''; +} + +function _hasArabicDigits(text) { + let code; + + for(let i = 0; i < text.length; i++) { + code = text.charCodeAt(i); + if(code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10) { + return true; + } + } + return false; +} + +function _convertDateFormat(format) { + const formattedValue = (dateLocalization.format(new Date(2009, 8, 8, 6, 5, 4), format) || '').toString(); + let result = getFormat(value => dateLocalization.format(value, format)); + + if(result) { + result = _convertDateFormatToOpenXml(result); + result = _getLanguageInfo(formattedValue) + result; + } + + return result; +} + +function _getLanguageInfo(defaultPattern) { + const languageID = getLanguageId(); + let languageIDStr = languageID ? languageID.toString(16) : ''; + let languageInfo = ''; + + if(_hasArabicDigits(defaultPattern)) { + while(languageIDStr.length < 3) { + languageIDStr = '0' + languageIDStr; + } + languageInfo = '[$-2010' + languageIDStr + ']'; + } else if(languageIDStr) { + languageInfo = '[$-' + languageIDStr + ']'; + } + + return languageInfo; +} + +function _convertDateFormatToOpenXml(format) { + return format.split('/').join('\\/').split('\'').map(function(datePart, index) { + if(index % 2 === 0) { + return datePart + .replace(PERIOD_REGEXP, 'AM/PM') + .replace(DO_REGEXP, 'd') + .replace(DAY_REGEXP, 'd') + .replace(STANDALONE_MONTH_REGEXP, 'M') + .replace(HOUR_REGEXP, 'H') + .split('[').join('\\[') + .split(']').join('\\]'); + } if(datePart) { + return datePart.replace(ANY_REGEXP, '\\$&'); + } + return '\''; + }).join(''); +} + +function _convertNumberFormat(format, precision, currency) { + let result; + let excelFormat; + + if(format === 'currency') { + excelFormat = numberFormatter.getOpenXmlCurrencyFormat(currency); + } else { + excelFormat = DEFINED_NUMBER_FORMTATS[format.toLowerCase()]; + } + + if(excelFormat) { + result = stringFormat(excelFormat, _applyPrecision(format, precision)); + } + + return result; +} + +export const ExportFormat = { + formatObjectConverter(format, dataType) { + const result = { + format: format, + precision: format && format.precision, + dataType: dataType + }; + + if(isObject(format)) { + return extend(result, format, { + format: format.formatter || format.type, + currency: format.currency + }); + } + + return result; + }, + + convertFormat(format, precision, type, currency) { + if(isDefined(format)) { + if(type === 'date') { + return _convertDateFormat(format); + } else { + if(isString(format) && DEFINED_NUMBER_FORMTATS[format.toLowerCase()]) { + return _convertNumberFormat(format, precision, currency); + } + } + } + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_merged_ranges_manager.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_merged_ranges_manager.js new file mode 100644 index 0000000000000000000000000000000000000000..0366672058723a801af72f1b9202ddfe714be451 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_merged_ranges_manager.js @@ -0,0 +1,71 @@ +class MergedRangesManager { + constructor(dataProvider, helpers, mergeRowFieldValues, mergeColumnFieldValues) { + this.mergedCells = []; + this.mergedRanges = []; + + this.dataProvider = dataProvider; + this.helpers = helpers; + this.mergeRowFieldValues = mergeRowFieldValues; + this.mergeColumnFieldValues = mergeColumnFieldValues; + } + + updateMergedRanges(excelCell, rowIndex, cellIndex) { + if(this.helpers._isHeaderCell(this.dataProvider, rowIndex, cellIndex)) { + if(!this.isCellInMergedRanges(rowIndex, cellIndex)) { + const { rowspan, colspan } = this.dataProvider.getCellMerging(rowIndex, cellIndex); + const isMasterCellOfMergedRange = colspan || rowspan; + + if(isMasterCellOfMergedRange) { + const allowToMergeRange = this.helpers._allowToMergeRange(this.dataProvider, rowIndex, cellIndex, rowspan, colspan, this.mergeRowFieldValues, this.mergeColumnFieldValues); + this.updateMergedCells(excelCell, rowIndex, cellIndex, rowspan, colspan, allowToMergeRange); + + if(allowToMergeRange) { + this.mergedRanges.push({ + masterCell: excelCell, + ...{ rowspan, colspan } + }); + } + } + } + } + } + + isCellInMergedRanges(rowIndex, cellIndex) { + return this.mergedCells[rowIndex] && this.mergedCells[rowIndex][cellIndex]; + } + + findMergedCellInfo(rowIndex, cellIndex) { + if(this.helpers._isHeaderCell(this.dataProvider, rowIndex, cellIndex)) { + if(this.isCellInMergedRanges(rowIndex, cellIndex)) { + return this.mergedCells[rowIndex][cellIndex]; + } + } + } + + updateMergedCells(excelCell, rowIndex, cellIndex, rowspan, colspan, allowToMergeRange) { + for(let i = rowIndex; i <= rowIndex + rowspan; i++) { + for(let j = cellIndex; j <= cellIndex + colspan; j++) { + if(!this.mergedCells[i]) { + this.mergedCells[i] = []; + } + this.mergedCells[i][j] = { + masterCell: excelCell, + unmerged: !allowToMergeRange + }; + } + } + } + + applyMergedRages(worksheet) { + this.mergedRanges.forEach((range) => { + const startRowIndex = range.masterCell.fullAddress.row; + const startColumnIndex = range.masterCell.fullAddress.col; + const endRowIndex = startRowIndex + range.rowspan; + const endColumnIndex = startColumnIndex + range.colspan; + + worksheet.mergeCells(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex); + }); + } +} + +export { MergedRangesManager }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_pivot_grid.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_pivot_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..0915afcda9b9d4cf1992c81171a618201ebaea15 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/exceljs/export_pivot_grid.js @@ -0,0 +1,67 @@ +import { isDefined, isObject } from '../../core/utils/type'; +import { Export } from './export'; +import { noop } from '../../core/utils/common'; + +const helpers = { + _getWorksheetFrozenState(dataProvider, cellRange) { + return { state: 'frozen', xSplit: cellRange.from.column + dataProvider.getFrozenArea().x - 1, ySplit: cellRange.from.row + dataProvider.getFrozenArea().y - 1 }; + }, + + _getCustomizeCellOptions(excelCell, pivotCell) { + return { + excelCell: excelCell, + pivotCell: pivotCell + }; + }, + + _isFrozenZone() { + return true; + }, + + _isHeaderCell(dataProvider, rowIndex, cellIndex) { + return rowIndex < dataProvider.getColumnAreaRowCount() || cellIndex < dataProvider.getRowAreaColCount(); + }, + + _allowToMergeRange(dataProvider, rowIndex, cellIndex, rowspan, colspan, mergeRowFieldValues, mergeColumnFieldValues) { + return !((dataProvider.isColumnAreaCell(rowIndex, cellIndex) && !mergeColumnFieldValues && !!colspan) + || (dataProvider.isRowAreaCell(rowIndex, cellIndex) && !mergeRowFieldValues && !!rowspan)); + }, + + _getLoadPanelTargetElement(component) { + return component._dataArea.groupElement(); + }, + + _getLoadPanelContainer(component) { + return component.$element(); + }, + + _trySetAutoFilter: noop, + _trySetFont: noop, + _trySetOutlineLevel: noop, +}; + +function exportPivotGrid(options) { + return Export.export(_getFullOptions(options), helpers); +} + +function _getFullOptions(options) { + if(!(isDefined(options) && isObject(options))) { + throw Error('The "exportPivotGrid" method requires a configuration object.'); + } + if(!(isDefined(options.component) && isObject(options.component) && options.component.NAME === 'dxPivotGrid')) { + throw Error('The "component" field must contain a PivotGrid instance.'); + } + if(!(isDefined(options.mergeRowFieldValues))) { + options.mergeRowFieldValues = true; + } + if(!(isDefined(options.mergeColumnFieldValues))) { + options.mergeColumnFieldValues = true; + } + return Export.getFullOptions(options); +} + +//#DEBUG +exportPivotGrid.__internals = { _getFullOptions }; +//#ENDDEBUG + +export { exportPivotGrid }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/export_load_panel.d.ts b/packages/f-theme-editor/farris-theme-editor/js/exporter/export_load_panel.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbe88f9161db2e2e34b6228e06cac73af934d9e5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/export_load_panel.d.ts @@ -0,0 +1,52 @@ +/** + * @docid + * @type object + * @namespace DevExpress + */ +export interface ExportLoadPanel { + /** + * @docid + * @default true + */ + enabled?: boolean; + /** + * @docid + * @default "Exporting..." + */ + text?: string; + /** + * @docid + * @default 200 + */ + width?: number; + /** + * @docid + * @default 90 + */ + height?: number; + /** + * @docid + * @default true + */ + showIndicator?: boolean; + /** + * @docid + * @default "" + */ + indicatorSrc?: string; + /** + * @docid + * @default true + */ + showPane?: boolean; + /** + * @docid + * @default false + */ + shading?: boolean; + /** + * @docid + * @default '' + */ + shadingColor?: string; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/file_saver.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/file_saver.js new file mode 100644 index 0000000000000000000000000000000000000000..88a74a5db2890d2ebffe851fba5067bde2221645 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/file_saver.js @@ -0,0 +1,177 @@ +/* global Windows */ +import $ from '../core/renderer'; +import domAdapter from '../core/dom_adapter'; +import { getWindow, getNavigator } from '../core/utils/window'; +import eventsEngine from '../events/core/events_engine'; +import errors from '../ui/widget/ui.errors'; +import { isDefined, isFunction } from '../core/utils/type'; +import { logger } from '../core/utils/console'; + +const window = getWindow(); +const navigator = getNavigator(); + +const FILE_EXTESIONS = { + EXCEL: 'xlsx', + CSS: 'css', + PNG: 'png', + JPEG: 'jpeg', + GIF: 'gif', + SVG: 'svg', + PDF: 'pdf' +}; + +export const MIME_TYPES = { + CSS: 'text/css', + EXCEL: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + PNG: 'image/png', + JPEG: 'image/jpeg', + GIF: 'image/gif', + SVG: 'image/svg+xml', + PDF: 'application/pdf' +}; + +// Use github.com/eligrey/FileSaver.js library instead this method + +export const fileSaver = { + _revokeObjectURLTimeout: 30000, + + _getDataUri: function(format, data) { + const mimeType = this._getMimeType(format); + return `data:${mimeType};base64,${data}`; + }, + + _getMimeType: function(format) { + return MIME_TYPES[format] || 'application/octet-stream'; + }, + + _linkDownloader: function(fileName, href) { + const exportLinkElement = domAdapter.createElement('a'); + exportLinkElement.download = fileName; + exportLinkElement.href = href; + exportLinkElement.target = '_blank'; // cors policy + + return exportLinkElement; + }, + + _formDownloader: function(proxyUrl, fileName, contentType, data) { + const formAttributes = { method: 'post', action: proxyUrl, enctype: 'multipart/form-data' }; + const exportForm = $('
').css({ 'display': 'none' }).attr(formAttributes); + + function setAttributes(element, attributes) { + for(const key in attributes) { + element.setAttribute(key, attributes[key]); + } + + return element; + } + + exportForm.append(setAttributes(domAdapter.createElement('input'), { type: 'hidden', name: 'fileName', value: fileName })); + exportForm.append(setAttributes(domAdapter.createElement('input'), { type: 'hidden', name: 'contentType', value: contentType })); + exportForm.append(setAttributes(domAdapter.createElement('input'), { type: 'hidden', name: 'data', value: data })); + + exportForm.appendTo('body'); + eventsEngine.trigger(exportForm, 'submit'); + + if(eventsEngine.trigger(exportForm, 'submit')) exportForm.remove(); + ///#DEBUG + return exportForm; + ///#ENDDEBUG + }, + + _saveByProxy: function(proxyUrl, fileName, format, data) { + const contentType = this._getMimeType(format); + return this._formDownloader(proxyUrl, fileName, contentType, data); + }, + + _winJSBlobSave: function(blob, fileName, format) { + const savePicker = new Windows.Storage.Pickers.FileSavePicker(); + savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; + + const fileExtension = FILE_EXTESIONS[format]; + if(fileExtension) { + const mimeType = this._getMimeType(format); + savePicker.fileTypeChoices.insert(mimeType, ['.' + fileExtension]); + } + + savePicker.suggestedFileName = fileName; + + savePicker.pickSaveFileAsync().then(function(file) { + if(file) { + file.openAsync(Windows.Storage.FileAccessMode.readWrite).then(function(outputStream) { + const inputStream = blob.msDetachStream(); + Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, outputStream).then(function() { + outputStream.flushAsync().done(function() { + inputStream.close(); + outputStream.close(); + }); + }); + }); + } + }); + }, + + _click: function(link) { + try { + // eslint-disable-next-line no-undef + link.dispatchEvent(new MouseEvent('click', { cancelable: true })); + } catch(e) { + const event = domAdapter.getDocument().createEvent('MouseEvents'); + event.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); + link.dispatchEvent(event); + } + }, + + _saveBlobAs: function(fileName, format, data) { + this._blobSaved = false; + + if(isDefined(navigator.msSaveOrOpenBlob)) { + navigator.msSaveOrOpenBlob(data, fileName); + this._blobSaved = true; + } else if(isDefined(window.WinJS)) { + this._winJSBlobSave(data, fileName, format); + this._blobSaved = true; + } else { + const URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL; + + if(isDefined(URL)) { + const objectURL = URL.createObjectURL(data); + const downloadLink = this._linkDownloader(fileName, objectURL); + + setTimeout(() => { + URL.revokeObjectURL(objectURL); + this._objectUrlRevoked = true; + }, this._revokeObjectURLTimeout); + + this._click(downloadLink); + } else { + logger.warn('window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL is not defined'); + } + } + }, + + saveAs: function(fileName, format, data, proxyURL, forceProxy) { + const fileExtension = FILE_EXTESIONS[format]; + if(fileExtension) { + fileName += '.' + fileExtension; + } + + if(isDefined(proxyURL)) { + errors.log('W0001', 'Export', 'proxyURL', '19.2', 'This option is no longer required'); + } + + if(forceProxy) { + this._saveByProxy(proxyURL, fileName, format, data); + } else if(isFunction(window.Blob)) { + this._saveBlobAs(fileName, format, data); + } else { + if(isDefined(proxyURL) && !isDefined(navigator.userAgent.match(/iPad/i))) { + this._saveByProxy(proxyURL, fileName, format, data); + } else { + if(!isDefined(navigator.userAgent.match(/iPad/i))) errors.log('E1034'); + + const downloadLink = this._linkDownloader(fileName, this._getDataUri(format, data)); + this._click(downloadLink); + } + } + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/image_creator.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/image_creator.js new file mode 100644 index 0000000000000000000000000000000000000000..7ac34822c4b765e3553252989c30f1fdbd1ae1a4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/image_creator.js @@ -0,0 +1,818 @@ +import $ from '../core/renderer'; +import Color from '../color'; +import { isFunction, isPromise, isDefined } from '../core/utils/type'; +import { getSvgElement, HIDDEN_FOR_EXPORT } from '../core/utils/svg'; +import { each as _each, map as _map } from '../core/utils/iterator'; +import { extend } from '../core/utils/extend'; +import domAdapter from '../core/dom_adapter'; +import { contains } from '../core/utils/dom'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import { camelize } from '../core/utils/inflector'; +import { Deferred, fromPromise } from '../core/utils/deferred'; + +const _math = Math; +const PI = _math.PI; +const _min = _math.min; +const _abs = _math.abs; +const _sqrt = _math.sqrt; +const _pow = _math.pow; +const _atan2 = _math.atan2; +const _cos = _math.cos; +const _sin = _math.sin; +const _number = Number; + +const IMAGE_QUALITY = 1; +const TEXT_DECORATION_LINE_WIDTH_COEFF = 0.05; +const DEFAULT_FONT_SIZE = '10px'; +const DEFAULT_FONT_FAMILY = 'sans-serif'; +const DEFAULT_TEXT_COLOR = '#000'; + +let parseAttributes; + +function getStringFromCanvas(canvas, mimeType) { + const dataURL = canvas.toDataURL(mimeType, IMAGE_QUALITY); + const imageData = window.atob(dataURL.substring(('data:' + mimeType + ';base64,').length)); + + return imageData; +} + +function arcTo(x1, y1, x2, y2, radius, largeArcFlag, clockwise, context) { + const cBx = (x1 + x2) / 2; + const cBy = (y1 + y2) / 2; + let aB = _atan2(y1 - y2, x1 - x2); + const k = largeArcFlag ? 1 : -1; + + aB += 90 * (PI / 180) * (clockwise ? 1 : -1); + + const opSide = _sqrt(_pow(x2 - x1, 2) + _pow(y2 - y1, 2)) / 2; + const adjSide = _sqrt(_abs(_pow(radius, 2) - _pow(opSide, 2))); + + const centerX = cBx + k * (adjSide * _cos(aB)); + const centerY = cBy + k * (adjSide * _sin(aB)); + + const startAngle = _atan2(y1 - centerY, x1 - centerX); + const endAngle = _atan2(y2 - centerY, x2 - centerX); + + context.arc(centerX, centerY, radius, startAngle, endAngle, !clockwise); +} + +function getElementOptions(element, rootAppended) { + const attr = parseAttributes(element.attributes || {}); + const options = extend({}, attr, { + text: element.textContent.replace(/\s+/g, ' '), + textAlign: attr['text-anchor'] === 'middle' ? 'center' : attr['text-anchor'] + }); + const transform = attr.transform; + let coords; + + if(transform) { + coords = transform.match(/translate\(-*\d+([.]\d+)*(,*\s*-*\d+([.]\d+)*)*/); + if(coords) { + coords = coords[0].match(/-*\d+([.]\d+)*/g); + options.translateX = _number(coords[0]); + options.translateY = coords[1] ? _number(coords[1]) : 0; + } + + coords = transform.match(/rotate\(-*\d+([.]\d+)*(,*\s*-*\d+([.]\d+)*,*\s*-*\d+([.]\d+)*)*/); + if(coords) { + coords = coords[0].match(/-*\d+([.]\d+)*/g); + options.rotationAngle = _number(coords[0]); + options.rotationX = coords[1] && _number(coords[1]); + options.rotationY = coords[2] && _number(coords[2]); + } + + coords = transform.match(/scale\(-*\d+([.]\d+)*(,*\s*-*\d+([.]\d+)*)*/); + if(coords) { + coords = coords[0].match(/-*\d+([.]\d+)*/g); + options.scaleX = _number(coords[0]); + if(coords.length > 1) { + options.scaleY = _number(coords[1]); + } else { + options.scaleY = options.scaleX; + } + } + } + + parseStyles(element, options, rootAppended); + + return options; +} + +function drawRect(context, options) { + const x = options.x; + const y = options.y; + const width = options.width; + const height = options.height; + let cornerRadius = options.rx; + + if(!cornerRadius) { + context.rect(x, y, width, height); + } else { + cornerRadius = _min(cornerRadius, width / 2, height / 2); + context.save(); + context.translate(x, y); + context.moveTo(width / 2, 0); + context.arcTo(width, 0, width, height, cornerRadius); + context.arcTo(width, height, 0, height, cornerRadius); + context.arcTo(0, height, 0, 0, cornerRadius); + context.arcTo(0, 0, cornerRadius, 0, cornerRadius); + context.lineTo(width / 2, 0); + context.restore(); + } +} + +function drawImage(context, options, shared) { + const d = new Deferred(); + const image = new window.Image(); + + image.onload = function() { + context.save(); + + context.globalAlpha = options.globalAlpha; + transformElement(context, options); + clipElement(context, options, shared); + + context.drawImage(image, options.x, options.y, options.width, options.height); + + context.restore(); + d.resolve(); + }; + + image.onerror = function() { + d.resolve(); + }; + + image.setAttribute('crossOrigin', 'anonymous'); + image.src = options['href'] || options['xlink:href']; + + return d; +} + +function drawPath(context, dAttr) { + const dArray = dAttr.replace(/,/g, ' ').split(/([A-Z])/i).filter(item => item.trim() !== ''); + let i = 0; + let params; + let prevParams; + let prevParamsLen; + + do { + params = (dArray[i + 1] || '').trim().split(' '); + switch(dArray[i]) { + case 'M': + context.moveTo(_number(params[0]), _number(params[1])); + i += 2; + break; + case 'L': + for(let j = 0; j < params.length / 2; j++) { + context.lineTo(_number(params[j * 2]), _number(params[j * 2 + 1])); + } + i += 2; + break; + case 'C': + context.bezierCurveTo(_number(params[0]), _number(params[1]), _number(params[2]), _number(params[3]), _number(params[4]), _number(params[5])); + i += 2; + break; + case 'a': + prevParams = dArray[i - 1].trim().split(' '); + prevParamsLen = prevParams.length - 1; + arcTo(_number(prevParams[prevParamsLen - 1]), _number(prevParams[prevParamsLen]), _number(prevParams[prevParamsLen - 1]) + _number(params[5]), _number(prevParams[prevParamsLen]) + _number(params[6]), _number(params[0]), _number(params[3]), _number(params[4]), context); + i += 2; + break; + case 'A': + prevParams = dArray[i - 1].trim().split(' '); + prevParamsLen = prevParams.length - 1; + arcTo(_number(prevParams[prevParamsLen - 1]), _number(prevParams[prevParamsLen]), _number(params[5]), _number(params[6]), _number(params[0]), _number(params[3]), _number(params[4]), context); + i += 2; + break; + case 'Z': + context.closePath(); + i += 1; + break; + default: + i++; + } + } while(i < dArray.length); +} + +function parseStyles(element, options, rootAppended) { + let style = element.style || {}; + let field; + + for(field in style) { + if(style[field] !== '') { + options[camelize(field)] = style[field]; + } + } + if(rootAppended && domAdapter.isElementNode(element)) { + style = window.getComputedStyle(element); + ['fill', 'stroke', 'stroke-width', 'font-family', 'font-size', 'font-style', 'font-weight'].forEach(function(prop) { + if(prop in style && style[prop] !== '') { + options[camelize(prop)] = style[prop]; + } + }); + + ['opacity', 'fill-opacity', 'stroke-opacity'].forEach(function(prop) { + if(prop in style && style[prop] !== '' && style[prop] !== '1') { + options[prop] = _number(style[prop]); + } + }); + } + + options.textDecoration = options.textDecoration || options.textDecorationLine; + options.globalAlpha = isDefined(options.opacity) ? options.opacity : options.globalAlpha; +} + +function parseUrl(urlString) { + const matches = urlString && urlString.match(/url\(.*#(.*?)["']?\)/i); + return matches && matches[1]; +} + +function setFontStyle(context, options) { + const fontParams = []; + + options.fontSize = options.fontSize || DEFAULT_FONT_SIZE; + options.fontFamily = options.fontFamily || DEFAULT_FONT_FAMILY; + options.fill = options.fill || DEFAULT_TEXT_COLOR; + + options.fontStyle && fontParams.push(options.fontStyle); + options.fontWeight && fontParams.push(options.fontWeight); + fontParams.push(options.fontSize); + fontParams.push(options.fontFamily); + + context.font = fontParams.join(' '); + context.textAlign = options.textAlign; + context.fillStyle = options.fill; + context.globalAlpha = options.globalAlpha; +} + +function drawText(context, options, shared) { + setFontStyle(context, options); + applyFilter(context, options, shared); + options.text && context.fillText(options.text, options.x || 0, options.y || 0); + strokeElement(context, options, true); + drawTextDecoration(context, options, shared); +} + +function drawTextDecoration(context, options, shared) { + if(!options.textDecoration || options.textDecoration === 'none') { + return; + } + + const x = options.x; + const textWidth = context.measureText(options.text).width; + const textHeight = parseInt(options.fontSize, 10); + const lineHeight = textHeight * TEXT_DECORATION_LINE_WIDTH_COEFF < 1 ? 1 : textHeight * TEXT_DECORATION_LINE_WIDTH_COEFF; + let y = options.y; + + switch(options.textDecoration) { + case 'line-through': + y -= textHeight / 3 + lineHeight / 2; + break; + case 'overline': + y -= textHeight - lineHeight; + break; + case 'underline': + y += lineHeight; + break; + } + + context.rect(x, y, textWidth, lineHeight); + fillElement(context, options, shared); + strokeElement(context, options); +} + +function aggregateOpacity(options) { + options.strokeOpacity = options['stroke-opacity'] !== undefined ? options['stroke-opacity'] : 1; + options.fillOpacity = options['fill-opacity'] !== undefined ? options['fill-opacity'] : 1; + + if(options.opacity !== undefined) { + options.strokeOpacity *= options.opacity; + options.fillOpacity *= options.opacity; + } +} + +function hasTspan(element) { + const nodes = element.childNodes; + for(let i = 0; i < nodes.length; i++) { + if(nodes[i].tagName === 'tspan') { + return true; + } + } + return false; +} + +function drawTextElement(childNodes, context, options, shared) { + const lines = []; + let line; + let offset = 0; + + for(let i = 0; i < childNodes.length; i++) { + const element = childNodes[i]; + + if(element.tagName === undefined) { + drawElement(element, context, options, shared); + } else if(element.tagName === 'tspan' || element.tagName === 'text') { + const elementOptions = getElementOptions(element, shared.rootAppended); + const mergedOptions = extend({}, options, elementOptions); + + if(element.tagName === 'tspan' && hasTspan(element)) { + drawTextElement(element.childNodes, context, mergedOptions, shared); + continue; + } + + mergedOptions.textAlign = 'start'; + if(!line || elementOptions.x !== undefined) { + line = { + elements: [], + options: [], + widths: [], + offsets: [] + }; + lines.push(line); + } + + if(elementOptions.y !== undefined) { + offset = 0; + } + if(elementOptions.dy !== undefined) { + offset += parseFloat(elementOptions.dy); + } + + line.elements.push(element); + line.options.push(mergedOptions); + line.offsets.push(offset); + setFontStyle(context, mergedOptions); + line.widths.push(context.measureText(mergedOptions.text).width); + } + } + + lines.forEach(function(line) { + const commonWidth = line.widths.reduce(function(commonWidth, width) { + return commonWidth + width; + }, 0); + let xDiff = 0; + let currentOffset = 0; + + if(options.textAlign === 'center') { + xDiff = commonWidth / 2; + } + + if(options.textAlign === 'end') { + xDiff = commonWidth; + } + + line.options.forEach(function(o, index) { + const width = line.widths[index]; + o.x = o.x - xDiff + currentOffset; + o.y += line.offsets[index]; + currentOffset += width; + }); + + line.elements.forEach(function(element, index) { + drawTextElement(element.childNodes, context, line.options[index], shared); + }); + + }); +} + +function drawElement(element, context, parentOptions, shared) { + const tagName = element.tagName; + const isText = tagName === 'text' || tagName === 'tspan' || tagName === undefined; + const isImage = tagName === 'image'; + const options = extend({}, parentOptions, getElementOptions(element, shared.rootAppended)); + + if(options.visibility === 'hidden' || options[HIDDEN_FOR_EXPORT]) { + return; + } + + context.save(); + !isImage && transformElement(context, options); + clipElement(context, options, shared); + aggregateOpacity(options); + + let promise; + + context.beginPath(); + switch(element.tagName) { + case undefined: + drawText(context, options, shared); + break; + case 'text': + case 'tspan': + drawTextElement(element.childNodes, context, options, shared); + break; + case 'image': + promise = drawImage(context, options, shared); + break; + case 'path': + drawPath(context, options.d); + break; + case 'rect': + drawRect(context, options); + context.closePath(); // for valid clipping + break; + case 'circle': + context.arc(options.cx, options.cy, options.r, 0, 2 * PI, 1); + break; + } + + if(!isText) { + applyFilter(context, options, shared); + fillElement(context, options, shared); + strokeElement(context, options); + } + + applyGradient(context, options, shared, element); + + context.restore(); + + return promise; +} + +function applyGradient(context, options, { gradients }, element) { + if(gradients.length === 0) { + return; + } + const id = parseUrl(options.fill); + if(id && gradients[id]) { + const box = element.getBBox(); + const gradient = context.createLinearGradient(box.x, 0, box.x + box.width, 0); + + gradients[id].forEach(opt => { + const offset = parseInt(opt.offset.replace(/%/, '')); + gradient.addColorStop(offset / 100, opt.stopColor); + }); + + context.globalAlpha = options.opacity; + context.fillStyle = gradient; + context.fill(); + } +} + +function applyFilter(context, options, shared) { + let filterOptions; + const id = parseUrl(options.filter); + + if(id) { + filterOptions = shared.filters[id]; + + if(!filterOptions) { + filterOptions = { + offsetX: 0, + offsetY: 0, + blur: 0, + color: '#000' + }; + } + + context.shadowOffsetX = filterOptions.offsetX; + context.shadowOffsetY = filterOptions.offsetY; + context.shadowColor = filterOptions.color; + context.shadowBlur = filterOptions.blur; + } +} + +// translate and clip are the special attributtes, they should not be inherited by child nodes +function transformElement(context, options) { + context.translate(options.translateX || 0, options.translateY || 0); + options.translateX = undefined; + options.translateY = undefined; + + if(options.rotationAngle) { + context.translate(options.rotationX || 0, options.rotationY || 0); + context.rotate(options.rotationAngle * PI / 180); + context.translate(-(options.rotationX || 0), -(options.rotationY || 0)); + options.rotationAngle = undefined; + options.rotationX = undefined; + options.rotationY = undefined; + } + + if(isFinite(options.scaleX)) { + context.scale(options.scaleX, options.scaleY); + options.scaleX = undefined; + options.scaleY = undefined; + } +} + +function clipElement(context, options, shared) { + if(options['clip-path']) { + drawElement(shared.clipPaths[parseUrl(options['clip-path'])], context, {}, shared); + context.clip(); + options['clip-path'] = undefined; + } +} + +function hex2rgba(hexColor, alpha) { + const color = new Color(hexColor); + + return 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + alpha + ')'; +} + +function createGradient(element) { + const options = []; + + _each(element.childNodes, (_, { attributes }) => { + options.push({ + offset: attributes.offset.value, + stopColor: attributes['stop-color'].value + }); + }); + return options; +} + +function createFilter(element) { + let color; + let opacity; + const filterOptions = {}; + + _each(element.childNodes, function(_, node) { + const attr = node.attributes; + + if(!attr.result) { + return; + } + + switch(attr.result.value) { + case 'gaussianBlurResult': + filterOptions.blur = _number(attr.stdDeviation.value); + break; + case 'offsetResult': + filterOptions.offsetX = _number(attr.dx.value); + filterOptions.offsetY = _number(attr.dy.value); + break; + case 'floodResult': + color = attr['flood-color'] ? attr['flood-color'].value : '#000'; + opacity = attr['flood-opacity'] ? attr['flood-opacity'].value : 1; + filterOptions.color = hex2rgba(color, opacity); + break; + } + }); + + return filterOptions; +} + +function asyncEach(array, callback, d = new Deferred()) { + let i = 0; + for(; i < array.length; i++) { + const result = callback(array[i]); + if(isPromise(result)) { + result.then(() => { + asyncEach(Array.prototype.slice.call(array, i + 1), callback, d); + }); + break; + } + } + + if(i === array.length) { + d.resolve(); + } + + return d; +} + +///#DEBUG +export { asyncEach }; +///#ENDDEBUG + +function drawCanvasElements(elements, context, parentOptions, shared) { + return asyncEach(elements, function(element) { + switch(element.tagName && element.tagName.toLowerCase()) { + case 'g': + case 'svg': { + const options = extend({}, parentOptions, getElementOptions(element, shared.rootAppended)); + + context.save(); + + transformElement(context, options); + clipElement(context, options, shared); + + const onDone = () => { + context.restore(); + }; + const d = drawCanvasElements(element.childNodes, context, options, shared); + + if(isPromise(d)) { + d.then(onDone); + } else { + onDone(); + } + return d; + } + case 'defs': + return drawCanvasElements(element.childNodes, context, {}, shared); + case 'clippath': + shared.clipPaths[element.attributes.id.textContent] = element.childNodes[0]; + break; + case 'pattern': + shared.patterns[element.attributes.id.textContent] = element; + break; + case 'filter': + shared.filters[element.id] = createFilter(element); + break; + case 'lineargradient': + shared.gradients[element.attributes.id.textContent] = createGradient(element); + break; + default: + return drawElement(element, context, parentOptions, shared); + } + }); +} + +function setLineDash(context, options) { + let matches = options['stroke-dasharray'] && options['stroke-dasharray'].match(/(\d+)/g); + + if(matches && matches.length) { + matches = _map(matches, function(item) { + return _number(item); + }); + context.setLineDash(matches); + } +} + +function strokeElement(context, options, isText) { + const stroke = options.stroke; + + if(stroke && stroke !== 'none' && options['stroke-width'] !== 0) { + setLineDash(context, options); + context.lineJoin = options['stroke-linejoin']; + context.lineWidth = options['stroke-width']; + context.globalAlpha = options.strokeOpacity; + context.strokeStyle = stroke; + isText ? context.strokeText(options.text, options.x, options.y) : context.stroke(); + context.globalAlpha = 1; + } +} + +function getPattern(context, pattern, shared) { + const options = getElementOptions(pattern, shared.rootAppended); + const patternCanvas = imageCreator._createCanvas(options.width, options.height, 0); + const patternContext = patternCanvas.getContext('2d'); + + drawCanvasElements(pattern.childNodes, patternContext, options, shared); + + return context.createPattern(patternCanvas, 'repeat'); +} + +function fillElement(context, options, shared) { + const fill = options.fill; + + if(fill && fill !== 'none') { + if(fill.search(/url/) === -1) { + context.fillStyle = fill; + } else { + const pattern = shared.patterns[parseUrl(fill)]; + if(!pattern) { + return; + } + context.fillStyle = getPattern(context, pattern, shared); + } + context.globalAlpha = options.fillOpacity; + context.fill(); + context.globalAlpha = 1; + } +} + +parseAttributes = function(attributes) { + const newAttributes = {}; + let attr; + + _each(attributes, function(index, item) { + attr = item.textContent; + if(isFinite(attr)) { + attr = _number(attr); + } + newAttributes[item.name.toLowerCase()] = attr; // lowerCase for Edge + }); + + return newAttributes; +}; + +function drawBackground(context, width, height, backgroundColor, margin) { + context.fillStyle = backgroundColor || '#ffffff'; + context.fillRect(-margin, -margin, width + margin * 2, height + margin * 2); +} + +function createInvisibleDiv() { + const invisibleDiv = domAdapter.createElement('div'); + invisibleDiv.style.left = '-9999px'; + invisibleDiv.style.position = 'absolute'; + return invisibleDiv; +} + +function convertSvgToCanvas(svg, canvas, rootAppended) { + return drawCanvasElements(svg.childNodes, canvas.getContext('2d'), {}, { + clipPaths: {}, + patterns: {}, + filters: {}, + gradients: {}, + rootAppended + }); +} + +function getCanvasFromSvg(markup, { width, height, backgroundColor, margin, svgToCanvas = convertSvgToCanvas }) { + const scaledScreenInfo = calcScaledInfo(width, height); + const canvas = imageCreator._createCanvas(scaledScreenInfo.width, scaledScreenInfo.height, margin); + const context = canvas.getContext('2d'); + context.setTransform(scaledScreenInfo.pixelRatio, 0, 0, scaledScreenInfo.pixelRatio, 0, 0); + const svgElem = getSvgElement(markup); + let invisibleDiv; + const markupIsDomElement = domAdapter.isElementNode(markup); + context.translate(margin, margin); + + domAdapter.getBody().appendChild(canvas); + if(!markupIsDomElement) { + invisibleDiv = createInvisibleDiv(); + invisibleDiv.appendChild(svgElem); + domAdapter.getBody().appendChild(invisibleDiv); + } + // for rtl mode + if(svgElem.attributes.direction) { + canvas.dir = svgElem.attributes.direction.textContent; + } + drawBackground(context, width, height, backgroundColor, margin); + + return fromPromise(svgToCanvas(svgElem, canvas, markupIsDomElement && contains(domAdapter.getBody(), markup))) + .then(() => canvas) + .always(() => { + invisibleDiv && domAdapter.getBody().removeChild(invisibleDiv); + domAdapter.getBody().removeChild(canvas); + }); +} + +export const imageCreator = { + getImageData: function(markup, options) { + const mimeType = 'image/' + options.format; + // Injection for testing T403049 + if(isFunction(options.__parseAttributesFn)) { + parseAttributes = options.__parseAttributesFn; + } + + return getCanvasFromSvg(markup, options).then(canvas => getStringFromCanvas(canvas, mimeType)); + }, + + getData: function(markup, options) { + const that = this; + + return imageCreator.getImageData(markup, options).then(binaryData => { + const mimeType = 'image/' + options.format; + const data = isFunction(window.Blob) && !options.forceProxy ? + that._getBlob(binaryData, mimeType) : + that._getBase64(binaryData); + return data; + }); + }, + + _getBlob: function(binaryData, mimeType) { + let i; + const dataArray = new Uint8Array(binaryData.length); + + for(i = 0; i < binaryData.length; i++) { + dataArray[i] = binaryData.charCodeAt(i); + } + + return new window.Blob([dataArray.buffer], { type: mimeType }); + }, + + _getBase64: function(binaryData) { + return window.btoa(binaryData); + }, + + _createCanvas(width, height, margin) { + const canvas = $('')[0]; + + canvas.width = width + margin * 2; + canvas.height = height + margin * 2; + canvas.hidden = true; + + return canvas; + } +}; + +export function getData(data, options) { + return imageCreator.getData(data, options); +} + +export function testFormats(formats) { + const canvas = imageCreator._createCanvas(100, 100, 0); + return formats.reduce(function(r, f) { + const mimeType = ('image/' + f).toLowerCase(); + + if(canvas.toDataURL(mimeType).indexOf(mimeType) !== -1) { + r.supported.push(f); + } else { + r.unsupported.push(f); + } + return r; + }, { supported: [], unsupported: [] }); +} + +export function calcScaledInfo(width, height) { + const pixelRatio = window.devicePixelRatio || 1; + + return { + pixelRatio, + width: width * pixelRatio, + height: height * pixelRatio + }; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export.js new file mode 100644 index 0000000000000000000000000000000000000000..8b33d1450e6f0dda4e338ce2fa904e40900fc452 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export.js @@ -0,0 +1,231 @@ +import { isDate, isDefined, isObject, isFunction, isNumeric } from '../../core/utils/type'; +import { extend } from '../../core/utils/extend'; +import dateLocalization from '../../localization/date'; +import numberLocalization from '../../localization/number'; +import messageLocalization from '../../localization/message'; +import { ExportLoadPanel } from '../common/export_load_panel'; +import { hasWindow } from '../../core/utils/window'; + +export const Export = { + getFullOptions: function(options) { + const fullOptions = extend({}, options); + if(!(isDefined(fullOptions.jsPDFDocument) && isObject(fullOptions.jsPDFDocument))) { + throw Error('The "jsPDFDocument" field must contain a jsPDF instance.'); + } + if(!(isDefined(fullOptions.jsPDFDocument.autoTable) && isFunction(fullOptions.jsPDFDocument.autoTable))) { + throw Error('The "exportDataGrid" method requires a autoTable plugin for jsPDF object.'); + } + if(!isDefined(fullOptions.keepColumnWidths)) { + fullOptions.keepColumnWidths = true; + } + if(!isDefined(fullOptions.autoTableOptions)) { + fullOptions.autoTableOptions = this._getDefaultAutoTableOptions(); + } else { + if(!isObject(fullOptions.autoTableOptions)) { + throw Error('The "autoTableOptions" option must be of object type.'); + } + fullOptions.autoTableOptions = extend(true, {}, this._getDefaultAutoTableOptions(), fullOptions.autoTableOptions); + } + if(!isDefined(fullOptions.loadPanel)) { + fullOptions.loadPanel = {}; + } + if(!isDefined(fullOptions.loadPanel.enabled)) { + fullOptions.loadPanel.enabled = true; + } + if(!isDefined(fullOptions.loadPanel.text)) { + fullOptions.loadPanel.text = messageLocalization.format('dxDataGrid-exporting'); + } + + return fullOptions; + }, + + _getDefaultAutoTableOptions: function() { + return { + theme: 'plain', + tableLineColor: 149, + tableLineWidth: 0.1, + styles: { + textColor: 51, + lineColor: 149, + lineWidth: 0 + }, + columnStyles: {}, + headStyles: { + fontStyle: 'normal', + textColor: 149, + lineWidth: 0.1 + }, + bodyStyles: { + lineWidth: 0.1 + }, + head: [], + body: [] + }; + }, + + export: function(options) { + const { + jsPDFDocument, + autoTableOptions, + component, + customizeCell, + keepColumnWidths, + selectedRowsOnly, + loadPanel + } = options; + + const internalComponent = component._getInternalInstance?.() || component; + const initialLoadPanelEnabledOption = internalComponent.option('loadPanel').enabled; + + component.option('loadPanel.enabled', false); + let exportLoadPanel; + if(loadPanel.enabled && hasWindow()) { + const rowsView = component.getView('rowsView'); + + exportLoadPanel = new ExportLoadPanel(component, rowsView.element(), rowsView.element().parent(), loadPanel); + exportLoadPanel.show(); + } + + const dataProvider = component.getDataProvider(selectedRowsOnly); + const wrapText = !!component.option('wordWrapEnabled'); + + return new Promise((resolve) => { + dataProvider.ready().done(() => { + const columns = dataProvider.getColumns(); + const styles = dataProvider.getStyles(); + const dataRowsCount = dataProvider.getRowsCount(); + const headerRowCount = dataProvider.getHeaderRowCount(); + const mergedCells = []; + + if(keepColumnWidths) { + const pdfColumnWidths = this._tryGetPdfColumnWidths(autoTableOptions.tableWidth, dataProvider.getColumnsWidths()); + + if(isDefined(pdfColumnWidths) && isDefined(autoTableOptions.columnStyles)) { + this._setColumnWidths(autoTableOptions.columnStyles, pdfColumnWidths); + } + } + + for(let rowIndex = 0; rowIndex < dataRowsCount; rowIndex++) { + const row = []; + + for(let cellIndex = 0; cellIndex < columns.length; cellIndex++) { + + const { value, cellSourceData: gridCell } = dataProvider.getCellData(rowIndex, cellIndex, true); + const cellStyle = styles[dataProvider.getStyleId(rowIndex, cellIndex)]; + + const pdfCell = { + content: this._getFormattedValue(value, cellStyle.format), + styles: this._getPDFCellStyles(gridCell.rowType, columns[cellIndex].alignment, cellStyle, wrapText) + }; + + if(gridCell.rowType === 'header') { + const mergedRange = this._tryGetMergeRange(rowIndex, cellIndex, mergedCells, dataProvider); + if(mergedRange && mergedRange.rowSpan > 0) { + pdfCell.rowSpan = mergedRange.rowSpan + 1; + } + if(mergedRange && mergedRange.colSpan > 0) { + pdfCell.colSpan = mergedRange.colSpan + 1; + } + const isMergedCell = mergedCells[rowIndex] && mergedCells[rowIndex][cellIndex]; + if(!isMergedCell || pdfCell.rowSpan > 1 || pdfCell.colSpan > 1) { + if(isFunction(customizeCell)) { + customizeCell({ gridCell, pdfCell }); + } + row.push(pdfCell); + } + } else if(gridCell.rowType === 'group' && !isDefined(pdfCell.content) && row.length === 1) { + row[0].colSpan = row[0].colSpan ?? 1; + row[0].colSpan++; + } else { + pdfCell.content = pdfCell.content ?? ''; + if(isFunction(customizeCell)) { + customizeCell({ gridCell, pdfCell }); + } + row.push(pdfCell); + } + } + + if(rowIndex < headerRowCount) { + autoTableOptions.head.push(row); + } else { + autoTableOptions.body.push(row); + } + } + + jsPDFDocument.autoTable(autoTableOptions); + ///#DEBUG + jsPDFDocument.autoTable.__autoTableOptions = autoTableOptions; + ///#ENDDEBUG + + resolve(); + }).always(() => { + component.option('loadPanel.enabled', initialLoadPanelEnabledOption); + + if(loadPanel.enabled && hasWindow()) { + exportLoadPanel.dispose(); + } + }); + }); + }, + + _getFormattedValue: function(value, format) { + if(isDefined(format)) { + if(isDate(value)) { + return dateLocalization.format(value, format); + } + if(isNumeric(value)) { + return numberLocalization.format(value, format); + } + } + return value; + }, + + _getPDFCellStyles: function(rowType, columnAlignment, cellStyle, wrapText) { + const { alignment: cellAlignment, bold } = cellStyle; + const align = (rowType === 'header') ? columnAlignment : cellAlignment; + const pdfCellStyle = {}; + + if(align) { + pdfCellStyle['halign'] = align; + } + if(bold && rowType !== 'header') { + pdfCellStyle.fontStyle = 'bold'; + } + if(wrapText) { + pdfCellStyle.cellWidth = 'wrap'; + } + + return pdfCellStyle; + }, + + _tryGetMergeRange: function(rowIndex, cellIndex, mergedCells, dataProvider) { + if(!mergedCells[rowIndex] || !mergedCells[rowIndex][cellIndex]) { + const { colspan, rowspan } = dataProvider.getCellMerging(rowIndex, cellIndex); + if(colspan || rowspan) { + for(let i = rowIndex; i <= rowIndex + rowspan || 0; i++) { + for(let j = cellIndex; j <= cellIndex + colspan || 0; j++) { + if(!mergedCells[i]) { + mergedCells[i] = []; + } + mergedCells[i][j] = true; + } + } + return { rowSpan: rowspan, colSpan: colspan }; + } + } + }, + + _tryGetPdfColumnWidths(autoTableWidth, columnWidths) { + if(isNumeric(autoTableWidth) && isDefined(columnWidths)) { + const tableWidth = columnWidths.reduce((a, b) => a + b, 0); + return columnWidths.map((columnWidth) => autoTableWidth * columnWidth / tableWidth); + } + }, + + _setColumnWidths: function(autoTableColumnStyles, pdfColumnWidths) { + pdfColumnWidths.forEach((width, index) => { + autoTableColumnStyles[index] = autoTableColumnStyles[index] || {}; + autoTableColumnStyles[index].cellWidth = width; + }); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_data_grid.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_data_grid.js new file mode 100644 index 0000000000000000000000000000000000000000..713d3f00f641c391b6087f6c1017290ed37d10bf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_data_grid.js @@ -0,0 +1,25 @@ +import { isDefined, isObject } from '../../core/utils/type'; +import { Export } from './export'; + +function _getFullOptions(options) { + if(!(isDefined(options) && isObject(options))) { + throw Error('The "exportDataGrid" method requires a configuration object.'); + } + if(!(isDefined(options.component) && isObject(options.component) && options.component.NAME === 'dxDataGrid')) { + throw Error('The "component" field must contain a DataGrid instance.'); + } + if(!isDefined(options.selectedRowsOnly)) { + options.selectedRowsOnly = false; + } + return Export.getFullOptions(options); +} + +//#DEBUG +exportDataGrid.__internals = { _getFullOptions }; +//#ENDDEBUG + +function exportDataGrid(options) { + return Export.export(_getFullOptions(options)); +} + +export { exportDataGrid }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_gantt.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_gantt.js new file mode 100644 index 0000000000000000000000000000000000000000..00767ef47501132f3a4a714faeba2c428806fea7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/export_gantt.js @@ -0,0 +1,6 @@ +function exportGantt(options) { + const component = options.component; + return component?.exportToPdf(options); +} + +export { exportGantt }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/draw_utils.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/draw_utils.js new file mode 100644 index 0000000000000000000000000000000000000000..ba136feeb6fb0073da7adc52d0c1b797eb531832 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/draw_utils.js @@ -0,0 +1,221 @@ +import { isDefined, isObject } from '../../../core/utils/type'; +import { extend } from '../../../core/utils/extend'; +import { calculateTextHeight, getTextLines } from './pdf_utils_v3'; + +const defaultBorderLineWidth = 1; + +function round(value) { + return Math.round(value * 1000) / 1000; // checked with browser zoom - 500% +} + +function drawCellsContent(doc, customDrawCell, cellsArray, docStyles) { + cellsArray.forEach(cell => { + const { _rect, pdfRowInfo, gridCell, ...pdfCell } = cell; + const eventArg = { doc, rect: _rect, pdfCell, gridCell, cancel: false }; + customDrawCell?.(eventArg); + if(!eventArg.cancel) { + drawCellBackground(doc, cell); + drawCellText(doc, cell, docStyles); + } + }); +} + +function drawLine(doc, startX, startY, endX, endY) { + doc.line(round(startX), round(startY), round(endX), round(endY)); +} + +function drawRect(doc, x, y, width, height, style) { + if(isDefined(style)) { + doc.rect(round(x), round(y), round(width), round(height), style); + } else { + doc.rect(round(x), round(y), round(width), round(height)); + } +} + +function getLineHeightShift(doc) { + const DEFAULT_LINE_HEIGHT = 1.15; + + // TODO: check lineHeightFactor from text options. Currently supports only doc options - https://github.com/MrRio/jsPDF/issues/3234 + return (doc.getLineHeightFactor() - DEFAULT_LINE_HEIGHT) * doc.getFontSize(); +} + +function drawTextInRect(doc, text, rect, verticalAlign, horizontalAlign, wordWrapEnabled) { + const textArray = getTextLines(doc, text, doc.getFont(), { wordWrapEnabled, targetRectWidth: rect.w }); + const linesCount = textArray.length; + + const heightOfOneLine = calculateTextHeight(doc, textArray[0], doc.getFont(), { wordWrapEnabled: false }); + + const vAlign = verticalAlign ?? 'middle'; + const hAlign = horizontalAlign ?? 'left'; + const verticalAlignCoefficientsMap = { top: 0, middle: 0.5, bottom: 1 }; + const horizontalAlignMap = { left: 0, center: 0.5, right: 1 }; + + const y = rect.y + + (rect.h * verticalAlignCoefficientsMap[vAlign]) + - heightOfOneLine * (linesCount - 1) * verticalAlignCoefficientsMap[vAlign] + + getLineHeightShift(doc); + + const x = rect.x + + (rect.w * horizontalAlignMap[hAlign]); + + doc.text(textArray.join('\n'), round(x), round(y), { baseline: vAlign, align: hAlign }); +} + +function drawCellBackground(doc, cell) { + if(isDefined(cell.backgroundColor)) { + if(cell.backgroundColor !== doc.getFillColor()) { + callMethodWithColorParameter(doc, 'setFillColor', cell.backgroundColor); + } + drawRect(doc, cell._rect.x, cell._rect.y, cell._rect.w, cell._rect.h, 'F'); + } +} + +function drawCellText(doc, cell, docStyles) { + if(isDefined(cell.text) && cell.text !== '') { // TODO: use cell.text.trim() ? + const { textColor, font, _rect, padding } = cell; + setTextStyles(doc, { textColor, font }, docStyles); + const textRect = { + x: _rect.x + padding.left, + y: _rect.y + padding.top, + w: _rect.w - (padding.left + padding.right), + h: _rect.h - (padding.top + padding.bottom) + }; + drawTextInRect(doc, cell.text, textRect, cell.verticalAlign, cell.horizontalAlign, cell.wordWrapEnabled); + } +} + +function drawCellsLines(doc, cellsArray, docStyles) { + cellsArray + .filter(cell => !isDefined(cell.borderColor)) + .forEach(cell => { + drawBorders(doc, cell._rect, cell, docStyles); + }); + + cellsArray + .filter(cell => isDefined(cell.borderColor)) + .forEach(cell => { + drawBorders(doc, cell._rect, cell, docStyles); + }); +} + +function drawGridLines(doc, rect, docStyles) { + drawBorders(doc, rect, {}, docStyles); +} + +function drawBorders(doc, rect, { borderColor, drawLeftBorder = true, drawRightBorder = true, drawTopBorder = true, drawBottomBorder = true }, docStyles) { + if(!isDefined(rect)) { + throw 'rect is required'; + } + + if(!drawLeftBorder && !drawRightBorder && !drawTopBorder && !drawBottomBorder) { + return; + } else if(drawLeftBorder && drawRightBorder && drawTopBorder && drawBottomBorder) { + setLinesStyles(doc, { borderColor }, docStyles); + drawRect(doc, rect.x, rect.y, rect.w, rect.h); + } else { + setLinesStyles(doc, { borderColor }, docStyles); + + if(drawTopBorder) { + drawLine(doc, rect.x, rect.y, rect.x + rect.w, rect.y); // top + } + + if(drawLeftBorder) { + drawLine(doc, rect.x, rect.y, rect.x, rect.y + rect.h); // left + } + + if(drawRightBorder) { + drawLine(doc, rect.x + rect.w, rect.y, rect.x + rect.w, rect.y + rect.h); // right + } + + if(drawBottomBorder) { + drawLine(doc, rect.x, rect.y + rect.h, rect.x + rect.w, rect.y + rect.h); // bottom + } + } +} + +function setTextStyles(doc, { textColor, font }, docStyles) { + const currentTextColor = isDefined(textColor) ? textColor : docStyles.textColor; + if(currentTextColor !== doc.getTextColor()) { + callMethodWithColorParameter(doc, 'setTextColor', currentTextColor); + } + + const currentFont = isDefined(font) ? extend({}, docStyles.font, font) : docStyles.font; + const docFont = doc.getFont(); + if( + currentFont.name !== docFont.fontName || + currentFont.style !== docFont.fontStyle || + isDefined(currentFont.weight) // fontWeight logic, https://raw.githack.com/MrRio/jsPDF/master/docs/jspdf.js.html#line4842 + ) { + doc.setFont(currentFont.name, currentFont.style, currentFont.weight); + } + if(currentFont.size !== doc.getFontSize()) { + doc.setFontSize(currentFont.size); + } +} + +function setLinesStyles(doc, { borderColor }, docStyles) { + doc.setLineWidth(defaultBorderLineWidth); + const currentBorderColor = isDefined(borderColor) ? borderColor : docStyles.borderColor; + if(currentBorderColor !== doc.getDrawColor()) { + callMethodWithColorParameter(doc, 'setDrawColor', currentBorderColor); + } +} + +function callMethodWithColorParameter(doc, method, color) { + if(!isObject(color)) { + doc[method](color); + } else { + const argsCount = Object.keys(color).length; + if(argsCount === 3) { + doc[method](color.ch1, color.ch2, color.ch3); + } else if(argsCount === 4) { + doc[method](color.ch1, color.ch2, color.ch3, color.ch4); + } else { + throw Error(`An incorrect color object was passed: 3 or 4 members are expected while the passed object has ${argsCount} members`); + } + } +} + +function getDocumentStyles(doc) { + const docFont = doc.getFont(); + + return { + borderColor: doc.getDrawColor(), + font: { + name: docFont.fontName, + style: docFont.fontStyle, + size: doc.getFontSize() + }, + textColor: doc.getTextColor() + }; +} + +function setDocumentStyles(doc, styles) { + const { + borderColor, + font, + textColor + } = styles; + + const docFont = doc.getFont(); + if( + docFont.fontName !== font.name || + docFont.fontStyle !== font.style + ) { + doc.setFont(font.name, font.style, undefined); + } + const docFontSize = doc.getFontSize(); + if(docFontSize !== font.size) { + doc.setFontSize(font.size); + } + + if(doc.getDrawColor() !== borderColor) { + doc.setDrawColor(borderColor); + } + + if(doc.getTextColor() !== textColor) { + doc.setTextColor(textColor); + } +} + +export { drawCellsContent, drawCellsLines, drawGridLines, getDocumentStyles, setDocumentStyles, drawTextInRect, drawRect, drawLine }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/export_data_grid_3.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/export_data_grid_3.js new file mode 100644 index 0000000000000000000000000000000000000000..3a032caf7d1a493aafc26942c887b7e079f088d8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/export_data_grid_3.js @@ -0,0 +1,115 @@ +import { isDefined } from '../../../core/utils/type'; +import { extend } from '../../../core/utils/extend'; +import { normalizeRowsInfo } from './normalizeOptions'; +import { initializeCellsWidth, applyColSpans, applyRowSpans, applyBordersConfig, calculateHeights, calculateCoordinates, calculateTableSize, resizeFirstColumnByIndentLevel } from './row_utils'; +import { updateRowsAndCellsHeights } from './height_updater'; +import { generateRowsInfo } from './rows_generator'; +import { drawCellsContent, drawCellsLines, drawGridLines, getDocumentStyles, setDocumentStyles } from './draw_utils'; + +// TODO: check names with techwritters +// IPDFExportOptions: { +// topLeft: {x: number, y: number}, +// indent: number, +// margin: { top:number, left:number, right:number, bottom:number } | number +// customizeCell: (IPdfRowInfo): void +// customDrawCell: (rect, pdfCell, gridCell, cancel): void (similar to the https://docs.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Grid.GridView.CustomDrawCell) +// } +function _getFullOptions(options) { + const fullOptions = extend({}, options); + if(!isDefined(fullOptions.topLeft)) { + throw 'options.topLeft is required'; + } + if(!isDefined(fullOptions.indent)) { + fullOptions.indent = 10; + } + + return fullOptions; +} + +function exportDataGrid(doc, dataGrid, options) { + options = extend({}, _getFullOptions(options)); + + const dataProvider = dataGrid.getDataProvider(); + return new Promise((resolve) => { + dataProvider.ready().done(() => { + + // TODO: pass rowOptions: { headerStyles: { backgroundColor }, groupStyles: {...}, totalStyles: {...} } + const rowsInfo = generateRowsInfo(dataProvider, dataGrid, options.rowOptions?.headerStyles?.backgroundColor); + + if(options.customizeCell) { + rowsInfo.forEach(rowInfo => rowInfo.cells.forEach(cellInfo => + // In 'customizeCell' callback you can change values of these properties: + // - e.pdfCell.height - will be used instead of a calculated height + // - e.pdfCell.text - the text that will be printed + // - e.pdfCell.customDrawContent - will be called at the drawing stage + // you can introduce new properties to 'e.pdfCell' and use them in your callback + // TODO: e.pdfRow + e.gridCell ??? + // - e.pdfCell.wordWrapEnabled - will be used to split cell text by the width of its cell + // + // And, you can read values of these properties ('readonly'): + // - e.gridCell (TODO: list of properties) + // - e.pdfRowInfo (TODO: list of properties) + options.customizeCell(cellInfo) + )); + } + + normalizeRowsInfo(rowsInfo); + + // computes withs of the cells depending of the options + initializeCellsWidth(doc, dataProvider, rowsInfo, options); + + // apply intends for correctly set width and colSpan for grouped rows + resizeFirstColumnByIndentLevel(rowsInfo, options); + + // apply colSpans + recalculate cellsWidth + applyColSpans(rowsInfo); + + // set/update/initCellHeight - autocalculate by text+width+wordWrapEnabled+padding or use value from customizeCell + calculateHeights(doc, rowsInfo, options); + + // apply rowSpans + recalculate cells height + applyRowSpans(rowsInfo); + + // when we know all rowSpans we can recalculate rowsHeight + updateRowsAndCellsHeights(doc, rowsInfo); + + // when we known all sizes we can calculate all coordinates + calculateCoordinates(doc, rowsInfo, options); // set/init/update 'pdfCell.top/left' + + // recalculate for grouped rows + // TODO: applyGroupIndents() + + applyBordersConfig(rowsInfo); + + // splitting to pages + // ?? TODO: Does split a cell which have an attribute 'colSpan/rowSpan > 0' into two cells and place the first cell on the first page and second cell on the second page. And show initial 'text' in the both new cells ?? + // TODO: applySplitting() + + const pdfCellsInfo = [].concat.apply([], + rowsInfo.map(rowInfo => { + return rowInfo.cells + .filter(cell => !isDefined(cell.pdfCell.isMerged)) + .map(cellInfo => { + return { ...cellInfo.pdfCell, gridCell: cellInfo.gridCell, pdfRowInfo: cellInfo.pdfRowInfo }; + }); + }) + ); + + const docStyles = getDocumentStyles(doc); + drawCellsContent(doc, options.customDrawCell, pdfCellsInfo, docStyles); + drawCellsLines(doc, pdfCellsInfo, docStyles); + + const isDrawTableBorderSpecified = options.drawTableBorder === true; + const isEmptyPdfCellsInfoSpecified = isDefined(pdfCellsInfo) && pdfCellsInfo.length === 0; + if(isDrawTableBorderSpecified || isEmptyPdfCellsInfoSpecified) { + const tableRect = calculateTableSize(doc, rowsInfo, options); // TODO: after splitting to pages we need get 'rowsInfo' for selected table in the page + drawGridLines(doc, tableRect, docStyles); + } + setDocumentStyles(doc, docStyles); + + resolve(); + }); + }); +} + +export { exportDataGrid }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/height_updater.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/height_updater.js new file mode 100644 index 0000000000000000000000000000000000000000..f842ebff8343c22feef94407575fe98cc2a0dbb8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/height_updater.js @@ -0,0 +1,76 @@ +import { isDefined } from '../../../core/utils/type'; +import { calculateTextHeight, calculateTargetRectWidth } from './pdf_utils_v3'; + +function updateRowsAndCellsHeights(doc, rows) { + const rowsAdditionalHeights = calculateAdditionalRowsHeights(doc, rows); + + rows.forEach(row => { + row.height += rowsAdditionalHeights[row.rowIndex]; + }); + + rows.forEach((row) => { + row.cells.forEach(cell => { + const rowsCount = (cell.rowSpan ?? 0) + 1; + cell.pdfCell._rect.h = rows + .slice(row.rowIndex, row.rowIndex + rowsCount) + .reduce((accumulator, rowInfo) => accumulator + rowInfo.height, 0); + }); + }); +} + +function calculateAdditionalRowsHeights(doc, rows) { + const rowsAdditionalHeights = Array.from({ length: rows.length }, () => 0); + + const sortedRows = sortRowsByMaxRowSpanAsc(rows); + sortedRows.forEach(row => { + const cellsWithRowSpan = row.cells + .filter(cell => isDefined(cell.rowSpan)); + + cellsWithRowSpan.forEach(cell => { + const targetRectWidth = calculateTargetRectWidth(cell.pdfCell._rect.w, cell.pdfCell.padding); + const textHeight = calculateTextHeight(doc, cell.pdfCell.text, cell.pdfCell.font, { + wordWrapEnabled: cell.pdfCell.wordWrapEnabled, + targetRectWidth + }); + const cellHeight = textHeight + cell.pdfCell.padding.top + cell.pdfCell.padding.bottom; + + const rowsCount = cell.rowSpan + 1; + const currentRowSpanRowsHeight = rows + .slice(row.rowIndex, row.rowIndex + rowsCount) + .reduce((accumulator, rowInfo) => accumulator + rowInfo.height + rowsAdditionalHeights[rowInfo.rowIndex], 0); + + if(cellHeight > currentRowSpanRowsHeight) { + const delta = (cellHeight - currentRowSpanRowsHeight) / rowsCount; + for(let spanIndex = row.rowIndex; spanIndex < row.rowIndex + rowsCount; spanIndex++) { + rowsAdditionalHeights[spanIndex] += delta; + } + } + }); + }); + + return rowsAdditionalHeights; +} + +function sortRowsByMaxRowSpanAsc(rows) { + const getMaxRowSpan = (row) => { + const spansArray = row.cells.map(cell => cell.rowSpan ?? 0); + return Math.max(...spansArray); + }; + + const sortByMaxRowSpan = (row1, row2) => { + const row1RowSpan = getMaxRowSpan(row1); + const row2RowSpan = getMaxRowSpan(row2); + + if(row1RowSpan > row2RowSpan) { + return 1; + } + if(row2RowSpan > row1RowSpan) { + return -1; + } + return 0; + }; + + return [...rows].sort(sortByMaxRowSpan); +} + +export { updateRowsAndCellsHeights }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/normalizeOptions.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/normalizeOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..9e4a236599e927d27fb00ac15611b1fc18c77fa7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/normalizeOptions.js @@ -0,0 +1,28 @@ +import { isNumeric } from '../../../core/utils/type'; + +function normalizeBoundaryValue(value) { + if(isNumeric(value)) { + return { + top: value, + right: value, + bottom: value, + left: value + }; + } + return { + top: value?.top ?? 0, + right: value?.right ?? 0, + bottom: value?.bottom ?? 0, + left: value?.left ?? 0, + }; +} + +function normalizeRowsInfo(rowsInfo) { + rowsInfo.forEach(row => { + row.cells.forEach(({ pdfCell }) => { + pdfCell.padding = normalizeBoundaryValue(pdfCell.padding); + }); + }); +} + +export { normalizeRowsInfo, normalizeBoundaryValue }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/pdf_utils_v3.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/pdf_utils_v3.js new file mode 100644 index 0000000000000000000000000000000000000000..5e60aaeb6e72546b52142e787b646e94fb4d2ea2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/pdf_utils_v3.js @@ -0,0 +1,53 @@ +import { isDefined } from '../../../core/utils/type'; + +function getTextLines(doc, text, font, { wordWrapEnabled, targetRectWidth }) { + if(wordWrapEnabled) { + // it also splits text by '\n' automatically + return doc.splitTextToSize(text, targetRectWidth, { + fontSize: font?.size || doc.getFontSize() + }); + } + return text.split('\n'); +} + +function calculateTargetRectWidth(columnWidth, padding) { + return columnWidth - (padding.left + padding.right); +} + +function calculateTextHeight(doc, text, font, { wordWrapEnabled, targetRectWidth }) { + const height = doc.getTextDimensions(text, { + fontSize: font?.size || doc.getFontSize() + }).h; + + const linesCount = getTextLines(doc, text, font, { wordWrapEnabled, targetRectWidth }).length; + return height * linesCount * doc.getLineHeightFactor(); +} + +function calculateRowHeight(doc, cells, columnWidths) { + if(cells.length !== columnWidths.length) { + throw 'the cells count must be equal to the count of the columns'; + } + + let rowHeight = 0; + for(let cellIndex = 0; cellIndex < cells.length; cellIndex++) { + if(isDefined(cells[cellIndex].rowSpan)) { + // height will be computed at the recalculateHeightForMergedRows step + continue; + } + const cellText = cells[cellIndex].pdfCell.text; + const cellPadding = cells[cellIndex].pdfCell.padding; + const font = cells[cellIndex].pdfCell.font; + const wordWrapEnabled = cells[cellIndex].pdfCell.wordWrapEnabled; + const columnWidth = columnWidths[cellIndex]; + const targetRectWidth = calculateTargetRectWidth(columnWidth, cellPadding); + if(isDefined(cellText)) { + const cellHeight = calculateTextHeight(doc, cellText, font, { wordWrapEnabled, targetRectWidth }) + cellPadding.top + cellPadding.bottom; + if(rowHeight < cellHeight) { + rowHeight = cellHeight; + } + } + } + return rowHeight; +} + +export { calculateRowHeight, calculateTextHeight, calculateTargetRectWidth, getTextLines }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/row_utils.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/row_utils.js new file mode 100644 index 0000000000000000000000000000000000000000..ae31552807ca045e0115137721d213624f4c1a98 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/row_utils.js @@ -0,0 +1,160 @@ +import { isDefined } from '../../../core/utils/type'; +import { calculateRowHeight } from './pdf_utils_v3'; +import { normalizeBoundaryValue } from './normalizeOptions'; + + +function calculateColumnsWidths(doc, dataProvider, topLeft, margin) { + const columnsWidths = dataProvider.getColumnsWidths(); + if(!columnsWidths.length) { + return []; + } + + const summaryGridWidth = columnsWidths + .reduce((accumulator, width) => accumulator + width); + + const normalizedMargin = normalizeBoundaryValue(margin); + + // TODO: check measure units there + const availablePageWidth = doc.internal.pageSize.getWidth() - (topLeft?.x ?? 0) + - normalizedMargin.left - normalizedMargin.right; + + const ratio = availablePageWidth >= summaryGridWidth + ? 1 + : availablePageWidth / summaryGridWidth; + + return columnsWidths.map(width => width * ratio); +} + +function initializeCellsWidth(doc, dataProvider, rows, options) { + const columnWidths = options?.columnWidths ?? calculateColumnsWidths(doc, dataProvider, options?.topLeft, options?.margin); + rows.forEach(row => { + row.cells.forEach(({ gridCell, pdfCell }, index) => { + pdfCell._rect.w = columnWidths[index]; + }); + }); +} + +function calculateHeights(doc, rows, options) { + rows.forEach(row => { + const pdfCells = row.cells.map(c => c.pdfCell); + + let customerHeight; + if(options.onRowExporting) { + const args = { rowCells: pdfCells }; + options.onRowExporting(args); + if(isDefined(args.rowHeight)) { + customerHeight = args.rowHeight; + } + } + + row.height = isDefined(customerHeight) + ? customerHeight + : calculateRowHeight(doc, row.cells, pdfCells.map(c => c._rect.w)); + pdfCells.forEach(cell => { + cell._rect.h = row.height; + }); + }); +} + +function applyColSpans(rows) { + for(let rowIndex = 0; rowIndex < rows.length; rowIndex++) { + const row = rows[rowIndex]; + for(let cellIndex = 0; cellIndex < row.cells.length; cellIndex++) { + const cell = row.cells[cellIndex]; + if(isDefined(cell.colSpan) && !isDefined(cell.pdfCell.isMerged)) { + for(let spanIndex = 1; spanIndex <= cell.colSpan; spanIndex++) { + const mergedCell = rows[rowIndex].cells[cellIndex + spanIndex]; + cell.pdfCell._rect.w += mergedCell.pdfCell._rect.w; + mergedCell.pdfCell._rect.w = 0; + mergedCell.pdfCell.isMerged = true; + } + } + } + } +} + +function applyRowSpans(rows) { + for(let rowIndex = 0; rowIndex < rows.length; rowIndex++) { + const row = rows[rowIndex]; + for(let cellIndex = 0; cellIndex < row.cells.length; cellIndex++) { + const cell = row.cells[cellIndex]; + if(isDefined(cell.rowSpan) && !isDefined(cell.pdfCell.isMerged)) { + for(let spanIndex = 1; spanIndex <= cell.rowSpan; spanIndex++) { + const mergedCell = rows[rowIndex + spanIndex].cells[cellIndex]; + cell.pdfCell._rect.h += mergedCell.pdfCell._rect.h; + mergedCell.pdfCell._rect.h = 0; + mergedCell.pdfCell.isMerged = true; + } + } + } + } +} + +function resizeFirstColumnByIndentLevel(rows, options) { + rows.forEach(row => { + row.cells[0].pdfCell._rect.w -= row.indentLevel * options.indent; + }); +} + +function applyBordersConfig(rows) { + for(let rowIndex = 0; rowIndex < rows.length; rowIndex++) { + const cells = rows[rowIndex].cells; + for(let columnIndex = 0; columnIndex < cells.length; columnIndex++) { + const pdfCell = cells[columnIndex].pdfCell; + const leftPdfCell = (columnIndex >= 1) ? cells[columnIndex - 1].pdfCell : null; + const topPdfCell = (rowIndex >= 1) ? rows[rowIndex - 1].cells[columnIndex].pdfCell : null; + + if(pdfCell.drawLeftBorder === false && !isDefined(cells[columnIndex].colSpan)) { // TODO: Check this logic after implementing splitting to pages + if(isDefined(leftPdfCell)) { + leftPdfCell.drawRightBorder = false; + } + } else if(!isDefined(pdfCell.drawLeftBorder)) { + if(isDefined(leftPdfCell) && leftPdfCell.drawRightBorder === false) { + pdfCell.drawLeftBorder = false; + } + } + + if(pdfCell.drawTopBorder === false) { + if(isDefined(topPdfCell)) { + topPdfCell.drawBottomBorder = false; + } + } else if(!isDefined(pdfCell.drawTopBorder)) { + if(isDefined(topPdfCell) && topPdfCell.drawBottomBorder === false) { + pdfCell.drawTopBorder = false; + } + } + } + } +} + +function calculateCoordinates(doc, rows, options) { + const topLeft = options?.topLeft; + const margin = normalizeBoundaryValue(options?.margin); + + let y = (topLeft?.y ?? 0) + margin.top; + rows.forEach(row => { + let x = (topLeft?.x ?? 0) + margin.left; + const intend = row.indentLevel * options.indent; + row.cells.forEach(cell => { + cell.pdfCell._rect.x = x + intend; + cell.pdfCell._rect.y = y; + x += cell.pdfCell._rect.w; + }); + y += row.height; + }); +} + +function calculateTableSize(doc, rows, options) { + const topLeft = options?.topLeft; + const columnWidths = options?.columnWidths; + const rowHeights = rows.map(row => row.height); + + return { + x: topLeft?.x ?? 0, + y: topLeft?.y ?? 0, + w: columnWidths?.reduce((a, b) => a + b, 0) ?? 0, + h: rowHeights?.reduce((a, b) => a + b, 0) ?? 0 + }; +} + +export { initializeCellsWidth, applyColSpans, applyRowSpans, resizeFirstColumnByIndentLevel, applyBordersConfig, calculateHeights, calculateCoordinates, calculateTableSize }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/rows_generator.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/rows_generator.js new file mode 100644 index 0000000000000000000000000000000000000000..6c6e075d48e27152e987fc7867f26dfb4815568d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/jspdf/v3/rows_generator.js @@ -0,0 +1,112 @@ +import { isDefined } from '../../../core/utils/type'; + +// Returns IPdfRowInfo[] +// [ +// { +// rowType, - readonly +// rowIndex, - readonly +// indentLevel, - readonly +// cells: [ - readonly +// { +// colSpan, - readonly (for internal use/hide from api/useless???) +// rowSpan, - readonly (for internal use/hide from api/useless???) +// gridCell, - readonly +// pdfCell : { +// text, +// textColor: '#0000ff', // TODO: specify color format for docs +// backgroundColor: '#0000ff', // TODO: specify color format for docs +// verticalAlign: 'top' | 'bottom' | 'middle | undefined. Default value is middle +// horizontalAlign: 'left' | 'right' | 'center' | undefined. Default value is left +// wordWrapEnabled, // true | false. Default value is inherited from grid props, +// drawRightBorder, +// drawLeftBorder +// drawTopBorder +// drawBottomBorder +// } +// } +// ], +// } +// ] + +function generateRowsInfo(dataProvider, dataGrid, headerBackgroundColor) { + const result = []; + + const rowsCount = dataProvider.getRowsCount(); + const wordWrapEnabled = !!dataGrid.option('wordWrapEnabled'); + const columns = dataProvider.getColumns(); + + for(let rowIndex = 0; rowIndex < rowsCount; rowIndex++) { + const rowType = dataProvider.getCellData(rowIndex, 0, true).cellSourceData.rowType; + let indentLevel = rowType !== 'header' ? dataProvider.getGroupLevel(rowIndex) : 0; + const previousRow = result[rowIndex - 1]; + if(rowType === 'groupFooter' && previousRow?.rowType === 'groupFooter') { + indentLevel = previousRow.indentLevel - 1; + } + + result.push({ + rowType: rowType, + indentLevel, + cells: generateRowCells({ + dataProvider, + rowIndex, + wordWrapEnabled, + columns, + rowType, + backgroundColor: (rowType === 'header') ? headerBackgroundColor : undefined + }), + rowIndex, + }); + } + + return result; +} + +function generateRowCells({ dataProvider, rowIndex, wordWrapEnabled, columns, rowType, backgroundColor }) { + const result = []; + for(let cellIndex = 0; cellIndex < columns.length; cellIndex++) { + const cellData = dataProvider.getCellData(rowIndex, cellIndex, true); + const cellInfo = { + gridCell: cellData.cellSourceData, + pdfCell: { + text: cellData.value?.toString(), + verticalAlign: 'middle', + horizontalAlign: columns[cellIndex].alignment ?? 'left', + wordWrapEnabled, + backgroundColor, + padding: 0, + _rect: {} + } + }; + + if(rowType === 'header') { + const cellMerging = dataProvider.getCellMerging(rowIndex, cellIndex); + if(cellMerging && cellMerging.rowspan > 0) { + cellInfo.rowSpan = cellMerging.rowspan; + } + if(cellMerging && cellMerging.colspan > 0) { + cellInfo.colSpan = cellMerging.colspan; + } + } else if(rowType === 'group') { + cellInfo.pdfCell.drawLeftBorder = cellIndex === 0; + cellInfo.pdfCell.drawRightBorder = cellIndex === columns.length - 1; + + if(cellIndex > 0) { + const isEmptyCellsExceptFirst = result.slice(1).reduce( + (accumulate, cellInfo) => { return accumulate && !isDefined(cellInfo.pdfCell.text); }, + true); + if(!isDefined(cellInfo.pdfCell.text) && isEmptyCellsExceptFirst) { + result[0].pdfCell.drawRightBorder = true; + for(let i = 0; i < result.length; i++) { + result[i].colSpan = result.length; + } + cellInfo.colSpan = result.length; + } + } + } + + result.push(cellInfo); + } + return result; +} + +export { generateRowsInfo }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/pdf_creator.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/pdf_creator.js new file mode 100644 index 0000000000000000000000000000000000000000..fe38c1565743335e599977a0a49dd5230a970e9d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/pdf_creator.js @@ -0,0 +1,121 @@ +import { version } from '../core/version'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import { imageCreator, calcScaledInfo } from './image_creator'; +import { isFunction } from '../core/utils/type'; +import { extend } from '../core/utils/extend'; + +const mainPageTemplate = '%PDF-1.3\r\n2 0 obj\r\n<>>>\r\nendobj\r\n4 0 obj\r\n<>\r\nendobj\r\n7 0 obj\r\n<>\r\nendobj\r\n1 0 obj\r\n<>\r\nendobj\r\n'; +const contentTemplate = '3 0 obj\r\n<>stream\r\n0.20 w\n0 G\nq _width_ 0 0 _height_ 0.00 0.00 cm /I0 Do Q\r\nendstream\r\nendobj\r\n'; +const infoTemplate = '6 0 obj\r\n<>\r\nendobj\r\n'; +const imageStartTemplate = '5 0 obj\r\n<>stream\r\n'; +const imageEndTemplate = '\r\nendstream\r\nendobj\r\n'; +const trailerTemplate = 'trailer\r\n<<\r\n/Size 8\r\n/Root 7 0 R\r\n/Info 6 0 R\r\n>>\r\nstartxref\r\n_length_\r\n%%EOF'; +const xrefTemplate = 'xref\r\n0 8\r\n0000000000 65535 f\r\n0000000241 00000 n\r\n0000000010 00000 n\r\n_main_ 00000 n\r\n0000000089 00000 n\r\n_image_ 00000 n\r\n_info_ 00000 n\r\n0000000143 00000 n\r\n'; + +const pad = function(str, len) { + return str.length < len ? pad('0' + str, len) : str; +}; + +let composePdfString = function(imageString, options, curDate) { + const margin = (options.margin || 0) * 2; + + let { width, height } = calcScaledInfo(options.width, options.height); + width += margin; + height += margin; + + const widthPt = (width * 0.75).toFixed(2); + const heightPt = (height * 0.75).toFixed(2); + + const mainPage = mainPageTemplate.replace('_width_', widthPt).replace('_height_', heightPt); + const content = contentTemplate.replace('_width_', widthPt).replace('_height_', heightPt); + const info = infoTemplate.replace('_date_', curDate).replace('_version_', version); + const image = imageStartTemplate.replace('_width_', width).replace('_height_', height).replace('_length_', imageString.length) + imageString + imageEndTemplate; + const xref = getXref(mainPage.length, content.length, info.length); + + const mainContent = mainPage + content + info + image; + const trailer = trailerTemplate.replace('_length_', mainContent.length); + + return mainContent + xref + trailer; +}; + +function getXref(mainPageLength, contentLength, infoLength) { + return xrefTemplate.replace('_main_', pad(mainPageLength + '', 10)) + .replace('_info_', pad((mainPageLength + contentLength) + '', 10)) + .replace('_image_', pad((mainPageLength + contentLength + infoLength) + '', 10)); +} + +let getCurDate = function() { + return new Date(); +}; + +let getBlob = function(binaryData) { + let i = 0; + const dataArray = new Uint8Array(binaryData.length); + + for(; i < binaryData.length; i++) { + dataArray[i] = binaryData.charCodeAt(i); + } + + return new window.Blob([dataArray.buffer], { type: 'application/pdf' }); +}; + +let getBase64 = function(binaryData) { + return window.btoa(binaryData); +}; + +export function getData(data, options) { + return imageCreator.getImageData(data, extend({}, options, { format: 'JPEG' })).then(imageString => { + const binaryData = composePdfString(imageString, options, getCurDate()); + const pdfData = isFunction(window.Blob) ? + getBlob(binaryData) : + getBase64(binaryData); + + return pdfData; + }); +} + +///#DEBUG +export const __tests = { + set_composePdfString: function(func) { + __tests.composePdfString = composePdfString; + composePdfString = func; + }, + restore_composePdfString: function(func) { + if(__tests.composePdfString) { + composePdfString = __tests.composePdfString; + __tests.composePdfString = null; + } + }, + set_getCurDate: function(func) { + __tests.getCurDate = getCurDate; + getCurDate = func; + }, + restore_getCurDate: function(func) { + if(__tests.getCurDate) { + getCurDate = __tests.getCurDate; + __tests.getCurDate = null; + } + }, + set_getBlob: function(func) { + __tests.getBlob = getBlob; + getBlob = func; + }, + restore_getBlob: function(func) { + if(__tests.getBlob) { + getBlob = __tests.getBlob; + __tests.getBlob = null; + } + }, + set_getBase64: function(func) { + __tests.getBase64 = getBase64; + getBase64 = func; + }, + restore_getBase64: function(func) { + if(__tests.getBase64) { + getBase64 = __tests.getBase64; + __tests.getBase64 = null; + } + } +}; +///#ENDDEBUG diff --git a/packages/f-theme-editor/farris-theme-editor/js/exporter/svg_creator.js b/packages/f-theme-editor/farris-theme-editor/js/exporter/svg_creator.js new file mode 100644 index 0000000000000000000000000000000000000000..12f190706fc2b548f0cc544f6bdce84164d48ebf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/exporter/svg_creator.js @@ -0,0 +1,107 @@ +import $ from '../core/renderer'; +import ajax from '../core/utils/ajax'; +import { getWindow } from '../core/utils/window'; +const window = getWindow(); +import { isFunction } from '../core/utils/type'; +import { each } from '../core/utils/iterator'; +import { getSvgElement, getSvgMarkup, HIDDEN_FOR_EXPORT } from '../core/utils/svg'; +import { when, Deferred } from '../core/utils/deferred'; + +export const svgCreator = { + _markup: '', + _imageArray: {}, + _imageDeferreds: [], + + _getBinaryFile: function(src, callback) { + ajax.sendRequest({ + url: src, + method: 'GET', + responseType: 'arraybuffer' + }).done(callback).fail(function() { + callback(false); + }); + }, + + _loadImages: function() { + const that = this; + + each(that._imageArray, function(src) { + const deferred = new Deferred(); + + that._imageDeferreds.push(deferred); + that._getBinaryFile(src, function(response) { + if(!response) { + delete that._imageArray[src]; // ToDo Warning + deferred.resolve(); + return; + } + + let i; + let binary = ''; + const bytes = new Uint8Array(response); + const length = bytes.byteLength; + + for(i = 0; i < length; i++) { + binary += String.fromCharCode(bytes[i]); + } + that._imageArray[src] = 'data:image/png;base64,' + window.btoa(binary); + deferred.resolve(); + }); + }); + }, + + _parseImages: function(element) { + let href; + const that = this; + + if(element.tagName === 'image') { + href = $(element).attr('href') || $(element).attr('xlink:href'); + if(!that._imageArray[href]) { + that._imageArray[href] = ''; + } + } + + each(element.childNodes, function(_, element) { + that._parseImages(element); + }); + }, + + _prepareImages: function(svgElem) { + this._parseImages(svgElem); + this._loadImages(); + + return when.apply($, this._imageDeferreds); + }, + + getData: function(data, options) { + let markup; + const that = this; + const xmlVersion = ''; + const svgElem = getSvgElement(data); + const $svgObject = $(svgElem); + $svgObject.find(`[${HIDDEN_FOR_EXPORT}]`).remove(); + + markup = xmlVersion + getSvgMarkup($svgObject.get(0), options.backgroundColor); + + return that._prepareImages(svgElem).then(() => { + each(that._imageArray, function(href, dataURI) { + const regexpString = `href=['|"]${href}['|"]`; + markup = markup.replace(new RegExp(regexpString, 'gi'), `href="${dataURI}"`); + }); + + return isFunction(window.Blob) ? that._getBlob(markup) : that._getBase64(markup); + }); + }, + + _getBlob: function(markup) { + return new window.Blob([markup], { type: 'image/svg+xml' }); + }, + + _getBase64: function(markup) { + return window.btoa(markup); + } +}; + +export function getData(data, options) { + return svgCreator.getData(data, options); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..8286c05d259865a477a5fbd98baffc81b3bb9074 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.d.ts @@ -0,0 +1,100 @@ +import FileSystemProviderBase, { + FileSystemProviderBaseOptions, +} from './provider_base'; + +import FileSystemItem from './file_system_item'; +import UploadInfo from './upload_info'; + +/** @public */ +export type Options = CustomFileSystemProviderOptions; + +/** + * @deprecated Use Options instead + * @namespace DevExpress.fileManagement + */ +export interface CustomFileSystemProviderOptions extends FileSystemProviderBaseOptions { + /** + * @docid + * @type_function_return Promise|any + * @public + */ + abortFileUpload?: ((file: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem) => PromiseLike | any); + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + copyItem?: ((item: FileSystemItem, destinationDirectory: FileSystemItem) => PromiseLike | any); + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + createDirectory?: ((parentDirectory: FileSystemItem, name: string) => PromiseLike | any); + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + deleteItem?: ((item: FileSystemItem) => PromiseLike | any); + + /** + * @docid + * @public + */ + downloadItems?: ((items: Array) => void); + + /** + * @docid + * @type_function_return Promise>|Array + * @public + */ + getItems?: ((parentDirectory: FileSystemItem) => PromiseLike> | Array); + + /** + * @docid + * @type_function_return Promise|object + * @public + */ + getItemsContent?: ((items: Array) => PromiseLike | any); + + /** + * @docid + * @public + */ + hasSubDirectoriesExpr?: string | Function; + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + moveItem?: ((item: FileSystemItem, destinationDirectory: FileSystemItem) => PromiseLike | any); + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + renameItem?: ((item: FileSystemItem, newName: string) => PromiseLike | any); + + /** + * @docid + * @type_function_return Promise|any + * @public + */ + uploadFileChunk?: ((file: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem) => PromiseLike | any); +} + +/** + * @docid + * @inherits FileSystemProviderBase + * @namespace DevExpress.fileManagement + * @public + */ +export default class CustomFileSystemProvider extends FileSystemProviderBase { + constructor(options?: Options) +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.js new file mode 100644 index 0000000000000000000000000000000000000000..ac817c30ead96819525da980b0f8a43121388123 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/custom_provider.js @@ -0,0 +1,93 @@ +import { ensureDefined, noop } from '../core/utils/common'; +import { isFunction } from '../core/utils/type'; +import { compileGetter } from '../core/utils/data'; + +import FileSystemProviderBase from './provider_base'; + +class CustomFileSystemProvider extends FileSystemProviderBase { + + constructor(options) { + options = ensureDefined(options, { }); + super(options); + + this._hasSubDirsGetter = compileGetter(options.hasSubDirectoriesExpr || 'hasSubDirectories'); + + this._getItemsFunction = this._ensureFunction(options.getItems, () => []); + + this._renameItemFunction = this._ensureFunction(options.renameItem); + + this._createDirectoryFunction = this._ensureFunction(options.createDirectory); + + this._deleteItemFunction = this._ensureFunction(options.deleteItem); + + this._moveItemFunction = this._ensureFunction(options.moveItem); + + this._copyItemFunction = this._ensureFunction(options.copyItem); + + this._uploadFileChunkFunction = this._ensureFunction(options.uploadFileChunk); + + this._abortFileUploadFunction = this._ensureFunction(options.abortFileUpload); + + this._downloadItemsFunction = this._ensureFunction(options.downloadItems); + + this._getItemsContentFunction = this._ensureFunction(options.getItemsContent); + } + + getItems(parentDir) { + const pathInfo = parentDir.getFullPathInfo(); + return this._executeActionAsDeferred(() => this._getItemsFunction(parentDir), true) + .then(dataItems => this._convertDataObjectsToFileItems(dataItems, pathInfo)); + } + + renameItem(item, name) { + return this._executeActionAsDeferred(() => this._renameItemFunction(item, name)); + } + + createDirectory(parentDir, name) { + return this._executeActionAsDeferred(() => this._createDirectoryFunction(parentDir, name)); + } + + deleteItems(items) { + return items.map(item => this._executeActionAsDeferred(() => this._deleteItemFunction(item))); + } + + moveItems(items, destinationDirectory) { + return items.map(item => this._executeActionAsDeferred(() => this._moveItemFunction(item, destinationDirectory))); + } + + copyItems(items, destinationFolder) { + return items.map(item => this._executeActionAsDeferred(() => this._copyItemFunction(item, destinationFolder))); + } + + uploadFileChunk(fileData, chunksInfo, destinationDirectory) { + return this._executeActionAsDeferred(() => this._uploadFileChunkFunction(fileData, chunksInfo, destinationDirectory)); + } + + abortFileUpload(fileData, chunksInfo, destinationDirectory) { + return this._executeActionAsDeferred(() => this._abortFileUploadFunction(fileData, chunksInfo, destinationDirectory)); + } + + downloadItems(items) { + return this._downloadItemsFunction(items); + } + + getItemsContent(items) { + return this._executeActionAsDeferred(() => this._getItemsContentFunction(items)); + } + + _hasSubDirs(dataObj) { + const hasSubDirs = this._hasSubDirsGetter(dataObj); + return typeof hasSubDirs === 'boolean' ? hasSubDirs : true; + } + + _getKeyExpr(options) { + return options.keyExpr || 'key'; + } + + _ensureFunction(functionObject, defaultFunction) { + defaultFunction = defaultFunction || noop; + return isFunction(functionObject) ? functionObject : defaultFunction; + } +} + +export default CustomFileSystemProvider; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/error.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/error.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..49397bf703f10fce4662be97c6a69d4a5293b579 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/error.d.ts @@ -0,0 +1,27 @@ +import FileSystemItem from './file_system_item'; + +/** + * @docid FileSystemError + * @namespace DevExpress.fileManagement + * @public + */ + export default class FileSystemError { + constructor(errorCode?: number, fileSystemItem?: FileSystemItem, errorText?: string) + /** + * @docid FileSystemError.fileSystemItem + * @public + */ + fileSystemItem?: FileSystemItem; + + /** + * @docid FileSystemError.errorCode + * @public + */ + errorCode?: number; + + /** + * @docid FileSystemError.errorText + * @public + */ + errorText?: string; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/error.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/error.js new file mode 100644 index 0000000000000000000000000000000000000000..28258780fdff5de3c35d42572c0aec7f50111df2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/error.js @@ -0,0 +1,9 @@ +class FileSystemError { + constructor(errorCode, fileSystemItem, errorText) { + this.errorCode = errorCode; + this.fileSystemItem = fileSystemItem; + this.errorText = errorText; + } +} + +export default FileSystemError; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/error_codes.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/error_codes.js new file mode 100644 index 0000000000000000000000000000000000000000..1e36b0a4eaecbb9c4e86c0fb8b6712b2b0f06a54 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/error_codes.js @@ -0,0 +1,13 @@ +const ErrorCode = { + NoAccess: 0, + FileExists: 1, + FileNotFound: 2, + DirectoryExists: 3, + DirectoryNotFound: 4, + WrongFileExtension: 5, + MaxFileSizeExceeded: 6, + InvalidSymbols: 7, + Other: 32767 +}; + +export default ErrorCode; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..b71fc61a96467aed6f97d92c9c7504bada59a455 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.d.ts @@ -0,0 +1,75 @@ +/** + * @docid FileSystemItem + * @namespace DevExpress.fileManagement + * @public + */ +export default class FileSystemItem { + constructor(path: string, isDirectory: boolean, pathKeys?: Array); + + /** + * @docid FileSystemItem.path + * @public + */ + path: string; + + /** + * @docid FileSystemItem.pathKeys + * @public + */ + pathKeys: Array; + + /** + * @docid FileSystemItem.key + * @public + */ + key: string; + + /** + * @docid FileSystemItem.name + * @public + */ + name: string; + + /** + * @docid FileSystemItem.dateModified + * @public + */ + dateModified: Date; + + /** + * @docid FileSystemItem.size + * @public + */ + size: number; + + /** + * @docid FileSystemItem.isDirectory + * @public + */ + isDirectory: boolean; + + /** + * @docid FileSystemItem.hasSubDirectories + * @public + */ + hasSubDirectories: boolean; + + /** + * @docid FileSystemItem.thumbnail + * @public + */ + thumbnail: string; + + /** + * @docid FileSystemItem.dataItem + * @public + */ + dataItem: any; + + /** + * @docid FileSystemItem.getFileExtension + * @publicName getFileExtension() + * @public + */ + getFileExtension(): string; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.js new file mode 100644 index 0000000000000000000000000000000000000000..0e5b9b37aa94ae900b66b063c2ca7c266c833ebb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/file_system_item.js @@ -0,0 +1,108 @@ +import { isString } from '../core/utils/type'; +import { pathCombine, getFileExtension, getPathParts, getName, getEscapedFileName, PATH_SEPARATOR } from './utils'; + +class FileSystemItem { + constructor() { + const ctor = isString(arguments[0]) ? this._publicCtor : this._internalCtor; + ctor.apply(this, arguments); + } + + _internalCtor(pathInfo, name, isDirectory, key) { + this.name = name || ''; + + this.pathInfo = pathInfo && [...pathInfo] || []; + this.parentPath = this._getPathByPathInfo(this.pathInfo); + this.relativeName = pathCombine(this.parentPath, name); + this.key = key || this._getPathByPathInfo(this.getFullPathInfo(), true); + + this.path = pathCombine(this.parentPath, name); + + this.pathKeys = this.pathInfo.map(({ key }) => key); + if(!this.isRoot()) { + this.pathKeys.push(this.key); + } + + this._initialize(isDirectory); + } + + _publicCtor(path, isDirectory, pathKeys) { + this.path = path || ''; + this.pathKeys = pathKeys || []; + + const pathInfo = []; + + const parts = getPathParts(path, true); + for(let i = 0; i < parts.length - 1; i++) { + const part = parts[i]; + const pathInfoPart = { + key: this.pathKeys[i] || part, + name: getName(part) + }; + pathInfo.push(pathInfoPart); + } + + this.pathInfo = pathInfo; + + this.relativeName = path; + this.name = getName(path); + this.key = this.pathKeys.length ? this.pathKeys[this.pathKeys.length - 1] : path; + this.parentPath = parts.length > 1 ? parts[parts.length - 2] : ''; + + this._initialize(isDirectory); + } + + _initialize(isDirectory) { + this.isDirectory = !!isDirectory; + + this.size = 0; + this.dateModified = new Date(); + + this.thumbnail = ''; + this.tooltipText = ''; + } + + getFullPathInfo() { + const pathInfo = [...this.pathInfo]; + + if(!this.isRoot()) { + pathInfo.push({ + key: this.key, + name: this.name + }); + } + + return pathInfo; + } + + isRoot() { + return this.path === ''; + } + + getFileExtension() { + return this.isDirectory ? '' : getFileExtension(this.name); + } + + equals(item) { + return item && this.key === item.key; + } + + createClone() { + const result = new FileSystemItem(this.pathInfo, this.name, this.isDirectory, this.key); + result.key = this.key; + result.size = this.size; + result.dateModified = this.dateModified; + result.thumbnail = this.thumbnail; + result.tooltipText = this.tooltipText; + result.hasSubDirectories = this.hasSubDirectories; + result.dataItem = this.dataItem; + return result; + } + + _getPathByPathInfo(pathInfo, escape) { + return pathInfo + .map(info => escape ? getEscapedFileName(info.name) : info.name) + .join(PATH_SEPARATOR); + } +} + +export default FileSystemItem; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f3dfb68d3c6b83e32831994894151b7949d78a7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.d.ts @@ -0,0 +1,37 @@ +import FileSystemProviderBase, { + FileSystemProviderBaseOptions, +} from './provider_base'; + +/** @public */ +export type Options = ObjectFileSystemProviderOptions; + +/** + * @deprecated Use Options instead + * @namespace DevExpress.fileManagement + */ +export interface ObjectFileSystemProviderOptions extends FileSystemProviderBaseOptions { + /** + * @docid + * @public + */ + contentExpr?: string | Function; + /** + * @docid + * @public + */ + data?: Array; + /** + * @docid + * @public + */ + itemsExpr?: string | Function; +} +/** + * @docid + * @inherits FileSystemProviderBase + * @namespace DevExpress.fileManagement + * @public + */ +export default class ObjectFileSystemProvider extends FileSystemProviderBase { + constructor(options?: Options) +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.js new file mode 100644 index 0000000000000000000000000000000000000000..85709c9540aa1cb1a830addd31530adb43c00726 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/object_provider.js @@ -0,0 +1,387 @@ +import { find } from '../core/utils/array'; +import { ensureDefined } from '../core/utils/common'; +import { compileGetter, compileSetter } from '../core/utils/data'; +import Guid from '../core/guid'; +import { isFunction } from '../core/utils/type'; +import { errors } from '../data/errors'; +import { Deferred } from '../core/utils/deferred'; +import { getWindow } from '../core/utils/window'; +import { fileSaver } from '../exporter/file_saver'; +import Errors from '../ui/widget/ui.errors'; +import JSZip from 'jszip'; + +import FileSystemProviderBase from './provider_base'; +import FileSystemError from './error'; +import ErrorCode from './error_codes'; +import { pathCombine } from './utils'; + +const window = getWindow(); + +class ObjectFileSystemProvider extends FileSystemProviderBase { + + constructor(options) { + options = ensureDefined(options, { }); + super(options); + + const initialArray = options.data; + if(initialArray && !Array.isArray(initialArray)) { + throw errors.Error('E4006'); + } + + + const itemsExpr = options.itemsExpr || 'items'; + this._subFileItemsGetter = compileGetter(itemsExpr); + this._subFileItemsSetter = this._getSetter(itemsExpr); + + const contentExpr = options.contentExpr || 'content'; + this._contentGetter = compileGetter(contentExpr); + this._contentSetter = this._getSetter(contentExpr); + + const nameExpr = this._getNameExpr(options); + this._nameSetter = this._getSetter(nameExpr); + + const isDirExpr = this._getIsDirExpr(options); + this._getIsDirSetter = this._getSetter(isDirExpr); + + const keyExpr = this._getKeyExpr(options); + this._keySetter = this._getSetter(keyExpr); + + const sizeExpr = this._getSizeExpr(options); + this._sizeSetter = this._getSetter(sizeExpr); + + const dateModifiedExpr = this._getDateModifiedExpr(options); + this._dateModifiedSetter = this._getSetter(dateModifiedExpr); + + this._data = initialArray || [ ]; + } + + getItems(parentDir) { + return this._executeActionAsDeferred(() => this._getItems(parentDir), true); + } + + renameItem(item, name) { + return this._executeActionAsDeferred(() => this._renameItemCore(item, name)); + } + + _renameItemCore(item, name) { + if(!item) { + return; + } + const dataItem = this._findDataObject(item); + this._nameSetter(dataItem, name); + item.name = name; + item.key = this._ensureDataObjectKey(dataItem); + } + + createDirectory(parentDir, name) { + return this._executeActionAsDeferred(() => { + this._validateDirectoryExists(parentDir); + this._createDataObject(parentDir, name, true); + }); + } + + deleteItems(items) { + return items.map(item => this._executeActionAsDeferred(() => this._deleteItem(item))); + } + + moveItems(items, destinationDir) { + const destinationDataItem = this._findDataObject(destinationDir); + const array = this._getDirectoryDataItems(destinationDataItem); + + const deferreds = items.map(item => this._executeActionAsDeferred(() => { + this._checkAbilityToMoveOrCopyItem(item, destinationDir); + + const dataItem = this._findDataObject(item); + this._deleteItem(item); + array.push(dataItem); + })); + + return deferreds; + } + + copyItems(items, destinationDir) { + const destinationDataItem = this._findDataObject(destinationDir); + const array = this._getDirectoryDataItems(destinationDataItem); + + const deferreds = items.map(item => this._executeActionAsDeferred(() => { + this._checkAbilityToMoveOrCopyItem(item, destinationDir); + + const dataItem = this._findDataObject(item); + const copiedItem = this._createCopy(dataItem); + array.push(copiedItem); + })); + + return deferreds; + } + + uploadFileChunk(fileData, chunksInfo, destinationDirectory) { + if(chunksInfo.chunkIndex > 0) { + return chunksInfo.customData.deferred; + } + + this._validateDirectoryExists(destinationDirectory); + + const deferred = chunksInfo.customData.deferred = new Deferred(); + const reader = this._createFileReader(); + reader.readAsDataURL(fileData); + + reader.onload = () => { + const content = reader.result.split(',')[1]; + + const dataObj = this._createDataObject(destinationDirectory, fileData.name, false); + this._sizeSetter(dataObj, fileData.size); + this._dateModifiedSetter(dataObj, fileData.lastModifiedDate); + this._contentSetter(dataObj, content); + + deferred.resolve(); + }; + + reader.onerror = error => deferred.reject(error); + + return deferred; + } + + downloadItems(items) { + if(items.length === 1) { + this._downloadSingleFile(items[0]); + } else { + this._downloadMultipleFiles(items); + } + } + + _downloadSingleFile(file) { + const content = this._getFileContent(file); + + const byteString = window.atob(content); + const arrayBuffer = new ArrayBuffer(byteString.length); + const array = new Uint8Array(arrayBuffer); + + for(let i = 0; i < byteString.length; i++) { + array[i] = byteString.charCodeAt(i); + } + + const blob = new window.Blob([arrayBuffer], { type: 'application/octet-stream' }); + fileSaver.saveAs(file.name, null, blob); + } + + _downloadMultipleFiles(files) { + const jsZip = getJSZip(); + const zip = new jsZip(); + + files.forEach(file => zip.file(file.name, this._getFileContent(file), { base64: true })); + + const options = { + type: 'blob', + compression: 'DEFLATE', + mimeType: 'application/zip' + }; + const deferred = new Deferred(); + + if(zip.generateAsync) { + zip.generateAsync(options).then(deferred.resolve); + } else { + deferred.resolve(zip.generate(options)); + } + + deferred.done(blob => fileSaver.saveAs('files.zip', null, blob)); + } + + _getFileContent(file) { + const dataItem = this._findDataObject(file); + return this._contentGetter(dataItem) || ''; + } + + _validateDirectoryExists(directoryInfo) { + if(!this._isFileItemExists(directoryInfo) || this._isDirGetter(directoryInfo.fileItem)) { + throw new FileSystemError(ErrorCode.DirectoryNotFound, directoryInfo); + } + } + + _checkAbilityToMoveOrCopyItem(item, destinationDir) { + const dataItem = this._findDataObject(item); + const itemKey = this._getKeyFromDataObject(dataItem, item.parentPath); + const pathInfo = destinationDir.getFullPathInfo(); + let currentPath = ''; + + pathInfo.forEach(info => { + currentPath = pathCombine(currentPath, info.name); + const pathKey = this._getDataObjectKey(info.key, currentPath); + if(pathKey === itemKey) { + throw new FileSystemError(ErrorCode.Other, item); + } + }); + } + + _createDataObject(parentDir, name, isDirectory) { + const dataObj = { }; + + this._nameSetter(dataObj, name); + this._getIsDirSetter(dataObj, isDirectory); + this._keySetter(dataObj, String(new Guid())); + + const parentDataItem = this._findDataObject(parentDir); + const array = this._getDirectoryDataItems(parentDataItem); + array.push(dataObj); + + return dataObj; + } + + _createCopy(dataObj) { + const copyObj = { }; + this._nameSetter(copyObj, this._nameGetter(dataObj)); + this._getIsDirSetter(copyObj, this._isDirGetter(dataObj)); + + const items = this._subFileItemsGetter(dataObj); + if(Array.isArray(items)) { + const itemsCopy = []; + items.forEach(childItem => { + const childCopy = this._createCopy(childItem); + itemsCopy.push(childCopy); + }); + this._subFileItemsSetter(copyObj, itemsCopy); + } + return copyObj; + } + + _deleteItem(fileItem) { + const dataItem = this._findDataObject(fileItem); + const parentDirDataObj = this._findFileItemObj(fileItem.pathInfo); + const array = this._getDirectoryDataItems(parentDirDataObj); + const index = array.indexOf(dataItem); + array.splice(index, 1); + } + + _getDirectoryDataItems(directoryDataObj) { + if(!directoryDataObj) { + return this._data; + } + + let dataItems = this._subFileItemsGetter(directoryDataObj); + if(!Array.isArray(dataItems)) { + dataItems = []; + this._subFileItemsSetter(directoryDataObj, dataItems); + } + return dataItems; + } + + _getItems(parentDir) { + this._validateDirectoryExists(parentDir); + const pathInfo = parentDir.getFullPathInfo(); + const parentDirKey = pathInfo && pathInfo.length > 0 ? pathInfo[pathInfo.length - 1].key : null; + let dirFileObjects = this._data; + if(parentDirKey) { + const directoryEntry = this._findFileItemObj(pathInfo); + dirFileObjects = directoryEntry && this._subFileItemsGetter(directoryEntry) || []; + } + + this._ensureKeysForDuplicateNameItems(dirFileObjects); + + return this._convertDataObjectsToFileItems(dirFileObjects, pathInfo); + } + + _ensureKeysForDuplicateNameItems(dataObjects) { + const names = {}; + + dataObjects.forEach(obj => { + const name = this._nameGetter(obj); + if(names[name]) { + this._ensureDataObjectKey(obj); + } else { + names[name] = true; + } + }); + } + + _findDataObject(item) { + if(item.isRoot()) { + return null; + } + + const result = this._findFileItemObj(item.getFullPathInfo()); + if(!result) { + const errorCode = item.isDirectory ? ErrorCode.DirectoryNotFound : ErrorCode.FileNotFound; + throw new FileSystemError(errorCode, item); + } + return result; + } + + _findFileItemObj(pathInfo) { + if(!Array.isArray(pathInfo)) { + pathInfo = [ ]; + } + + let currentPath = ''; + let fileItemObj = null; + let fileItemObjects = this._data; + for(let i = 0; i < pathInfo.length && (i === 0 || fileItemObj); i++) { + fileItemObj = find(fileItemObjects, item => { + const hasCorrectFileItemType = this._isDirGetter(item) || i === pathInfo.length - 1; + return this._getKeyFromDataObject(item, currentPath) === pathInfo[i].key && + this._nameGetter(item) === pathInfo[i].name && hasCorrectFileItemType; + }); + if(fileItemObj) { + currentPath = pathCombine(currentPath, this._nameGetter(fileItemObj)); + fileItemObjects = this._subFileItemsGetter(fileItemObj); + } + } + return fileItemObj; + } + + _getKeyFromDataObject(dataObj, defaultKeyPrefix) { + const key = this._keyGetter(dataObj); + const relativeName = pathCombine(defaultKeyPrefix, this._nameGetter(dataObj)); + return this._getDataObjectKey(key, relativeName); + } + + _getDataObjectKey(key, relativeName) { + return key ? key : relativeName; + } + + _ensureDataObjectKey(dataObj) { + let key = this._keyGetter(dataObj); + if(!key) { + key = String(new Guid()); + this._keySetter(dataObj, key); + } + return key; + } + + _hasSubDirs(dataObj) { + const subItems = ensureDefined(this._subFileItemsGetter(dataObj), []); + + if(!Array.isArray(subItems)) { + return true; + } + + for(let i = 0; i < subItems.length; i++) { + if(this._isDirGetter(subItems[i]) === true) { + return true; + } + } + return false; + } + + _getSetter(expr) { + return isFunction(expr) ? expr : compileSetter(expr); + } + + _isFileItemExists(fileItem) { + return fileItem.isDirectory && fileItem.isRoot() || !!this._findFileItemObj(fileItem.getFullPathInfo()); + } + + _createFileReader() { + return new window.FileReader(); + } + +} + + +function getJSZip() { + if(!JSZip) { + throw Errors.Error('E1041', 'JSZip'); + } + + return JSZip; +} + +export default ObjectFileSystemProvider; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..fcceb7f5feab6edfc4d1ceb594f5e119709b81a8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.d.ts @@ -0,0 +1,127 @@ +import FileSystemItem from './file_system_item'; +import UploadInfo from './upload_info'; + +import { + DxPromise, +} from '../core/utils/deferred'; + +/** @namespace DevExpress.fileManagement */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export interface FileSystemProviderBaseOptions { + /** + * @docid + * @public + */ + dateModifiedExpr?: string | Function; + /** + * @docid + * @public + */ + isDirectoryExpr?: string | Function; + /** + * @docid + * @public + */ + keyExpr?: string | Function; + /** + * @docid + * @public + */ + nameExpr?: string | Function; + /** + * @docid + * @public + */ + sizeExpr?: string | Function; + /** + * @docid + * @public + */ + thumbnailExpr?: string | Function; +} +/** + * @docid + * @namespace DevExpress.fileManagement + * @hidden + */ +export default class FileSystemProviderBase { + constructor(options?: FileSystemProviderBaseOptions) + /** + * @docid + * @publicName getItems() + * @return Promise> + * @public + */ + getItems(parentDirectory: FileSystemItem): DxPromise>; + + /** + * @docid + * @publicName renameItem() + * @return Promise + * @public + */ + renameItem(item: FileSystemItem, newName: string): DxPromise; + + /** + * @docid + * @publicName createDirectory() + * @return Promise + * @public + */ + createDirectory(parentDirectory: FileSystemItem, name: string): DxPromise; + + /** + * @docid + * @publicName deleteItems() + * @return Array> + * @public + */ + deleteItems(items: Array): Array>; + + /** + * @docid + * @publicName moveItems() + * @return Array> + * @public + */ + moveItems(items: Array, destinationDirectory: FileSystemItem): Array>; + + /** + * @docid + * @publicName copyItems() + * @return Array> + * @public + */ + copyItems(items: Array, destinationDirectory: FileSystemItem): Array>; + + /** + * @docid + * @publicName uploadFileChunk() + * @return Promise + * @public + */ + uploadFileChunk(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): DxPromise; + + /** + * @docid + * @publicName abortFileUpload() + * @return Promise + * @public + */ + abortFileUpload(fileData: File, uploadInfo: UploadInfo, destinationDirectory: FileSystemItem): DxPromise; + + /** + * @docid + * @publicName downloadItems() + * @public + */ + downloadItems(items: Array): void; + + /** + * @docid + * @publicName getItemsContent() + * @return Promise + * @public + */ + getItemsContent(items: Array): DxPromise; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.js new file mode 100644 index 0000000000000000000000000000000000000000..667d0484c9cf0473ff1286ba0c5c4e202b22ff79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/provider_base.js @@ -0,0 +1,148 @@ +import { compileGetter } from '../core/utils/data'; +import { ensureDefined } from '../core/utils/common'; +import dateSerialization from '../core/utils/date_serialization'; +import { each } from '../core/utils/iterator'; +import { isPromise } from '../core/utils/type'; +import { Deferred, fromPromise } from '../core/utils/deferred'; +import FileSystemItem from './file_system_item'; + +const DEFAULT_FILE_UPLOAD_CHUNK_SIZE = 200000; + +class FileSystemProviderBase { + + constructor(options) { + options = ensureDefined(options, {}); + + this._keyGetter = compileGetter(this._getKeyExpr(options)); + this._nameGetter = compileGetter(this._getNameExpr(options)); + this._isDirGetter = compileGetter(this._getIsDirExpr(options)); + this._sizeGetter = compileGetter(this._getSizeExpr(options)); + this._dateModifiedGetter = compileGetter(this._getDateModifiedExpr(options)); + this._thumbnailGetter = compileGetter(options.thumbnailExpr || 'thumbnail'); + } + + getItems(parentDirectory) { + return []; + } + + renameItem(item, name) { + } + + createDirectory(parentDirectory, name) { + } + + deleteItems(items) { + } + + moveItems(items, destinationDirectory) { + } + + copyItems(items, destinationDirectory) { + } + + uploadFileChunk(fileData, chunksInfo, destinationDirectory) { + } + + abortFileUpload(fileData, chunksInfo, destinationDirectory) { + } + + downloadItems(items) { + } + + getItemsContent(items) { + } + + getFileUploadChunkSize() { + return DEFAULT_FILE_UPLOAD_CHUNK_SIZE; + } + + _convertDataObjectsToFileItems(entries, pathInfo) { + const result = []; + each(entries, (_, entry) => { + const fileItem = this._createFileItem(entry, pathInfo); + result.push(fileItem); + }); + return result; + } + _createFileItem(dataObj, pathInfo) { + const key = this._keyGetter(dataObj); + const fileItem = new FileSystemItem(pathInfo, this._nameGetter(dataObj), !!this._isDirGetter(dataObj), key); + + fileItem.size = this._sizeGetter(dataObj); + if(fileItem.size === undefined) { + fileItem.size = 0; + } + + fileItem.dateModified = dateSerialization.deserializeDate(this._dateModifiedGetter(dataObj)); + if(fileItem.dateModified === undefined) { + fileItem.dateModified = new Date(); + } + + if(fileItem.isDirectory) { + fileItem.hasSubDirectories = this._hasSubDirs(dataObj); + } + + if(!key) { + fileItem.key = fileItem.relativeName; + } + + fileItem.thumbnail = this._thumbnailGetter(dataObj) || ''; + fileItem.dataItem = dataObj; + return fileItem; + } + + _hasSubDirs(dataObj) { + return true; + } + + _getKeyExpr(options) { + return options.keyExpr || this._defaultKeyExpr; + } + + _defaultKeyExpr(fileItem) { + if(arguments.length === 2) { + fileItem.__KEY__ = arguments[1]; + return; + } + return Object.prototype.hasOwnProperty.call(fileItem, '__KEY__') ? fileItem.__KEY__ : null; + } + + _getNameExpr(options) { + return options.nameExpr || 'name'; + } + + _getIsDirExpr(options) { + return options.isDirectoryExpr || 'isDirectory'; + } + + _getSizeExpr(options) { + return options.sizeExpr || 'size'; + } + + _getDateModifiedExpr(options) { + return options.dateModifiedExpr || 'dateModified'; + } + + _executeActionAsDeferred(action, keepResult) { + const deferred = new Deferred(); + + try { + const result = action(); + + if(isPromise(result)) { + fromPromise(result) + .done(userResult => deferred.resolve(keepResult && userResult || undefined)) + .fail(error => deferred.reject(error)); + } else { + deferred.resolve(keepResult && result || undefined); + } + + } catch(error) { + return deferred.reject(error); + } + + return deferred.promise(); + } +} + +export default FileSystemProviderBase; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5c7e024ba53d53642f8841b38a7626189cf9c65 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.d.ts @@ -0,0 +1,54 @@ +import FileSystemProviderBase, { + FileSystemProviderBaseOptions, +} from './provider_base'; + +/** @public */ +export type Options = RemoteFileSystemProviderOptions; + +/** + * @deprecated Use Options instead + * @namespace DevExpress.fileManagement + */ +export interface RemoteFileSystemProviderOptions extends FileSystemProviderBaseOptions { + /** + * @docid + * @type_function_param1 options: object + * @type_function_param1_field1 headers:object + * @type_function_param1_field2 xhrFields:object + * @type_function_param1_field3 formData:object + * @public + */ + beforeAjaxSend?: ((options: { headers?: any; xhrFields?: any; formData?: any }) => void); + /** + * @docid + * @type_function_param1 options: object + * @type_function_param1_field1 formData:object + * @public + */ + beforeSubmit?: ((options: { formData?: any }) => void); + /** + * @docid + * @public + */ + endpointUrl?: string; + /** + * @docid + * @public + */ + hasSubDirectoriesExpr?: string | Function; + /** + * @docid + * @default {} + * @public + */ + requestHeaders?: any; +} +/** + * @docid + * @inherits FileSystemProviderBase + * @namespace DevExpress.fileManagement + * @public + */ +export default class RemoteFileSystemProvider extends FileSystemProviderBase { + constructor(options?: Options) +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.js new file mode 100644 index 0000000000000000000000000000000000000000..c1c657ce5c7b54f07daa404fcab1ae4b3dbf4daf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/remote_provider.js @@ -0,0 +1,331 @@ +import $ from '../core/renderer'; +import ajax from '../core/utils/ajax'; +import { ensureDefined, noop } from '../core/utils/common'; +import Guid from '../core/guid'; +import { getWindow } from '../core/utils/window'; +import { each } from '../core/utils/iterator'; +import { Deferred } from '../core/utils/deferred'; +import eventsEngine from '../events/core/events_engine'; + +import FileSystemProviderBase from './provider_base'; +import { compileGetter } from '../core/utils/data'; +import { isDefined, isEmptyObject, isFunction } from '../core/utils/type'; + +const window = getWindow(); +const FILE_CHUNK_BLOB_NAME = 'chunk'; +const FILE_SYSTEM_COMMNAD = { + GET_DIR_CONTENTS: 'GetDirContents', + CREATE_DIR: 'CreateDir', + RENAME: 'Rename', + MOVE: 'Move', + COPY: 'Copy', + REMOVE: 'Remove', + UPLOAD_CHUNK: 'UploadChunk', + ABORT_UPLOAD: 'AbortUpload', + DOWLOAD: 'Download' +}; +const REQUEST_METHOD = { + GET: 'GET', + POST: 'POST' +}; + +class RemoteFileSystemProvider extends FileSystemProviderBase { + + constructor(options) { + options = ensureDefined(options, { }); + super(options); + this._endpointUrl = options.endpointUrl; + this._beforeAjaxSend = options.beforeAjaxSend; + this._beforeSubmit = options.beforeSubmit; + this._requestHeaders = options.requestHeaders; + this._hasSubDirsGetter = compileGetter(options.hasSubDirectoriesExpr || 'hasSubDirectories'); + } + + getItems(parentDir) { + const pathInfo = parentDir.getFullPathInfo(); + return this._executeRequest(FILE_SYSTEM_COMMNAD.GET_DIR_CONTENTS, { pathInfo }) + .then(result => this._convertDataObjectsToFileItems(result.result, pathInfo)); + } + + renameItem(item, name) { + return this._executeRequest(FILE_SYSTEM_COMMNAD.RENAME, { + pathInfo: item.getFullPathInfo(), + isDirectory: item.isDirectory, + name + }); + } + + createDirectory(parentDir, name) { + return this._executeRequest(FILE_SYSTEM_COMMNAD.CREATE_DIR, { + pathInfo: parentDir.getFullPathInfo(), + name + }); + } + + deleteItems(items) { + return items.map(item => this._executeRequest(FILE_SYSTEM_COMMNAD.REMOVE, { + pathInfo: item.getFullPathInfo(), + isDirectory: item.isDirectory + })); + } + + moveItems(items, destinationDirectory) { + return items.map(item => this._executeRequest(FILE_SYSTEM_COMMNAD.MOVE, { + sourcePathInfo: item.getFullPathInfo(), + sourceIsDirectory: item.isDirectory, + destinationPathInfo: destinationDirectory.getFullPathInfo() + })); + } + + copyItems(items, destinationFolder) { + return items.map(item => this._executeRequest(FILE_SYSTEM_COMMNAD.COPY, { + sourcePathInfo: item.getFullPathInfo(), + sourceIsDirectory: item.isDirectory, + destinationPathInfo: destinationFolder.getFullPathInfo() + })); + } + + uploadFileChunk(fileData, chunksInfo, destinationDirectory) { + if(chunksInfo.chunkIndex === 0) { + chunksInfo.customData.uploadId = new Guid(); + } + + const args = { + destinationPathInfo: destinationDirectory.getFullPathInfo(), + chunkMetadata: JSON.stringify({ + UploadId: chunksInfo.customData.uploadId, + FileName: fileData.name, + Index: chunksInfo.chunkIndex, + TotalCount: chunksInfo.chunkCount, + FileSize: fileData.size + }) + }; + const ajaxSettings = { + url: this._endpointUrl, + headers: this._requestHeaders || {}, + method: REQUEST_METHOD.POST, + dataType: 'json', + data: { + [FILE_CHUNK_BLOB_NAME]: chunksInfo.chunkBlob, + arguments: JSON.stringify(args), + command: FILE_SYSTEM_COMMNAD.UPLOAD_CHUNK + }, + upload: { + onprogress: noop, + onloadstart: noop, + onabort: noop + }, + xhrFields: {}, + cache: false + }; + const deferred = new Deferred(); + + this._beforeSendInternal(ajaxSettings); + ajax.sendRequest(ajaxSettings) + .done(result => { + !result.success && deferred.reject(result) || deferred.resolve(); + }) + .fail(deferred.reject); + + return deferred.promise(); + } + + abortFileUpload(fileData, chunksInfo, destinationDirectory) { + return this._executeRequest(FILE_SYSTEM_COMMNAD.ABORT_UPLOAD, { uploadId: chunksInfo.customData.uploadId }); + } + + downloadItems(items) { + const args = this._getDownloadArgs(items); + + const $form = $('') + .css({ display: 'none' }) + .attr({ + method: REQUEST_METHOD.POST, + action: args.url + }); + const formDataEntries = { + command: args.command, + arguments: args.arguments + }; + + this._beforeSubmitInternal(formDataEntries); + this._appendFormDataInputsToForm(formDataEntries, $form); + + $form.appendTo('body'); + + eventsEngine.trigger($form, 'submit'); + + setTimeout(() => $form.remove()); + } + + getItemsContent(items) { + const args = this._getDownloadArgs(items); + const ajaxSettings = { + url: args.url, + headers: this._requestHeaders || {}, + method: REQUEST_METHOD.POST, + responseType: 'arraybuffer', + data: { + command: args.command, + arguments: args.arguments + }, + upload: { + onprogress: noop, + onloadstart: noop, + onabort: noop + }, + xhrFields: {}, + cache: false + }; + + this._beforeSendInternal(ajaxSettings); + return ajax.sendRequest(ajaxSettings); + } + + _getDownloadArgs(items) { + const pathInfoList = items.map(item => item.getFullPathInfo()); + const args = { pathInfoList }; + const argsStr = JSON.stringify(args); + return { + url: this._endpointUrl, + arguments: argsStr, + command: FILE_SYSTEM_COMMNAD.DOWLOAD + }; + } + + _getItemsIds(items) { + return items.map(it => it.relativeName); + } + + _executeRequest(command, args) { + const method = command === FILE_SYSTEM_COMMNAD.GET_DIR_CONTENTS ? REQUEST_METHOD.GET : REQUEST_METHOD.POST; + const deferred = new Deferred(); + const ajaxSettings = { + url: this._getEndpointUrl(command, args), + headers: this._requestHeaders || {}, + method, + dataType: 'json', + data: {}, + xhrFields: {}, + cache: false + }; + + this._beforeSendInternal(ajaxSettings); + ajax.sendRequest(ajaxSettings).then(result => { + !result.success && deferred.reject(result) || deferred.resolve(result); + }, + e => deferred.reject(e)); + return deferred.promise(); + } + + _beforeSubmitInternal(formDataEntries) { + if(isFunction(this._beforeSubmit)) { + this._beforeSubmit({ formData: formDataEntries }); + } + } + + _beforeSendInternal(ajaxSettings) { + if(isFunction(this._beforeAjaxSend)) { + const ajaxArguments = { + headers: ajaxSettings.headers, + formData: ajaxSettings.data, + xhrFields: ajaxSettings.xhrFields + }; + + this._beforeAjaxSend(ajaxArguments); + ajaxSettings.headers = ajaxArguments.headers; + ajaxSettings.data = ajaxArguments.formData; + ajaxSettings.xhrFields = ajaxArguments.xhrFields; + } + if(isEmptyObject(ajaxSettings.data)) { + delete ajaxSettings.data; + } else { + if(ajaxSettings.responseType || ajaxSettings.upload) { + // if using core.utils.ajax + ajaxSettings.data = this._createFormData(ajaxSettings.data); + } + // else using jQuery.ajax, keep plain object + } + } + + _createFormData(formDataEntries) { + const formData = new window.FormData(); + for(const entryName in formDataEntries) { + if(Object.prototype.hasOwnProperty.call(formDataEntries, entryName) && isDefined(formDataEntries[entryName])) { + formData.append(entryName, formDataEntries[entryName]); + } + } + return formData; + } + + _appendFormDataInputsToForm(formDataEntries, formElement) { + for(const entryName in formDataEntries) { + if(Object.prototype.hasOwnProperty.call(formDataEntries, entryName) && isDefined(formDataEntries[entryName])) { + $('').attr({ + type: 'hidden', + name: entryName, + value: formDataEntries[entryName] + }).appendTo(formElement); + } + } + } + + _getEndpointUrl(command, args) { + const queryString = this._getQueryString({ + command, + arguments: JSON.stringify(args) + }); + const separator = this._endpointUrl && this._endpointUrl.indexOf('?') > 0 ? '&' : '?'; + return this._endpointUrl + separator + queryString; + } + + _getQueryString(params) { + const pairs = []; + + const keys = Object.keys(params); + for(let i = 0; i < keys.length; i++) { + const key = keys[i]; + let value = params[key]; + + if(value === undefined) { + continue; + } + + if(value === null) { + value = ''; + } + + if(Array.isArray(value)) { + this._processQueryStringArrayParam(key, value, pairs); + } else { + const pair = this._getQueryStringPair(key, value); + pairs.push(pair); + } + } + + return pairs.join('&'); + } + + _processQueryStringArrayParam(key, array, pairs) { + each(array, (_, item) => { + const pair = this._getQueryStringPair(key, item); + pairs.push(pair); + }); + } + + _getQueryStringPair(key, value) { + return encodeURIComponent(key) + '=' + encodeURIComponent(value); + } + + _hasSubDirs(dataObj) { + const hasSubDirs = this._hasSubDirsGetter(dataObj); + return typeof hasSubDirs === 'boolean' ? hasSubDirs : true; + } + + _getKeyExpr(options) { + return options.keyExpr || 'key'; + } + +} + +export default RemoteFileSystemProvider; diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/upload_info.d.ts b/packages/f-theme-editor/farris-theme-editor/js/file_management/upload_info.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..bc5a26146caeef29c34e66a33f1ce5e9173c9157 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/upload_info.d.ts @@ -0,0 +1,36 @@ +/** + * @docid + * @namespace DevExpress.fileManagement + * @public + */ +export default interface UploadInfo { + /** + * @docid + * @public + */ + bytesUploaded: number; + + /** + * @docid + * @public + */ + chunkCount: number; + + /** + * @docid + * @public + */ + customData: any; + + /** + * @docid + * @public + */ + chunkBlob: Blob; + + /** + * @docid + * @public + */ + chunkIndex: number; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/file_management/utils.js b/packages/f-theme-editor/farris-theme-editor/js/file_management/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..cab8f28ee306eb39436a58c397fdbe063aec12bd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/file_management/utils.js @@ -0,0 +1,74 @@ +import { each } from '../core/utils/iterator'; + +export const PATH_SEPARATOR = '/'; + +export const getFileExtension = path => { + const index = path.lastIndexOf('.'); + return index !== -1 ? path.substr(index) : ''; +}; + +export const getName = path => { + const index = path.lastIndexOf(PATH_SEPARATOR); + return index !== -1 ? path.substr(index + PATH_SEPARATOR.length) : path; +}; + +export const getParentPath = path => { + const index = path.lastIndexOf(PATH_SEPARATOR); + return index !== -1 ? path.substr(0, index) : ''; +}; + +export const getPathParts = (path, includeFullPath) => { + if(!path || path === '/') { + return []; + } + const result = []; + let pathPart = ''; + + for(let i = 0; i < path.length; i++) { + let char = path.charAt(i); + if(char === PATH_SEPARATOR) { + const nextChar = path.charAt(i + 1); + if(nextChar !== PATH_SEPARATOR) { + if(pathPart) { + result.push(pathPart); + pathPart = ''; + } + char = nextChar; + } + i++; + } + pathPart += char; + } + + if(pathPart) { + result.push(pathPart); + } + + if(includeFullPath) { + for(let i = 0; i < result.length; i++) { + result[i] = pathCombine(i === 0 ? '' : result[i - 1], getEscapedFileName(result[i])); + } + } + + return result; +}; + +export const getEscapedFileName = function(fileName) { + return fileName.replace(/\//g, '//'); +}; + +export const pathCombine = function() { + let result = ''; + + each(arguments, (_, arg) => { + if(arg) { + if(result) { + result += PATH_SEPARATOR; + } + + result += arg; + } + }); + + return result; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/format_helper.d.ts b/packages/f-theme-editor/farris-theme-editor/js/format_helper.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6004518534d0d613824fc1dc38ca53c4ae653d6e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/format_helper.d.ts @@ -0,0 +1,8 @@ +export interface FormatHelper { + format( + value: number | Date | null | undefined | string, + format: string | ((value: unknown) => string) | Record): string; +} + +declare const formatHelper: FormatHelper; +export default formatHelper; diff --git a/packages/f-theme-editor/farris-theme-editor/js/format_helper.js b/packages/f-theme-editor/farris-theme-editor/js/format_helper.js new file mode 100644 index 0000000000000000000000000000000000000000..f194972695c06ade6ed11e41b8bb00d89e69460d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/format_helper.js @@ -0,0 +1,236 @@ +import { + isString, + isNumeric, + isFunction, + isDefined, + isDate, + isPlainObject +} from './core/utils/type'; +import dateUtils from './core/utils/date'; +import numberLocalization from './localization/number'; +import dateLocalization from './localization/date'; +import dependencyInjector from './core/utils/dependency_injector'; + +import './localization/currency'; + +export default dependencyInjector({ + format: function(value, format) { + const formatIsValid = isString(format) && format !== '' || isPlainObject(format) || isFunction(format); + const valueIsValid = isNumeric(value) || isDate(value); + + + if(!formatIsValid || !valueIsValid) { + return isDefined(value) ? value.toString() : ''; + } + + if(isFunction(format)) { + return format(value); + } + + if(isString(format)) { + format = { type: format }; + } + + if(isNumeric(value)) { + return numberLocalization.format(value, format); + } + + if(isDate(value)) { + return dateLocalization.format(value, format); + } + }, + getTimeFormat: function(showSecond) { + return showSecond ? 'longtime' : 'shorttime'; + }, + + _normalizeFormat: function(format) { + if(!Array.isArray(format)) { + return format; + } + + if(format.length === 1) { + return format[0]; + } + + return function(date) { + return format.map(function(formatPart) { + return dateLocalization.format(date, formatPart); + }).join(' '); + }; + }, + + getDateFormatByDifferences: function(dateDifferences, intervalFormat) { + const resultFormat = []; + const needSpecialSecondFormatter = intervalFormat && dateDifferences.millisecond && !(dateDifferences.year || dateDifferences.month || dateDifferences.day); + + if(needSpecialSecondFormatter) { + const secondFormatter = function(date) { + return (date.getSeconds() + date.getMilliseconds() / 1000) + 's'; + }; + resultFormat.push(secondFormatter); + } else if(dateDifferences.millisecond) { + resultFormat.push('millisecond'); + } + + if(dateDifferences.hour || dateDifferences.minute || (!needSpecialSecondFormatter && dateDifferences.second)) { + resultFormat.unshift(this.getTimeFormat(dateDifferences.second)); + } + + if(dateDifferences.year && dateDifferences.month && dateDifferences.day) { + if(intervalFormat && intervalFormat === 'month') { + return 'monthandyear'; + } else { + resultFormat.unshift('shortdate'); + return this._normalizeFormat(resultFormat); + } + } + + if(dateDifferences.year && dateDifferences.month) { + return 'monthandyear'; + } + if(dateDifferences.year && dateDifferences.quarter) { + return 'quarterandyear'; + } + if(dateDifferences.year) { + return 'year'; + } + if(dateDifferences.quarter) { + return 'quarter'; + } + + if(dateDifferences.month && dateDifferences.day) { + if(intervalFormat) { + const monthDayFormatter = function(date) { + return dateLocalization.getMonthNames('abbreviated')[date.getMonth()] + ' ' + dateLocalization.format(date, 'day'); + }; + resultFormat.unshift(monthDayFormatter); + } else { + resultFormat.unshift('monthandday'); + } + return this._normalizeFormat(resultFormat); + } + if(dateDifferences.month) { + return 'month'; + } + if(dateDifferences.day) { + if(intervalFormat) { + resultFormat.unshift('day'); + } else { + const dayFormatter = function(date) { + return dateLocalization.format(date, 'dayofweek') + ', ' + dateLocalization.format(date, 'day'); + }; + resultFormat.unshift(dayFormatter); + } + return this._normalizeFormat(resultFormat); + } + + return this._normalizeFormat(resultFormat); + }, + getDateFormatByTicks: function(ticks) { + let maxDiff; + let currentDiff; + let i; + + if(ticks.length > 1) { + maxDiff = dateUtils.getDatesDifferences(ticks[0], ticks[1]); + for(i = 1; i < ticks.length - 1; i++) { + currentDiff = dateUtils.getDatesDifferences(ticks[i], ticks[i + 1]); + if(maxDiff.count < currentDiff.count) { + maxDiff = currentDiff; + } + } + } else { + maxDiff = { + year: true, + month: true, + day: true, + hour: ticks[0].getHours() > 0, + minute: ticks[0].getMinutes() > 0, + second: ticks[0].getSeconds() > 0, + millisecond: ticks[0].getMilliseconds() > 0 + }; + } + + const resultFormat = this.getDateFormatByDifferences(maxDiff); + return resultFormat; + }, + + getDateFormatByTickInterval: function(startValue, endValue, tickInterval) { + let dateUnitInterval; + const dateDifferencesConverter = { week: 'day' }; + const correctDateDifferences = function(dateDifferences, tickInterval, value) { + switch(tickInterval) { + case 'year': + case 'quarter': + dateDifferences.month = value; + /* falls through */ + case 'month': + dateDifferences.day = value; + /* falls through */ + case 'week': + case 'day': + dateDifferences.hour = value; + /* falls through */ + case 'hour': + dateDifferences.minute = value; + /* falls through */ + case 'minute': + dateDifferences.second = value; + /* falls through */ + case 'second': + dateDifferences.millisecond = value; + } + }; + const correctDifferencesByMaxDate = function(differences, minDate, maxDate) { + if(!maxDate.getMilliseconds() && maxDate.getSeconds()) { + if(maxDate.getSeconds() - minDate.getSeconds() === 1) { + differences.millisecond = true; + differences.second = false; + } + } else if(!maxDate.getSeconds() && maxDate.getMinutes()) { + if(maxDate.getMinutes() - minDate.getMinutes() === 1) { + differences.second = true; + differences.minute = false; + } + } else if(!maxDate.getMinutes() && maxDate.getHours()) { + if(maxDate.getHours() - minDate.getHours() === 1) { + differences.minute = true; + differences.hour = false; + } + } else if(!maxDate.getHours() && maxDate.getDate() > 1) { + if(maxDate.getDate() - minDate.getDate() === 1) { + differences.hour = true; + differences.day = false; + } + } else if(maxDate.getDate() === 1 && maxDate.getMonth()) { + if(maxDate.getMonth() - minDate.getMonth() === 1) { + differences.day = true; + differences.month = false; + } + } else if(!maxDate.getMonth() && maxDate.getFullYear()) { + if(maxDate.getFullYear() - minDate.getFullYear() === 1) { + differences.month = true; + differences.year = false; + } + } + }; + tickInterval = isString(tickInterval) ? tickInterval.toLowerCase() : tickInterval; + const dateDifferences = dateUtils.getDatesDifferences(startValue, endValue); + + if(startValue !== endValue) { + correctDifferencesByMaxDate(dateDifferences, startValue > endValue ? endValue : startValue, startValue > endValue ? startValue : endValue); + } + + dateUnitInterval = dateUtils.getDateUnitInterval(dateDifferences); + correctDateDifferences(dateDifferences, dateUnitInterval, true); + + + dateUnitInterval = dateUtils.getDateUnitInterval(tickInterval || 'second'); + correctDateDifferences(dateDifferences, dateUnitInterval, false); + + dateDifferences[dateDifferencesConverter[dateUnitInterval] || dateUnitInterval] = true; + + const resultFormat = this.getDateFormatByDifferences(dateDifferences); + return resultFormat; + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular.js new file mode 100644 index 0000000000000000000000000000000000000000..459dcabaa27e22929999bfc380876118855872ab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular.js @@ -0,0 +1,5 @@ +import './jquery'; +import './angular/component_registrator'; +import './angular/event_registrator'; +import './angular/components'; +import './angular/action_executors'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/action_executors.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/action_executors.js new file mode 100644 index 0000000000000000000000000000000000000000..179c29a608f6bde558b495b56af57025e2d4c9f2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/action_executors.js @@ -0,0 +1,15 @@ +import Action from '../../core/action'; +// eslint-disable-next-line no-restricted-imports +import angular from 'angular'; + +if(angular) { + Action.registerExecutor({ + 'ngExpression': { + execute: function(e) { + if(typeof e.action === 'string') { + e.context.$eval(e.action); + } + } + } + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/component_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/component_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..141c608ed3f9f2283d5603f0c3018ce598e02620 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/component_registrator.js @@ -0,0 +1,618 @@ +import $ from '../../core/renderer'; +// eslint-disable-next-line no-restricted-imports +import angular from 'angular'; +import eventsEngine from '../../events/core/events_engine'; +import Config from '../../core/config'; +import registerComponentCallbacks from '../../core/component_registrator_callbacks'; +import Class from '../../core/class'; +import Callbacks from '../../core/utils/callbacks'; +import { type, isDefined, isNumeric } from '../../core/utils/type'; +import { each } from '../../core/utils/iterator'; +import { inArray } from '../../core/utils/array'; +import Locker from '../../core/utils/locker'; +import Editor from '../../ui/editor/editor'; +import { NgTemplate } from './template'; +import ngModule from './module'; +import CollectionWidget from '../../ui/collection/ui.collection_widget.edit'; +import { compileGetter, compileSetter } from '../../core/utils/data'; +import { extendFromObject } from '../../core/utils/extend'; +import { equals } from '../../core/utils/comparator'; +import { dasherize } from '../../core/utils/inflector'; + +const ITEM_ALIAS_ATTRIBUTE_NAME = 'dxItemAlias'; +const SKIP_APPLY_ACTION_CATEGORIES = ['rendering']; +const NG_MODEL_OPTION = 'value'; + +if(angular) { + const safeApply = (func, scope) => { + if(scope.$root.$$phase) { + return func(scope); + } else { + return scope.$apply(() => func(scope)); + } + }; + + const getClassMethod = (initClass, methodName) => { + const hasParentProperty = Object.prototype.hasOwnProperty.bind(initClass)('parent'); + const isES6Class = !hasParentProperty && initClass.parent; + + if(isES6Class) { + const baseClass = Object.getPrototypeOf(initClass); + + return baseClass.prototype[methodName] + ? () => baseClass.prototype[methodName]() + : getClassMethod(baseClass, methodName); + } else { + const method = initClass.parent.prototype[methodName]; + if(method) { + return () => method(); + } + + if(!method || !initClass.parent.subclassOf) { + return () => undefined; + } + + return getClassMethod(initClass.parent, methodName); + } + }; + + + let ComponentBuilder = Class.inherit({ + + ctor(options) { + this._componentDisposing = Callbacks(); + this._optionChangedCallbacks = Callbacks(); + this._ngLocker = new Locker(); + + this._scope = options.scope; + this._$element = options.$element; + this._$templates = options.$templates; + this._componentClass = options.componentClass; + this._parse = options.parse; + this._compile = options.compile; + this._itemAlias = options.itemAlias; + this._transcludeFn = options.transcludeFn; + this._digestCallbacks = options.dxDigestCallbacks; + + this._normalizeOptions(options.ngOptions); + + this._initComponentBindings(); + this._initComponent(this._scope); + + if(!options.ngOptions) { + this._addOptionsStringWatcher(options.ngOptionsString); + } + }, + + _addOptionsStringWatcher(optionsString) { + const clearOptionsStringWatcher = this._scope.$watch(optionsString, newOptions => { + if(!newOptions) { + return; + } + + clearOptionsStringWatcher(); + + this._normalizeOptions(newOptions); + + this._initComponentBindings(); + this._component.option(this._evalOptions(this._scope)); + }); + + this._componentDisposing.add(clearOptionsStringWatcher); + }, + + _normalizeOptions(options) { + this._ngOptions = extendFromObject({}, options); + + if(!options) { + return; + } + + if(!Object.prototype.hasOwnProperty.call(options, 'bindingOptions') && options.bindingOptions) { + this._ngOptions.bindingOptions = options.bindingOptions; + } + + if(options.bindingOptions) { + each(options.bindingOptions, (key, value) => { + if(type(value) === 'string') { + this._ngOptions.bindingOptions[key] = { dataPath: value }; + } + }); + } + }, + + _initComponent(scope) { + this._component = new this._componentClass(this._$element, this._evalOptions(scope)); + this._component._isHidden = true; + this._handleDigestPhase(); + }, + + _handleDigestPhase() { + const beginUpdate = () => { + this._component.beginUpdate(); + }; + + const endUpdate = () => { + this._component.endUpdate(); + }; + + this._digestCallbacks.begin.add(beginUpdate); + this._digestCallbacks.end.add(endUpdate); + + this._componentDisposing.add(() => { + this._digestCallbacks.begin.remove(beginUpdate); + this._digestCallbacks.end.remove(endUpdate); + }); + }, + + _initComponentBindings() { + const optionDependencies = {}; + + if(!this._ngOptions.bindingOptions) { + return; + } + + each(this._ngOptions.bindingOptions, (optionPath, value) => { + const separatorIndex = optionPath.search(/\[|\./); + const optionForSubscribe = separatorIndex > -1 ? optionPath.substring(0, separatorIndex) : optionPath; + let prevWatchMethod; + let clearWatcher; + const valuePath = value.dataPath; + let deepWatch = true; + let forcePlainWatchMethod = false; + + if(value.deep !== undefined) { + forcePlainWatchMethod = deepWatch = !!value.deep; + } + + if(!optionDependencies[optionForSubscribe]) { + optionDependencies[optionForSubscribe] = {}; + } + + optionDependencies[optionForSubscribe][optionPath] = valuePath; + + const updateWatcher = () => { + const watchCallback = (newValue, oldValue) => { + if(this._ngLocker.locked(optionPath)) { + return; + } + + this._ngLocker.obtain(optionPath); + this._component.option(optionPath, newValue); + updateWatcher(); + + if(equals(oldValue, newValue) && this._ngLocker.locked(optionPath)) { + this._ngLocker.release(optionPath); + } + }; + + const watchMethod = Array.isArray(this._scope.$eval(valuePath)) && !forcePlainWatchMethod ? '$watchCollection' : '$watch'; + + if(prevWatchMethod !== watchMethod) { + if(clearWatcher) { + clearWatcher(); + } + clearWatcher = this._scope[watchMethod](valuePath, watchCallback, deepWatch); + prevWatchMethod = watchMethod; + } + }; + + updateWatcher(); + + this._componentDisposing.add(clearWatcher); + }); + + this._optionChangedCallbacks.add(args => { + const optionName = args.name; + const fullName = args.fullName; + const component = args.component; + + if(this._ngLocker.locked(fullName)) { + this._ngLocker.release(fullName); + return; + } + + if(!optionDependencies || !optionDependencies[optionName]) { + return; + } + + const isActivePhase = this._scope.$root.$$phase; + const obtainOption = () => { + this._ngLocker.obtain(fullName); + }; + + if(isActivePhase) { + this._digestCallbacks.begin.add(obtainOption); + } else { + obtainOption(); + } + + safeApply(() => { + each(optionDependencies[optionName], (optionPath, valuePath) => { + if(!this._optionsAreLinked(fullName, optionPath)) { + return; + } + + const value = component.option(optionPath); + this._parse(valuePath).assign(this._scope, value); + + const scopeValue = this._parse(valuePath)(this._scope); + if(scopeValue !== value) { + args.component.option(optionPath, scopeValue); + } + }); + }, this._scope); + + const releaseOption = () => { + if(this._ngLocker.locked(fullName)) { + this._ngLocker.release(fullName); + } + this._digestCallbacks.begin.remove(obtainOption); + this._digestCallbacks.end.remove(releaseOption); + }; + + if(isActivePhase) { + this._digestCallbacks.end.addPrioritized(releaseOption); + } else { + releaseOption(); + } + }); + }, + + _optionsAreNested(optionPath1, optionPath2) { + const parentSeparator = optionPath1[optionPath2.length]; + return optionPath1.indexOf(optionPath2) === 0 && (parentSeparator === '.' || parentSeparator === '['); + }, + + _optionsAreLinked(optionPath1, optionPath2) { + if(optionPath1 === optionPath2) return true; + + return optionPath1.length > optionPath2.length + ? this._optionsAreNested(optionPath1, optionPath2) + : this._optionsAreNested(optionPath2, optionPath1); + }, + + _compilerByTemplate(template) { + const scopeItemsPath = this._getScopeItemsPath(); + + return options => { + const $resultMarkup = $(template).clone(); + const dataIsScope = options.model && options.model.constructor === this._scope.$root.constructor; + const templateScope = dataIsScope ? options.model : (options.noModel ? this._scope : this._createScopeWithData(options)); + + if(scopeItemsPath) { + this._synchronizeScopes(templateScope, scopeItemsPath, options.index); + } + + $resultMarkup.appendTo(options.container); + + if(!options.noModel) { + eventsEngine.on($resultMarkup, '$destroy', () => { + const destroyAlreadyCalled = !templateScope.$parent; + + if(destroyAlreadyCalled) { + return; + } + + templateScope.$destroy(); + }); + } + + const ngTemplate = this._compile($resultMarkup, this._transcludeFn); + this._applyAsync(scope => { + ngTemplate(scope, null, { parentBoundTranscludeFn: this._transcludeFn }); + }, templateScope); + + return $resultMarkup; + }; + }, + + _applyAsync(func, scope) { + func(scope); + if(!scope.$root.$$phase) { + if(!this._renderingTimer) { + const clearRenderingTimer = () => { + clearTimeout(this._renderingTimer); + }; + this._renderingTimer = setTimeout(() => { + scope.$apply(); + this._renderingTimer = null; + this._componentDisposing.remove(clearRenderingTimer); + }); + this._componentDisposing.add(clearRenderingTimer); + } + } + }, + + _getScopeItemsPath() { + if(this._componentClass.subclassOf(CollectionWidget) && this._ngOptions.bindingOptions && this._ngOptions.bindingOptions.items) { + return this._ngOptions.bindingOptions.items.dataPath; + } + }, + + _createScopeWithData(options) { + const newScope = this._scope.$new(); + + if(this._itemAlias) { + newScope[this._itemAlias] = options.model; + } + + if(isDefined(options.index)) { + newScope.$index = options.index; + } + + return newScope; + }, + + _synchronizeScopes(itemScope, parentPrefix, itemIndex) { + if(this._itemAlias && typeof (itemScope[this._itemAlias]) !== 'object') { + this._synchronizeScopeField({ + parentScope: this._scope, + childScope: itemScope, + fieldPath: this._itemAlias, + parentPrefix, + itemIndex + }); + } + }, + + _synchronizeScopeField(args) { + const parentScope = args.parentScope; + const childScope = args.childScope; + const fieldPath = args.fieldPath; + const parentPrefix = args.parentPrefix; + const itemIndex = args.itemIndex; + const innerPathSuffix = fieldPath === this._itemAlias ? '' : '.' + fieldPath; + const collectionField = itemIndex !== undefined; + const optionOuterBag = [parentPrefix]; + + if(collectionField) { + if(!isNumeric(itemIndex)) return; + + optionOuterBag.push('[', itemIndex, ']'); + } + + optionOuterBag.push(innerPathSuffix); + const optionOuterPath = optionOuterBag.join(''); + + const clearParentWatcher = parentScope.$watch(optionOuterPath, (newValue, oldValue) => { + if(newValue !== oldValue) { + compileSetter(fieldPath)(childScope, newValue); + } + }); + + const clearItemWatcher = childScope.$watch(fieldPath, (newValue, oldValue) => { + if(newValue !== oldValue) { + if(collectionField && !compileGetter(parentPrefix)(parentScope)[itemIndex]) { + clearItemWatcher(); + return; + } + compileSetter(optionOuterPath)(parentScope, newValue); + } + }); + + this._componentDisposing.add([clearParentWatcher, clearItemWatcher]); // TODO: test + }, + + _evalOptions(scope) { + const result = extendFromObject({}, this._ngOptions); + + delete result.bindingOptions; + + if(this._ngOptions.bindingOptions) { + each(this._ngOptions.bindingOptions, (key, value) => { + result[key] = scope.$eval(value.dataPath); + }); + } + + result._optionChangedCallbacks = this._optionChangedCallbacks; + result._disposingCallbacks = this._componentDisposing; + result.onActionCreated = (component, action, config) => { + if(config && inArray(config.category, SKIP_APPLY_ACTION_CATEGORIES) > -1) { + return action; + } + + const wrappedAction = function() { + const args = arguments; + + if(!scope || !scope.$root || scope.$root.$$phase) { + return action.apply(this, args); + } + + return safeApply(() => action.apply(this, args), scope); + }; + + return wrappedAction; + }; + result.beforeActionExecute = result.onActionCreated; + result.nestedComponentOptions = component => ({ + templatesRenderAsynchronously: component.option('templatesRenderAsynchronously'), + forceApplyBindings: component.option('forceApplyBindings'), + modelByElement: component.option('modelByElement'), + onActionCreated: component.option('onActionCreated'), + beforeActionExecute: component.option('beforeActionExecute'), + nestedComponentOptions: component.option('nestedComponentOptions') + }); + + result.templatesRenderAsynchronously = true; + + if(Config().wrapActionsBeforeExecute) { + result.forceApplyBindings = () => { + safeApply(() => {}, scope); + }; + } + + result.integrationOptions = { + createTemplate: element => new NgTemplate(element, this._compilerByTemplate.bind(this)), + watchMethod: (fn, callback, options) => { + options = options || {}; + + let immediateValue; + let skipCallback = options.skipImmediate; + const disposeWatcher = scope.$watch(() => { + let value = fn(); + if(value instanceof Date) { + value = value.valueOf(); + } + return value; + }, newValue => { + const isSameValue = immediateValue === newValue; + if(!skipCallback && (!isSameValue || isSameValue && options.deep)) { + callback(newValue); + } + skipCallback = false; + }, options.deep); + + if(!skipCallback) { + immediateValue = fn(); + callback(immediateValue); + } + + if(Config().wrapActionsBeforeExecute) { + this._applyAsync(() => {}, scope); + } + + return disposeWatcher; + }, + templates: { + 'dx-polymorph-widget': { + render: options => { + const widgetName = options.model.widget; + if(!widgetName) { + return; + } + + const markup = $('
').attr(dasherize(widgetName), 'options').get(0); + const newScope = this._scope.$new(); + + newScope.options = options.model.options; + options.container.append(markup); + this._compile(markup)(newScope); + } + } + } + }; + + result.modelByElement = () => scope; + + return result; + } + }); + + ComponentBuilder = ComponentBuilder.inherit({ + + ctor(options) { + this._componentName = options.componentName; + this._ngModel = options.ngModel; + this._ngModelController = options.ngModelController; + + this.callBase(...arguments); + }, + + _isNgModelRequired() { + return Editor.isEditor(this._componentClass.prototype) && this._ngModel; + }, + + _initComponentBindings(...args) { + this.callBase(...args); + + this._initNgModelBinding(); + }, + + _initNgModelBinding() { + if(!this._isNgModelRequired()) { + return; + } + + const clearNgModelWatcher = this._scope.$watch(this._ngModel, (newValue, oldValue) => { + if(this._ngLocker.locked(NG_MODEL_OPTION)) { + return; + } + + if(newValue === oldValue) { + return; + } + + this._component.option(NG_MODEL_OPTION, newValue); + }); + + this._optionChangedCallbacks.add(args => { + this._ngLocker.obtain(NG_MODEL_OPTION); + try { + if(args.name !== NG_MODEL_OPTION) { + return; + } + + this._ngModelController.$setViewValue(args.value); + } finally { + if(this._ngLocker.locked(NG_MODEL_OPTION)) { + this._ngLocker.release(NG_MODEL_OPTION); + } + } + }); + + this._componentDisposing.add(clearNgModelWatcher); + }, + + _evalOptions(...args) { + if(!this._isNgModelRequired()) { + return this.callBase(...args); + } + + const result = this.callBase(...args); + result[NG_MODEL_OPTION] = this._parse(this._ngModel)(this._scope); + return result; + } + }); + + const registeredComponents = {}; + + const registerComponentDirective = name => { + const priority = name !== 'dxValidator' ? 1 : 10; + ngModule.directive(name, ['$compile', '$parse', 'dxDigestCallbacks', ($compile, $parse, dxDigestCallbacks) => ({ + restrict: 'A', + require: '^?ngModel', + priority, + + compile($element) { + const componentClass = registeredComponents[name]; + const useTemplates = componentClass.prototype._useTemplates + ? componentClass.prototype._useTemplates() + : getClassMethod(componentClass, '_useTemplates')(); + const $content = useTemplates ? $element.contents().detach() : null; + + return (scope, $element, attrs, ngModelController, transcludeFn) => { + $element.append($content); + + safeApply(() => { + new ComponentBuilder({ + componentClass, + componentName: name, + compile: $compile, + parse: $parse, + $element, + scope, + ngOptionsString: attrs[name], + ngOptions: attrs[name] ? scope.$eval(attrs[name]) : {}, + ngModel: attrs.ngModel, + ngModelController, + transcludeFn, + itemAlias: attrs[ITEM_ALIAS_ATTRIBUTE_NAME], + dxDigestCallbacks + }); + }, scope); + }; + } + })]); + }; + + registerComponentCallbacks.add((name, componentClass) => { + + if(!registeredComponents[name]) { + registerComponentDirective(name); + } + registeredComponents[name] = componentClass; + + }); + +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/components.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/components.js new file mode 100644 index 0000000000000000000000000000000000000000..8f8dbe2757289d8e593fb6ed4c8ca80dc3673245 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/components.js @@ -0,0 +1,46 @@ +import Callbacks from '../../core/utils/callbacks'; +import ngModule from './module'; +// eslint-disable-next-line no-restricted-imports +import angular from 'angular'; + +if(angular) { + ngModule.service('dxDigestCallbacks', ['$rootScope', function($rootScope) { + const begin = Callbacks(); + const prioritizedEnd = Callbacks(); + const end = Callbacks(); + + let digestPhase = false; + + $rootScope.$watch(function() { + if(digestPhase) { + return; + } + + digestPhase = true; + begin.fire(); + + $rootScope.$$postDigest(function() { + digestPhase = false; + prioritizedEnd.fire(); + end.fire(); + }); + }); + + return { + begin: { + add: function(callback) { + if(digestPhase) { + callback(); + } + begin.add(callback); + }, + remove: begin.remove.bind(begin) + }, + end: { + add: end.add.bind(end), + addPrioritized: prioritizedEnd.add.bind(prioritizedEnd), + remove: end.remove.bind(end) + } + }; + }]); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/event_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/event_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..1f25f67f2f6289f1f9c977f4dd21dd5e2e32c68e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/event_registrator.js @@ -0,0 +1,31 @@ +import eventRegistratorCallbacks from '../../events/core/event_registrator_callbacks'; +import eventsEngine from '../../events/core/events_engine'; +import ngModule from './module'; +// eslint-disable-next-line no-restricted-imports +import angular from 'angular'; + +if(angular) { + eventRegistratorCallbacks.add(function(name) { + const ngEventName = name.slice(0, 2) + name.charAt(2).toUpperCase() + name.slice(3); + ngModule.directive(ngEventName, ['$parse', function($parse) { + return function(scope, element, attr) { + const attrValue = attr[ngEventName].trim(); + let handler; + let eventOptions = { }; + + if(attrValue.charAt(0) === '{') { + eventOptions = scope.$eval(attrValue); + handler = $parse(eventOptions.execute); + } else { + handler = $parse(attr[ngEventName]); + } + + eventsEngine.on(element, name, eventOptions, function(e) { + scope.$apply(function() { + handler(scope, { $event: e }); + }); + }); + }; + }]); + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/module.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/module.js new file mode 100644 index 0000000000000000000000000000000000000000..781134e6c553d52bceea56269daecdefadac87ee --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/module.js @@ -0,0 +1,7 @@ +// eslint-disable-next-line no-restricted-imports +import angular from 'angular'; +let ngModule = {}; +if(angular) { + ngModule = angular.module('dx', []); +} +export default ngModule; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/angular/template.js b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/template.js new file mode 100644 index 0000000000000000000000000000000000000000..986087f650290b81916c1c32e8da139897efe1ed --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/angular/template.js @@ -0,0 +1,23 @@ +import $ from '../../core/renderer'; +import { TemplateBase } from '../../core/templates/template_base'; +import { isFunction } from '../../core/utils/type'; +import { normalizeTemplateElement } from '../../core/utils/dom'; + +export const NgTemplate = class extends TemplateBase { + constructor(element, templateCompiler) { + super(); + this._element = element; + + this._compiledTemplate = templateCompiler(normalizeTemplateElement(this._element)); + } + + _renderCore(options) { + const compiledTemplate = this._compiledTemplate; + + return isFunction(compiledTemplate) ? compiledTemplate(options) : compiledTemplate; + } + + source() { + return $(this._element).clone(); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.d.ts b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..603f3fd37a13750aa9670e2596afe224bcb42dd7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.d.ts @@ -0,0 +1,600 @@ +import dxAccordion, { Properties as AccordionProperties } from '../ui/accordion'; +import dxActionSheet, { Properties as ActionSheetProperties } from '../ui/action_sheet'; +import dxAutocomplete, { Properties as AutocompleteProperties } from '../ui/autocomplete'; +import dxBox, { Properties as BoxProperties } from '../ui/box'; +import dxButton, { Properties as ButtonProperties } from '../ui/button'; +import dxButtonGroup, { Properties as ButtonGroupProperties } from '../ui/button_group'; +import dxCalendar, { Properties as CalendarProperties } from '../ui/calendar'; +import dxCheckBox, { Properties as CheckBoxProperties } from '../ui/check_box'; +import dxColorBox, { Properties as ColorBoxProperties } from '../ui/color_box'; +import dxContextMenu, { Properties as ContextMenuProperties } from '../ui/context_menu'; +import dxDataGrid, { Properties as DataGridProperties } from '../ui/data_grid'; +import dxDateBox, { Properties as DateBoxProperties } from '../ui/date_box'; +import dxDeferRendering, { Properties as DeferRenderingProperties } from '../ui/defer_rendering'; +import dxDiagram, { Properties as DiagramProperties } from '../ui/diagram'; +import dxDraggable, { Properties as DraggableProperties } from '../ui/draggable'; +import dxDrawer, { Properties as DrawerProperties } from '../ui/drawer'; +import dxDropDownBox, { Properties as DropDownBoxProperties } from '../ui/drop_down_box'; +import dxDropDownButton, { Properties as DropDownButtonProperties } from '../ui/drop_down_button'; +import dxFileManager, { Properties as FileManagerProperties } from '../ui/file_manager'; +import dxFileUploader, { Properties as FileUploaderProperties } from '../ui/file_uploader'; +import dxFilterBuilder, { Properties as FilterBuilderProperties } from '../ui/filter_builder'; +import dxForm, { Properties as FormProperties } from '../ui/form'; +import dxGallery, { Properties as GalleryProperties } from '../ui/gallery'; +import dxGantt, { Properties as GanttProperties } from '../ui/gantt'; +import dxHtmlEditor, { Properties as HtmlEditorProperties } from '../ui/html_editor'; +import dxList, { Properties as ListProperties } from '../ui/list'; +import dxLoadIndicator, { Properties as LoadIndicatorProperties } from '../ui/load_indicator'; +import dxLoadPanel, { Properties as LoadPanelProperties } from '../ui/load_panel'; +import dxLookup, { Properties as LookupProperties } from '../ui/lookup'; +import dxMap, { Properties as MapProperties } from '../ui/map'; +import dxMenu, { Properties as MenuProperties } from '../ui/menu'; +import dxMultiView, { Properties as MultiViewProperties } from '../ui/multi_view'; +import dxNavBar, { Properties as NavBarProperties } from '../ui/nav_bar'; +import dxNumberBox, { Properties as NumberBoxProperties } from '../ui/number_box'; +import dxPivotGrid, { Properties as PivotGridProperties } from '../ui/pivot_grid'; +import dxPivotGridFieldChooser, { Properties as PivotGridFieldChooserProperties } from '../ui/pivot_grid_field_chooser'; +import dxPopover, { Properties as PopoverProperties } from '../ui/popover'; +import dxPopup, { Properties as PopupProperties } from '../ui/popup'; +import dxProgressBar, { Properties as ProgressBarProperties } from '../ui/progress_bar'; +import dxRadioGroup, { Properties as RadioGroupProperties } from '../ui/radio_group'; +import dxRangeSlider, { Properties as RangeSliderProperties } from '../ui/range_slider'; +import dxRecurrenceEditor, { Properties as RecurrenceEditorProperties } from '../ui/recurrence_editor'; +import dxResizable, { Properties as ResizableProperties } from '../ui/resizable'; +import dxResponsiveBox, { Properties as ResponsiveBoxProperties } from '../ui/responsive_box'; +import dxScheduler, { Properties as SchedulerProperties } from '../ui/scheduler'; +import dxScrollView, { Properties as ScrollViewProperties } from '../ui/scroll_view'; +import dxSelectBox, { Properties as SelectBoxProperties } from '../ui/select_box'; +import dxSlider, { Properties as SliderProperties } from '../ui/slider'; +import dxSlideOut, { Properties as SlideOutProperties } from '../ui/slide_out'; +import dxSlideOutView, { Properties as SlideOutViewProperties } from '../ui/slide_out_view'; +import dxSortable, { Properties as SortableProperties } from '../ui/sortable'; +import dxSpeedDialAction, { Properties as SpeedDialActionProperties } from '../ui/speed_dial_action'; +import dxSwitch, { Properties as SwitchProperties } from '../ui/switch'; +import dxTabs, { Properties as TabsProperties } from '../ui/tabs'; +import dxTabPanel, { Properties as TabPanelProperties } from '../ui/tab_panel'; +import dxTagBox, { Properties as TagBoxProperties } from '../ui/tag_box'; +import dxTextArea, { Properties as TextAreaProperties } from '../ui/text_area'; +import dxTextBox, { Properties as TextBoxProperties } from '../ui/text_box'; +import dxTileView, { Properties as TileViewProperties } from '../ui/tile_view'; +import dxToast, { Properties as ToastProperties } from '../ui/toast'; +import dxToolbar, { Properties as ToolbarProperties } from '../ui/toolbar'; +import dxTooltip, { Properties as TooltipProperties } from '../ui/tooltip'; +import dxTreeList, { Properties as TreeListProperties } from '../ui/tree_list'; +import dxTreeView, { Properties as TreeViewProperties } from '../ui/tree_view'; +import dxValidationGroup, { Properties as ValidationGroupProperties } from '../ui/validation_group'; +import dxValidationMessage, { Properties as ValidationMessageProperties } from '../ui/validation_message'; +import dxValidationSummary, { Properties as ValidationSummaryProperties } from '../ui/validation_summary'; +import dxValidator, { Properties as ValidatorProperties } from '../ui/validator'; +import dxBarGauge, { Properties as BarGaugeProperties } from '../viz/bar_gauge'; +import dxBullet, { Properties as BulletProperties } from '../viz/bullet'; +import dxChart, { Properties as ChartProperties } from '../viz/chart'; +import dxCircularGauge, { Properties as CircularGaugeProperties } from '../viz/circular_gauge'; +import dxFunnel, { Properties as FunnelProperties } from '../viz/funnel'; +import dxLinearGauge, { Properties as LinearGaugeProperties } from '../viz/linear_gauge'; +import dxPieChart, { Properties as PieChartProperties } from '../viz/pie_chart'; +import dxPolarChart, { Properties as PolarChartProperties } from '../viz/polar_chart'; +import dxRangeSelector, { Properties as RangeSelectorProperties } from '../viz/range_selector'; +import dxSankey, { Properties as SankeyProperties } from '../viz/sankey'; +import dxSparkline, { Properties as SparklineProperties } from '../viz/sparkline'; +import dxTreeMap, { Properties as TreeMapProperties } from '../viz/tree_map'; +import dxVectorMap, { Properties as VectorMapProperties } from '../viz/vector_map'; + +declare module '../core/element' { + interface Condition extends JQueryEventObject { } + interface ElementWrapper extends JQuery { } + interface ElementsArrayWrapper extends JQuery { } + interface InternalElementWrapper extends JQuery { } +} + +declare module '../core/utils/deferred' { + interface PromiseType extends JQueryPromise { } +} + +declare module '../events/index' { + interface EventType extends JQueryEventObject { + cancel?: boolean; + } + interface EventExtension { + jQueryEvent?: JQueryEventObject; + } +} + +/* eslint-disable @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars */ +declare global { + interface JQueryPromise { } + interface JQueryEventObject { } + interface JQuery { } + interface JQuery { + + dxAccordion(): JQuery; + dxAccordion(options: 'instance'): dxAccordion; + dxAccordion(options: AccordionProperties): JQuery; + dxAccordion(options: string): any; + dxAccordion(options: string, ...params: any[]): any; + + dxActionSheet(): JQuery; + dxActionSheet(options: 'instance'): dxActionSheet; + dxActionSheet(options: ActionSheetProperties): JQuery; + dxActionSheet(options: string): any; + dxActionSheet(options: string, ...params: any[]): any; + + dxAutocomplete(): JQuery; + dxAutocomplete(options: 'instance'): dxAutocomplete; + dxAutocomplete(options: AutocompleteProperties): JQuery; + dxAutocomplete(options: string): any; + dxAutocomplete(options: string, ...params: any[]): any; + + dxBarGauge(): JQuery; + dxBarGauge(options: 'instance'): dxBarGauge; + dxBarGauge(options: BarGaugeProperties): JQuery; + dxBarGauge(options: string): any; + dxBarGauge(options: string, ...params: any[]): any; + + dxBox(): JQuery; + dxBox(options: 'instance'): dxBox; + dxBox(options: BoxProperties): JQuery; + dxBox(options: string): any; + dxBox(options: string, ...params: any[]): any; + + dxBullet(): JQuery; + dxBullet(options: 'instance'): dxBullet; + dxBullet(options: BulletProperties): JQuery; + dxBullet(options: string): any; + dxBullet(options: string, ...params: any[]): any; + + dxButton(): JQuery; + dxButton(options: 'instance'): dxButton; + dxButton(options: ButtonProperties): JQuery; + dxButton(options: string): any; + dxButton(options: string, ...params: any[]): any; + + dxButtonGroup(): JQuery; + dxButtonGroup(options: 'instance'): dxButtonGroup; + dxButtonGroup(options: ButtonGroupProperties): JQuery; + dxButtonGroup(options: string): any; + dxButtonGroup(options: string, ...params: any[]): any; + + dxCalendar(): JQuery; + dxCalendar(options: 'instance'): dxCalendar; + dxCalendar(options: CalendarProperties): JQuery; + dxCalendar(options: string): any; + dxCalendar(options: string, ...params: any[]): any; + + dxChart(): JQuery; + dxChart(options: 'instance'): dxChart; + dxChart(options: ChartProperties): JQuery; + dxChart(options: string): any; + dxChart(options: string, ...params: any[]): any; + + dxCheckBox(): JQuery; + dxCheckBox(options: 'instance'): dxCheckBox; + dxCheckBox(options: CheckBoxProperties): JQuery; + dxCheckBox(options: string): any; + dxCheckBox(options: string, ...params: any[]): any; + + dxCircularGauge(): JQuery; + dxCircularGauge(options: 'instance'): dxCircularGauge; + dxCircularGauge(options: CircularGaugeProperties): JQuery; + dxCircularGauge(options: string): any; + dxCircularGauge(options: string, ...params: any[]): any; + + dxColorBox(): JQuery; + dxColorBox(options: 'instance'): dxColorBox; + dxColorBox(options: ColorBoxProperties): JQuery; + dxColorBox(options: string): any; + dxColorBox(options: string, ...params: any[]): any; + + dxContextMenu(): JQuery; + dxContextMenu(options: 'instance'): dxContextMenu; + dxContextMenu(options: ContextMenuProperties): JQuery; + dxContextMenu(options: string): any; + dxContextMenu(options: string, ...params: any[]): any; + + dxDataGrid(): JQuery; + dxDataGrid(options: 'instance'): dxDataGrid; + dxDataGrid(options: DataGridProperties): JQuery; + dxDataGrid(options: string): any; + dxDataGrid(options: string, ...params: any[]): any; + + dxDateBox(): JQuery; + dxDateBox(options: 'instance'): dxDateBox; + dxDateBox(options: DateBoxProperties): JQuery; + dxDateBox(options: string): any; + dxDateBox(options: string, ...params: any[]): any; + + dxDeferRendering(): JQuery; + dxDeferRendering(options: 'instance'): dxDeferRendering; + dxDeferRendering(options: DeferRenderingProperties): JQuery; + dxDeferRendering(options: string): any; + dxDeferRendering(options: string, ...params: any[]): any; + + dxDiagram(): JQuery; + dxDiagram(options: 'instance'): dxDiagram; + dxDiagram(options: DiagramProperties): JQuery; + dxDiagram(options: string): any; + dxDiagram(options: string, ...params: any[]): any; + + dxDraggable(): JQuery; + dxDraggable(options: 'instance'): dxDraggable; + dxDraggable(options: DraggableProperties): JQuery; + dxDraggable(options: string): any; + dxDraggable(options: string, ...params: any[]): any; + + dxDrawer(): JQuery; + dxDrawer(options: 'instance'): dxDrawer; + dxDrawer(options: DrawerProperties): JQuery; + dxDrawer(options: string): any; + dxDrawer(options: string, ...params: any[]): any; + + dxDropDownBox(): JQuery; + dxDropDownBox(options: 'instance'): dxDropDownBox; + dxDropDownBox(options: DropDownBoxProperties): JQuery; + dxDropDownBox(options: string): any; + dxDropDownBox(options: string, ...params: any[]): any; + + dxDropDownButton(): JQuery; + dxDropDownButton(options: 'instance'): dxDropDownButton; + dxDropDownButton(options: DropDownButtonProperties): JQuery; + dxDropDownButton(options: string): any; + dxDropDownButton(options: string, ...params: any[]): any; + + dxFileManager(): JQuery; + dxFileManager(options: 'instance'): dxFileManager; + dxFileManager(options: FileManagerProperties): JQuery; + dxFileManager(options: string): any; + dxFileManager(options: string, ...params: any[]): any; + + dxFileUploader(): JQuery; + dxFileUploader(options: 'instance'): dxFileUploader; + dxFileUploader(options: FileUploaderProperties): JQuery; + dxFileUploader(options: string): any; + dxFileUploader(options: string, ...params: any[]): any; + + dxFilterBuilder(): JQuery; + dxFilterBuilder(options: 'instance'): dxFilterBuilder; + dxFilterBuilder(options: FilterBuilderProperties): JQuery; + dxFilterBuilder(options: string): any; + dxFilterBuilder(options: string, ...params: any[]): any; + + dxForm(): JQuery; + dxForm(options: 'instance'): dxForm; + dxForm(options: FormProperties): JQuery; + dxForm(options: string): any; + dxForm(options: string, ...params: any[]): any; + + dxFunnel(): JQuery; + dxFunnel(options: 'instance'): dxFunnel; + dxFunnel(options: FunnelProperties): JQuery; + dxFunnel(options: string): any; + dxFunnel(options: string, ...params: any[]): any; + + dxGallery(): JQuery; + dxGallery(options: 'instance'): dxGallery; + dxGallery(options: GalleryProperties): JQuery; + dxGallery(options: string): any; + dxGallery(options: string, ...params: any[]): any; + + dxGantt(): JQuery; + dxGantt(options: 'instance'): dxGantt; + dxGantt(options: GanttProperties): JQuery; + dxGantt(options: string): any; + dxGantt(options: string, ...params: any[]): any; + + dxHtmlEditor(): JQuery; + dxHtmlEditor(options: 'instance'): dxHtmlEditor; + dxHtmlEditor(options: HtmlEditorProperties): JQuery; + dxHtmlEditor(options: string): any; + dxHtmlEditor(options: string, ...params: any[]): any; + + dxLinearGauge(): JQuery; + dxLinearGauge(options: 'instance'): dxLinearGauge; + dxLinearGauge(options: LinearGaugeProperties): JQuery; + dxLinearGauge(options: string): any; + dxLinearGauge(options: string, ...params: any[]): any; + + dxList(): JQuery; + dxList(options: 'instance'): dxList; + dxList(options: ListProperties): JQuery; + dxList(options: string): any; + dxList(options: string, ...params: any[]): any; + + dxLoadIndicator(): JQuery; + dxLoadIndicator(options: 'instance'): dxLoadIndicator; + dxLoadIndicator(options: LoadIndicatorProperties): JQuery; + dxLoadIndicator(options: string): any; + dxLoadIndicator(options: string, ...params: any[]): any; + + dxLoadPanel(): JQuery; + dxLoadPanel(options: 'instance'): dxLoadPanel; + dxLoadPanel(options: LoadPanelProperties): JQuery; + dxLoadPanel(options: string): any; + dxLoadPanel(options: string, ...params: any[]): any; + + dxLookup(): JQuery; + dxLookup(options: 'instance'): dxLookup; + dxLookup(options: LookupProperties): JQuery; + dxLookup(options: string): any; + dxLookup(options: string, ...params: any[]): any; + + dxMap(): JQuery; + dxMap(options: 'instance'): dxMap; + dxMap(options: MapProperties): JQuery; + dxMap(options: string): any; + dxMap(options: string, ...params: any[]): any; + + dxMenu(): JQuery; + dxMenu(options: 'instance'): dxMenu; + dxMenu(options: MenuProperties): JQuery; + dxMenu(options: string): any; + dxMenu(options: string, ...params: any[]): any; + + dxMultiView(): JQuery; + dxMultiView(options: 'instance'): dxMultiView; + dxMultiView(options: MultiViewProperties): JQuery; + dxMultiView(options: string): any; + dxMultiView(options: string, ...params: any[]): any; + + dxNavBar(): JQuery; + dxNavBar(options: 'instance'): dxNavBar; + dxNavBar(options: NavBarProperties): JQuery; + dxNavBar(options: string): any; + dxNavBar(options: string, ...params: any[]): any; + + dxNumberBox(): JQuery; + dxNumberBox(options: 'instance'): dxNumberBox; + dxNumberBox(options: NumberBoxProperties): JQuery; + dxNumberBox(options: string): any; + dxNumberBox(options: string, ...params: any[]): any; + + dxPieChart(): JQuery; + dxPieChart(options: 'instance'): dxPieChart; + dxPieChart(options: PieChartProperties): JQuery; + dxPieChart(options: string): any; + dxPieChart(options: string, ...params: any[]): any; + + dxPivotGrid(): JQuery; + dxPivotGrid(options: 'instance'): dxPivotGrid; + dxPivotGrid(options: PivotGridProperties): JQuery; + dxPivotGrid(options: string): any; + dxPivotGrid(options: string, ...params: any[]): any; + + dxPivotGridFieldChooser(): JQuery; + dxPivotGridFieldChooser(options: 'instance'): dxPivotGridFieldChooser; + dxPivotGridFieldChooser(options: PivotGridFieldChooserProperties): JQuery; + dxPivotGridFieldChooser(options: string): any; + dxPivotGridFieldChooser(options: string, ...params: any[]): any; + + dxPolarChart(): JQuery; + dxPolarChart(options: 'instance'): dxPolarChart; + dxPolarChart(options: PolarChartProperties): JQuery; + dxPolarChart(options: string): any; + dxPolarChart(options: string, ...params: any[]): any; + + dxPopover(): JQuery; + dxPopover(options: 'instance'): dxPopover; + dxPopover(options: PopoverProperties): JQuery; + dxPopover(options: string): any; + dxPopover(options: string, ...params: any[]): any; + + dxPopup(): JQuery; + dxPopup(options: 'instance'): dxPopup; + dxPopup(options: PopupProperties): JQuery; + dxPopup(options: string): any; + dxPopup(options: string, ...params: any[]): any; + + dxProgressBar(): JQuery; + dxProgressBar(options: 'instance'): dxProgressBar; + dxProgressBar(options: ProgressBarProperties): JQuery; + dxProgressBar(options: string): any; + dxProgressBar(options: string, ...params: any[]): any; + + dxRadioGroup(): JQuery; + dxRadioGroup(options: 'instance'): dxRadioGroup; + dxRadioGroup(options: RadioGroupProperties): JQuery; + dxRadioGroup(options: string): any; + dxRadioGroup(options: string, ...params: any[]): any; + + dxRangeSelector(): JQuery; + dxRangeSelector(options: 'instance'): dxRangeSelector; + dxRangeSelector(options: RangeSelectorProperties): JQuery; + dxRangeSelector(options: string): any; + dxRangeSelector(options: string, ...params: any[]): any; + + dxRangeSlider(): JQuery; + dxRangeSlider(options: 'instance'): dxRangeSlider; + dxRangeSlider(options: RangeSliderProperties): JQuery; + dxRangeSlider(options: string): any; + dxRangeSlider(options: string, ...params: any[]): any; + + dxRecurrenceEditor(): JQuery; + dxRecurrenceEditor(options: 'instance'): dxRecurrenceEditor; + dxRecurrenceEditor(options: RecurrenceEditorProperties): JQuery; + dxRecurrenceEditor(options: string): any; + dxRecurrenceEditor(options: string, ...params: any[]): any; + + dxResizable(): JQuery; + dxResizable(options: 'instance'): dxResizable; + dxResizable(options: ResizableProperties): JQuery; + dxResizable(options: string): any; + dxResizable(options: string, ...params: any[]): any; + + dxResponsiveBox(): JQuery; + dxResponsiveBox(options: 'instance'): dxResponsiveBox; + dxResponsiveBox(options: ResponsiveBoxProperties): JQuery; + dxResponsiveBox(options: string): any; + dxResponsiveBox(options: string, ...params: any[]): any; + + dxSankey(): JQuery; + dxSankey(options: 'instance'): dxSankey; + dxSankey(options: SankeyProperties): JQuery; + dxSankey(options: string): any; + dxSankey(options: string, ...params: any[]): any; + + dxScheduler(): JQuery; + dxScheduler(options: 'instance'): dxScheduler; + dxScheduler(options: SchedulerProperties): JQuery; + dxScheduler(options: string): any; + dxScheduler(options: string, ...params: any[]): any; + + dxScrollView(): JQuery; + dxScrollView(options: 'instance'): dxScrollView; + dxScrollView(options: ScrollViewProperties): JQuery; + dxScrollView(options: string): any; + dxScrollView(options: string, ...params: any[]): any; + + dxSelectBox(): JQuery; + dxSelectBox(options: 'instance'): dxSelectBox; + dxSelectBox(options: SelectBoxProperties): JQuery; + dxSelectBox(options: string): any; + dxSelectBox(options: string, ...params: any[]): any; + + dxSlideOut(): JQuery; + dxSlideOut(options: 'instance'): dxSlideOut; + dxSlideOut(options: SlideOutProperties): JQuery; + dxSlideOut(options: string): any; + dxSlideOut(options: string, ...params: any[]): any; + + dxSlideOutView(): JQuery; + dxSlideOutView(options: 'instance'): dxSlideOutView; + dxSlideOutView(options: SlideOutViewProperties): JQuery; + dxSlideOutView(options: string): any; + dxSlideOutView(options: string, ...params: any[]): any; + + dxSlider(): JQuery; + dxSlider(options: 'instance'): dxSlider; + dxSlider(options: SliderProperties): JQuery; + dxSlider(options: string): any; + dxSlider(options: string, ...params: any[]): any; + + dxSortable(): JQuery; + dxSortable(options: 'instance'): dxSortable; + dxSortable(options: SortableProperties): JQuery; + dxSortable(options: string): any; + dxSortable(options: string, ...params: any[]): any; + + dxSparkline(): JQuery; + dxSparkline(options: 'instance'): dxSparkline; + dxSparkline(options: SparklineProperties): JQuery; + dxSparkline(options: string): any; + dxSparkline(options: string, ...params: any[]): any; + + dxSpeedDialAction(): JQuery; + dxSpeedDialAction(options: 'instance'): dxSpeedDialAction; + dxSpeedDialAction(options: SpeedDialActionProperties): JQuery; + dxSpeedDialAction(options: string): any; + dxSpeedDialAction(options: string, ...params: any[]): any; + + dxSwitch(): JQuery; + dxSwitch(options: 'instance'): dxSwitch; + dxSwitch(options: SwitchProperties): JQuery; + dxSwitch(options: string): any; + dxSwitch(options: string, ...params: any[]): any; + + dxTabPanel(): JQuery; + dxTabPanel(options: 'instance'): dxTabPanel; + dxTabPanel(options: TabPanelProperties): JQuery; + dxTabPanel(options: string): any; + dxTabPanel(options: string, ...params: any[]): any; + + dxTabs(): JQuery; + dxTabs(options: 'instance'): dxTabs; + dxTabs(options: TabsProperties): JQuery; + dxTabs(options: string): any; + dxTabs(options: string, ...params: any[]): any; + + dxTagBox(): JQuery; + dxTagBox(options: 'instance'): dxTagBox; + dxTagBox(options: TagBoxProperties): JQuery; + dxTagBox(options: string): any; + dxTagBox(options: string, ...params: any[]): any; + + dxTextArea(): JQuery; + dxTextArea(options: 'instance'): dxTextArea; + dxTextArea(options: TextAreaProperties): JQuery; + dxTextArea(options: string): any; + dxTextArea(options: string, ...params: any[]): any; + + dxTextBox(): JQuery; + dxTextBox(options: 'instance'): dxTextBox; + dxTextBox(options: TextBoxProperties): JQuery; + dxTextBox(options: string): any; + dxTextBox(options: string, ...params: any[]): any; + + dxTileView(): JQuery; + dxTileView(options: 'instance'): dxTileView; + dxTileView(options: TileViewProperties): JQuery; + dxTileView(options: string): any; + dxTileView(options: string, ...params: any[]): any; + + dxToast(): JQuery; + dxToast(options: 'instance'): dxToast; + dxToast(options: ToastProperties): JQuery; + dxToast(options: string): any; + dxToast(options: string, ...params: any[]): any; + + dxToolbar(): JQuery; + dxToolbar(options: 'instance'): dxToolbar; + dxToolbar(options: ToolbarProperties): JQuery; + dxToolbar(options: string): any; + dxToolbar(options: string, ...params: any[]): any; + + dxTooltip(): JQuery; + dxTooltip(options: 'instance'): dxTooltip; + dxTooltip(options: TooltipProperties): JQuery; + dxTooltip(options: string): any; + dxTooltip(options: string, ...params: any[]): any; + + dxTreeList(): JQuery; + dxTreeList(options: 'instance'): dxTreeList; + dxTreeList(options: TreeListProperties): JQuery; + dxTreeList(options: string): any; + dxTreeList(options: string, ...params: any[]): any; + + dxTreeMap(): JQuery; + dxTreeMap(options: 'instance'): dxTreeMap; + dxTreeMap(options: TreeMapProperties): JQuery; + dxTreeMap(options: string): any; + dxTreeMap(options: string, ...params: any[]): any; + + dxTreeView(): JQuery; + dxTreeView(options: 'instance'): dxTreeView; + dxTreeView(options: TreeViewProperties): JQuery; + dxTreeView(options: string): any; + dxTreeView(options: string, ...params: any[]): any; + + dxValidationGroup(): JQuery; + dxValidationGroup(options: 'instance'): dxValidationGroup; + dxValidationGroup(options: ValidationGroupProperties): JQuery; + dxValidationGroup(options: string): any; + dxValidationGroup(options: string, ...params: any[]): any; + + dxValidationMessage(): JQuery; + dxValidationMessage(options: 'instance'): dxValidationMessage; + dxValidationMessage(options: ValidationMessageProperties): JQuery; + dxValidationMessage(options: string): any; + dxValidationMessage(options: string, ...params: any[]): any; + + dxValidationSummary(): JQuery; + dxValidationSummary(options: 'instance'): dxValidationSummary; + dxValidationSummary(options: ValidationSummaryProperties): JQuery; + dxValidationSummary(options: string): any; + dxValidationSummary(options: string, ...params: any[]): any; + + dxValidator(): JQuery; + dxValidator(options: 'instance'): dxValidator; + dxValidator(options: ValidatorProperties): JQuery; + dxValidator(options: string): any; + dxValidator(options: string, ...params: any[]): any; + + dxVectorMap(): JQuery; + dxVectorMap(options: 'instance'): dxVectorMap; + dxVectorMap(options: VectorMapProperties): JQuery; + dxVectorMap(options: string): any; + dxVectorMap(options: string, ...params: any[]): any; + } +} +/* eslint-enable @typescript-eslint/no-empty-interface, @typescript-eslint/no-unused-vars */ + +// eslint-disable-next-line no-empty-pattern +export const { }; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..75cacc9de25612f0c5af8266365e36c2e3eb45e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery.js @@ -0,0 +1,22 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import { compare as compareVersions } from '../core/utils/version'; +import errors from '../core/utils/error'; +import useJQueryMethod from './jquery/use_jquery'; + +const useJQuery = useJQueryMethod(); + +if(useJQuery && compareVersions(jQuery.fn.jquery, [1, 10]) < 0) { + throw errors.Error('E0012'); +} + +import './jquery/renderer'; +import './jquery/hooks'; +import './jquery/deferred'; +import './jquery/hold_ready'; +import './jquery/events'; +import './jquery/easing'; +import './jquery/element_data'; +import './jquery/element'; +import './jquery/component_registrator'; +import './jquery/ajax'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/ajax.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/ajax.js new file mode 100644 index 0000000000000000000000000000000000000000..e76aca683a27fdd26f14e03c8ef9b5f21a2051a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/ajax.js @@ -0,0 +1,19 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import ajax from '../../core/utils/ajax'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); + +if(useJQuery) { + ajax.inject({ + sendRequest: function(options) { + if(!options.responseType && !options.upload) { + return jQuery.ajax(options); + } + + return this.callBase.apply(this, [options]); + } + }); +} + + diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/component_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/component_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..2a2ff535ccea01468e38822b93c6a6195421a17f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/component_registrator.js @@ -0,0 +1,48 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import componentRegistratorCallbacks from '../../core/component_registrator_callbacks'; +import errors from '../../core/errors'; + +if(jQuery) { + const registerJQueryComponent = function(name, componentClass) { + jQuery.fn[name] = function(options) { + const isMemberInvoke = typeof options === 'string'; + let result; + + if(isMemberInvoke) { + const memberName = options; + const memberArgs = [].slice.call(arguments).slice(1); + + this.each(function() { + const instance = componentClass.getInstance(this); + + if(!instance) { + throw errors.Error('E0009', name); + } + + const member = instance[memberName]; + const memberValue = member.apply(instance, memberArgs); + + if(result === undefined) { + result = memberValue; + } + }); + } else { + this.each(function() { + const instance = componentClass.getInstance(this); + if(instance) { + instance.option(options); + } else { + new componentClass(this, options); + } + }); + + result = this; + } + + return result; + }; + }; + + componentRegistratorCallbacks.add(registerJQueryComponent); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/deferred.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/deferred.js new file mode 100644 index 0000000000000000000000000000000000000000..426fb52c4c4416e66bc803f8acb7d37a959883aa --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/deferred.js @@ -0,0 +1,25 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import { setStrategy } from '../../core/utils/deferred'; +import { compare as compareVersion } from '../../core/utils/version'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); + +if(useJQuery) { + const Deferred = jQuery.Deferred; + const strategy = { Deferred: Deferred }; + + strategy.when = compareVersion(jQuery.fn.jquery, [3]) < 0 + ? jQuery.when + : function(singleArg) { + if(arguments.length === 0) { + return new Deferred().resolve(); + } else if(arguments.length === 1) { + return singleArg && singleArg.then ? singleArg : new Deferred().resolve(singleArg); + } else { + return jQuery.when.apply(jQuery, arguments); + } + }; + + setStrategy(strategy); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/easing.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/easing.js new file mode 100644 index 0000000000000000000000000000000000000000..8c26bcbb08cfa5a600a0e0f247b170d6d60ea6ae --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/easing.js @@ -0,0 +1,7 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import { setEasing } from '../../animation/easing'; + +if(jQuery) { + setEasing(jQuery.easing); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element.js new file mode 100644 index 0000000000000000000000000000000000000000..daed25984e1258ca9271eb5fe97797955564570f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element.js @@ -0,0 +1,11 @@ +import { setPublicElementWrapper } from '../../core/element'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); + +const getPublicElement = function($element) { + return $element; +}; + +if(useJQuery) { + setPublicElementWrapper(getPublicElement); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element_data.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element_data.js new file mode 100644 index 0000000000000000000000000000000000000000..1bd70fd48f0728f48ba6d7886d1aa099ce45b9a1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/element_data.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import { setDataStrategy } from '../../core/element_data'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); + +if(useJQuery) { + setDataStrategy(jQuery); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/events.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/events.js new file mode 100644 index 0000000000000000000000000000000000000000..1c1368d4fe3916b9e858611e765a2eb78ae8720f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/events.js @@ -0,0 +1,42 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import eventsEngine from '../../events/core/events_engine'; +import useJQueryFn from './use_jquery'; +import registerEventCallbacks from '../../events/core/event_registrator_callbacks'; +import domAdapter from '../../core/dom_adapter'; +const useJQuery = useJQueryFn(); + +if(useJQuery) { + registerEventCallbacks.add(function(name, eventObject) { + jQuery.event.special[name] = eventObject; + }); + + if(eventsEngine.passiveEventHandlersSupported()) { + eventsEngine.forcePassiveFalseEventNames.forEach(function(eventName) { + jQuery.event.special[eventName] = { + setup: function(data, namespaces, handler) { + domAdapter.listen(this, eventName, handler, { passive: false }); + } + }; + }); + } + + eventsEngine.set({ + on: function(element) { + jQuery(element).on.apply(jQuery(element), Array.prototype.slice.call(arguments, 1)); + }, + one: function(element) { + jQuery(element).one.apply(jQuery(element), Array.prototype.slice.call(arguments, 1)); + }, + off: function(element) { + jQuery(element).off.apply(jQuery(element), Array.prototype.slice.call(arguments, 1)); + }, + trigger: function(element) { + jQuery(element).trigger.apply(jQuery(element), Array.prototype.slice.call(arguments, 1)); + }, + triggerHandler: function(element) { + jQuery(element).triggerHandler.apply(jQuery(element), Array.prototype.slice.call(arguments, 1)); + }, + Event: jQuery.Event + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hold_ready.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hold_ready.js new file mode 100644 index 0000000000000000000000000000000000000000..d5df11548b57c3918f812980878ff5105ab9ebff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hold_ready.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import { themeReadyCallback } from '../../ui/themes_callback'; +import readyCallbacks from '../../core/utils/ready_callbacks'; + +if(jQuery && !themeReadyCallback.fired()) { + const holdReady = jQuery.holdReady || jQuery.fn.holdReady; + + holdReady(true); + + themeReadyCallback.add(function() { + readyCallbacks.add(function() { + holdReady(false); + }); + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hooks.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hooks.js new file mode 100644 index 0000000000000000000000000000000000000000..156ab55a7be010ccf30281f551ef3aa459dc621d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/hooks.js @@ -0,0 +1,105 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); +import { compare as compareVersion } from '../../core/utils/version'; +import { each } from '../../core/utils/iterator'; +import { isNumeric } from '../../core/utils/type'; +import { setEventFixMethod } from '../../events/utils/index'; +import registerEvent from '../../events/core/event_registrator'; +import hookTouchProps from '../../events/core/hook_touch_props'; + +if(useJQuery) { + if(compareVersion(jQuery.fn.jquery, [3]) < 0) { + const POINTER_TYPE_MAP = { + 2: 'touch', + 3: 'pen', + 4: 'mouse' + }; + + each([ + 'MSPointerDown', 'MSPointerMove', 'MSPointerUp', 'MSPointerCancel', 'MSPointerOver', 'MSPointerOut', 'mouseenter', 'mouseleave', + 'pointerdown', 'pointermove', 'pointerup', 'pointercancel', 'pointerover', 'pointerout', 'pointerenter', 'pointerleave' + ], function() { + jQuery.event.fixHooks[this] = { + filter: function(event, originalEvent) { + const pointerType = originalEvent.pointerType; + + if(isNumeric(pointerType)) { + event.pointerType = POINTER_TYPE_MAP[pointerType]; + } + + return event; + }, + props: jQuery.event.mouseHooks.props.concat([ + 'pointerId', + 'pointerType', + 'originalTarget', + 'width', + 'height', + 'pressure', + 'result', + 'tiltX', + 'charCode', + 'tiltY', + 'detail', + 'isPrimary', + 'prevValue' + ]) + }; + }); + + each(['touchstart', 'touchmove', 'touchend', 'touchcancel'], function() { + jQuery.event.fixHooks[this] = { + filter: function(event, originalEvent) { + hookTouchProps(function(name, hook) { + event[name] = hook(originalEvent); + }); + + return event; + }, + + props: jQuery.event.mouseHooks.props.concat([ + 'touches', + 'changedTouches', + 'targetTouches', + 'detail', + 'result', + 'originalTarget', + 'charCode', + 'prevValue' + ]) + }; + }); + + jQuery.event.fixHooks['wheel'] = jQuery.event.mouseHooks; + + const DX_EVENT_HOOKS = { + props: jQuery.event.mouseHooks.props.concat(['pointerType', 'pointerId', 'pointers']) + }; + + registerEvent.callbacks.add(function(name) { + jQuery.event.fixHooks[name] = DX_EVENT_HOOKS; + }); + + const fix = function(event, originalEvent) { + const fixHook = jQuery.event.fixHooks[originalEvent.type] || jQuery.event.mouseHooks; + + const props = fixHook.props ? jQuery.event.props.concat(fixHook.props) : jQuery.event.props; + let propIndex = props.length; + + while(propIndex--) { + const prop = props[propIndex]; + event[prop] = originalEvent[prop]; + } + + return fixHook.filter ? fixHook.filter(event, originalEvent) : event; + }; + + setEventFixMethod(fix); + } else { + hookTouchProps(function(name, hook) { + jQuery.event.addProp(name, hook); + }); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/renderer.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/renderer.js new file mode 100644 index 0000000000000000000000000000000000000000..c036b73008643e6b10a9c0cc9558d12415dc5535 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/renderer.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import rendererBase from '../../core/renderer_base'; +import useJQueryFn from './use_jquery'; +const useJQuery = useJQueryFn(); + +if(useJQuery) { + rendererBase.set(jQuery); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/use_jquery.js b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/use_jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..14a834cdc263c66e3aa97a5d209f93cbd3943c30 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/jquery/use_jquery.js @@ -0,0 +1,12 @@ +// eslint-disable-next-line no-restricted-imports +import jQuery from 'jquery'; +import config from '../../core/config'; +const useJQuery = config().useJQuery; + +if(jQuery && useJQuery !== false) { + config({ useJQuery: true }); +} + +export default function() { + return jQuery && config().useJQuery; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout.js new file mode 100644 index 0000000000000000000000000000000000000000..0c59440852e2db62c692a0196cf86fb7f0e28de3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout.js @@ -0,0 +1,18 @@ +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import errors from '../core/errors'; +import { compare as compareVersion } from '../core/utils/version'; +// Check availability in global environment +if(ko) { + if(compareVersion(ko.version, [2, 3]) < 0) { + throw errors.Error('E0013'); + } +} + +import './knockout/component_registrator'; +import './knockout/event_registrator'; +import './knockout/components'; +import './knockout/validation'; +import './knockout/variable_wrapper_utils'; +import './knockout/clean_node'; +import './knockout/clean_node_old'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node.js new file mode 100644 index 0000000000000000000000000000000000000000..41622df2538138c8ba8b3759832c54744ae8e870 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node.js @@ -0,0 +1,48 @@ +import { afterCleanData, strategyChanging, cleanData } from '../../core/element_data'; +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import { compare as compareVersion } from '../../core/utils/version'; + +if(ko) { + const originalKOCleanExternalData = ko.utils.domNodeDisposal.cleanExternalData; + const patchCleanData = function() { + afterCleanData(function(nodes) { + let i; + for(i = 0; i < nodes.length; i++) { + nodes[i].cleanedByJquery = true; + } + + for(i = 0; i < nodes.length; i++) { + if(!nodes[i].cleanedByKo) { + ko.cleanNode(nodes[i]); + } + delete nodes[i].cleanedByKo; + } + + for(i = 0; i < nodes.length; i++) { + delete nodes[i].cleanedByJquery; + } + }); + + ko.utils.domNodeDisposal.cleanExternalData = function(node) { + node.cleanedByKo = true; + if(!node.cleanedByJquery) { + cleanData([node]); + } + }; + }; + + const restoreOriginCleanData = function() { + afterCleanData(function() {}); + ko.utils.domNodeDisposal.cleanExternalData = originalKOCleanExternalData; + }; + + patchCleanData(); + + strategyChanging.add(function(strategy) { + const isJQuery = !!strategy.fn; + if(isJQuery && compareVersion(strategy.fn.jquery, [2, 0]) < 0) { + restoreOriginCleanData(); + } + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node_old.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node_old.js new file mode 100644 index 0000000000000000000000000000000000000000..c2dd4d65b91228caf0837a61244539c3037a869e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/clean_node_old.js @@ -0,0 +1,65 @@ +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import { compare as compareVersion } from '../../core/utils/version'; +import { strategyChanging } from '../../core/element_data'; + +if(ko) { + const patchCleanData = function(jQuery) { + const cleanKoData = function(element, andSelf) { + const cleanNode = function() { + ko.cleanNode(this); + }; + + if(andSelf) { + element.each(cleanNode); + } else { + element.find('*').each(cleanNode); + } + }; + + const originalEmpty = jQuery.fn.empty; + jQuery.fn.empty = function() { + cleanKoData(this, false); + return originalEmpty.apply(this, arguments); + }; + + const originalRemove = jQuery.fn.remove; + jQuery.fn.remove = function(selector, keepData) { + if(!keepData) { + let subject = this; + if(selector) { + subject = subject.filter(selector); + } + cleanKoData(subject, true); + } + return originalRemove.call(this, selector, keepData); + }; + + const originalHtml = jQuery.fn.html; + jQuery.fn.html = function(value) { + if(typeof value === 'string') { + cleanKoData(this, false); + } + return originalHtml.apply(this, arguments); + }; + + const originalReplaceWith = jQuery.fn.replaceWith; + jQuery.fn.replaceWith = function() { + const result = originalReplaceWith.apply(this, arguments); + + if(!this.parent().length) { + cleanKoData(this, true); + } + + return result; + }; + }; + + strategyChanging.add(function(strategy) { + const isJQuery = !!strategy.fn; + + if(isJQuery && compareVersion(strategy.fn.jquery, [2, 0]) < 0) { + patchCleanData(strategy); + } + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/component_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/component_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..1ea3ed820579963b02ce5f5aa812cdb2096024b6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/component_registrator.js @@ -0,0 +1,229 @@ +import $ from '../../core/renderer'; +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import Callbacks from '../../core/utils/callbacks'; +import { isPlainObject } from '../../core/utils/type'; +import registerComponentCallbacks from '../../core/component_registrator_callbacks'; +import Widget from '../../ui/widget/ui.widget'; +import VizWidget from '../../viz/core/base_widget'; +import ComponentWrapper from '../../renovation/component_wrapper/common/component'; +import Draggable from '../../ui/draggable'; +import { KoTemplate } from './template'; +import Editor from '../../ui/editor/editor'; +import Locker from '../../core/utils/locker'; +import { getClosestNodeWithContext } from './utils'; +import config from '../../core/config'; + +if(ko) { + const LOCKS_DATA_KEY = 'dxKoLocks'; + const CREATED_WITH_KO_DATA_KEY = 'dxKoCreation'; + + const editorsBindingHandlers = []; + const registerComponentKoBinding = function(componentName, componentClass) { + + if(Editor.isEditor(componentClass.prototype)) { + editorsBindingHandlers.push(componentName); + } + + ko.bindingHandlers[componentName] = { + init: function(domNode, valueAccessor) { + const $element = $(domNode); + const optionChangedCallbacks = Callbacks(); + let optionsByReference = {}; + let component; + const knockoutConfig = config().knockout; + const isBindingPropertyPredicateName = knockoutConfig && knockoutConfig.isBindingPropertyPredicateName; + let isBindingPropertyPredicate; + let ctorOptions = { + onInitializing: function(options) { + optionsByReference = this._getOptionsByReference(); + + ko.computed(() => { + const model = ko.unwrap(valueAccessor()); + + if(component) { + component.beginUpdate(); + } + + isBindingPropertyPredicate = isBindingPropertyPredicateName && model && model[isBindingPropertyPredicateName]; + + unwrapModel(model); + + if(component) { + component.endUpdate(); + } else { + model?.onInitializing?.call(this, options); + } + + }, null, { disposeWhenNodeIsRemoved: domNode }); + + component = this; + }, + modelByElement: function($element) { + if($element.length) { + const node = getClosestNodeWithContext($element.get(0)); + return ko.dataFor(node); + } + }, + nestedComponentOptions: function(component) { + return { + modelByElement: component.option('modelByElement'), + nestedComponentOptions: component.option('nestedComponentOptions') + }; + }, + _optionChangedCallbacks: optionChangedCallbacks, + integrationOptions: { + watchMethod: function(fn, callback, options) { + options = options || {}; + + let skipCallback = options.skipImmediate; + const watcher = ko.computed(function() { + const newValue = ko.unwrap(fn()); + if(!skipCallback) { + callback(newValue); + } + skipCallback = false; + }); + return function() { + watcher.dispose(); + }; + }, + templates: { + 'dx-polymorph-widget': { + render: function(options) { + const widgetName = ko.utils.unwrapObservable(options.model.widget); + if(!widgetName) { + return; + } + + const markup = $('
').attr('data-bind', widgetName + ': options').get(0); + $(options.container).append(markup); + ko.applyBindings(options.model, markup); + } + } + }, + createTemplate: function(element) { + return new KoTemplate(element); + } + } + }; + const optionNameToModelMap = {}; + + const applyModelValueToOption = function(optionName, modelValue, unwrap) { + const locks = $element.data(LOCKS_DATA_KEY); + const optionValue = unwrap ? ko.unwrap(modelValue) : modelValue; + + if(ko.isWriteableObservable(modelValue)) { + optionNameToModelMap[optionName] = modelValue; + } + + if(component) { + if(locks.locked(optionName)) { + return; + } + + locks.obtain(optionName); + + try { + if(ko.ignoreDependencies) { + ko.ignoreDependencies(component.option, component, [optionName, optionValue]); + } else { + component.option(optionName, optionValue); + } + } finally { + locks.release(optionName); + } + } else { + ctorOptions[optionName] = optionValue; + } + }; + + const handleOptionChanged = function(args) { + const optionName = args.fullName; + const optionValue = args.value; + + if(!(optionName in optionNameToModelMap)) { + return; + } + + const $element = this._$element; + const locks = $element.data(LOCKS_DATA_KEY); + + if(locks.locked(optionName)) { + return; + } + + locks.obtain(optionName); + try { + optionNameToModelMap[optionName](optionValue); + } finally { + locks.release(optionName); + } + }; + + const createComponent = function() { + optionChangedCallbacks.add(handleOptionChanged); + $element + .data(CREATED_WITH_KO_DATA_KEY, true) + .data(LOCKS_DATA_KEY, new Locker()); + + new componentClass($element, ctorOptions); + + ctorOptions = null; + }; + + const unwrapModelValue = function(currentModel, propertyName, propertyPath) { + if(propertyPath === isBindingPropertyPredicateName) { + return; + } + + if( + !isBindingPropertyPredicate || + isBindingPropertyPredicate(propertyPath, propertyName, currentModel) + ) { + let unwrappedPropertyValue; + + ko.computed(function() { + const propertyValue = currentModel[propertyName]; + applyModelValueToOption(propertyPath, propertyValue, true); + unwrappedPropertyValue = ko.unwrap(propertyValue); + }, null, { disposeWhenNodeIsRemoved: domNode }); + + if(isPlainObject(unwrappedPropertyValue)) { + if(!optionsByReference[propertyPath]) { + unwrapModel(unwrappedPropertyValue, propertyPath); + } + } + } else { + applyModelValueToOption(propertyPath, currentModel[propertyName], false); + } + }; + + function unwrapModel(model, propertyPath) { + for(const propertyName in model) { + if(Object.prototype.hasOwnProperty.call(model, propertyName)) { + unwrapModelValue(model, propertyName, propertyPath ? [propertyPath, propertyName].join('.') : propertyName); + } + } + } + + createComponent(); + + return { + controlsDescendantBindings: componentClass.subclassOf(Widget) || componentClass.subclassOf(VizWidget) || + componentClass.subclassOf(ComponentWrapper) || component instanceof Draggable + }; + } + }; + + if(componentName === 'dxValidator') { + ko.bindingHandlers['dxValidator'].after = editorsBindingHandlers; + } + }; + + registerComponentCallbacks.add(function(name, componentClass) { + + registerComponentKoBinding(name, componentClass); + + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/components.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/components.js new file mode 100644 index 0000000000000000000000000000000000000000..380564de65f5381d6cd25f69bf1da291f3182693 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/components.js @@ -0,0 +1,35 @@ +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import { getImageContainer } from '../../core/utils/icon'; + +if(ko) { + ko.bindingHandlers.dxControlsDescendantBindings = { + init: function(_, valueAccessor) { + return { + controlsDescendantBindings: ko.unwrap(valueAccessor()) + }; + } + }; + + ko.bindingHandlers.dxIcon = { + init: function(element, valueAccessor) { + const options = ko.utils.unwrapObservable(valueAccessor()) || {}; + const iconElement = getImageContainer(options); + + ko.virtualElements.emptyNode(element); + if(iconElement) { + ko.virtualElements.prepend(element, iconElement.get(0)); + } + }, + update: function(element, valueAccessor) { + const options = ko.utils.unwrapObservable(valueAccessor()) || {}; + const iconElement = getImageContainer(options); + + ko.virtualElements.emptyNode(element); + if(iconElement) { + ko.virtualElements.prepend(element, iconElement.get(0)); + } + } + }; + ko.virtualElements.allowedBindings.dxIcon = true; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/event_registrator.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/event_registrator.js new file mode 100644 index 0000000000000000000000000000000000000000..81f23cb310232bb8fab9d83f0eafefb80abe0476 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/event_registrator.js @@ -0,0 +1,26 @@ +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import { isPlainObject } from '../../core/utils/type'; +import eventRegistratorCallbacks from '../../events/core/event_registrator_callbacks'; +import { addNamespace } from '../../events/utils/index'; + +if(ko) { + eventRegistratorCallbacks.add(function(name) { + const koBindingEventName = addNamespace(name, name + 'Binding'); + + ko.bindingHandlers[name] = { + update: function(element, valueAccessor, allBindingsAccessor, viewModel) { + const $element = $(element); + const unwrappedValue = ko.utils.unwrapObservable(valueAccessor()); + const eventSource = unwrappedValue.execute ? unwrappedValue.execute : unwrappedValue; + + eventsEngine.off($element, koBindingEventName); + eventsEngine.on($element, koBindingEventName, isPlainObject(unwrappedValue) ? unwrappedValue : {}, function(e) { + eventSource.call(viewModel, viewModel, e); + }); + } + }; + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/template.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/template.js new file mode 100644 index 0000000000000000000000000000000000000000..56befe1d7f92482e0f51ddbb459887671c7e3bb9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/template.js @@ -0,0 +1,78 @@ +import $ from '../../core/renderer'; +import domAdapter from '../../core/dom_adapter'; +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import { isDefined } from '../../core/utils/type'; +import { TemplateBase } from '../../core/templates/template_base'; +import { normalizeTemplateElement } from '../../core/utils/dom'; +import { getClosestNodeWithContext } from './utils'; + +const getParentContext = function(data) { + const parentNode = domAdapter.createElement('div'); + + ko.applyBindingsToNode(parentNode, null, data); + const parentContext = ko.contextFor(parentNode); + + ko.cleanNode(parentNode); + + return parentContext; +}; + +export const KoTemplate = class extends TemplateBase { + constructor(element) { + super(); + this._element = element; + + this._template = $('
').append(normalizeTemplateElement(element)); + this._registerKoTemplate(); + } + + _registerKoTemplate() { + const template = this._template.get(0); + new ko.templateSources.anonymousTemplate(template)['nodes'](template); + } + + _prepareDataForContainer(data, container) { + if(container && container.length) { + const node = getClosestNodeWithContext(container.get(0)); + const containerContext = ko.contextFor(node); + data = data !== undefined ? data : ko.dataFor(node) || {}; + + if(containerContext) { + return (data === containerContext.$data) + ? containerContext + : containerContext.createChildContext(data); + } + } + + // workaround for https://github.com/knockout/knockout/pull/651 + return getParentContext(data).createChildContext(data); + } + + _renderCore(options) { + const model = this._prepareDataForContainer(options.model, $(options.container)); + + if(isDefined(options.index)) { + model.$index = options.index; + } + + const $placeholder = $('
').appendTo(options.container); + + let $result; + ko.renderTemplate(this._template.get(0), model, { + afterRender: function(nodes) { + $result = $(nodes); + } + }, $placeholder.get(0), 'replaceNode'); + + return $result; + } + + source() { + return $(this._element).clone(); + } + + dispose() { + this._template.remove(); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/utils.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..21d82b0adfa8665230b52b0c21db96aa19913cdc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/utils.js @@ -0,0 +1,12 @@ + +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; + +export const getClosestNodeWithContext = (node) => { + const context = ko.contextFor(node); + if(!context && node.parentNode) { + return getClosestNodeWithContext(node.parentNode); + } + + return node; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/validation.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/validation.js new file mode 100644 index 0000000000000000000000000000000000000000..5261847b703543ba618f59935c2c95fe2b986d02 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/validation.js @@ -0,0 +1,144 @@ +import { each, map } from '../../core/utils/iterator'; +import { extend } from '../../core/utils/extend'; +import Class from '../../core/class'; +import { EventsStrategy } from '../../core/events_strategy'; +import ValidationEngine from '../../ui/validation_engine'; +import { Deferred } from '../../core/utils/deferred'; +import Guid from '../../core/guid'; +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; + +if(ko) { + const VALIDATION_STATUS_VALID = 'valid'; + const VALIDATION_STATUS_PENDING = 'pending'; + + const koDxValidator = Class.inherit({ + ctor(target, { name, validationRules }) { + this.target = target; + this.name = name; + this.isValid = ko.observable(true); + this.validationError = ko.observable(); + this.validationErrors = ko.observable(); + this.validationStatus = ko.observable(VALIDATION_STATUS_VALID); + this._eventsStrategy = new EventsStrategy(this); + + this.validationRules = map(validationRules, (rule, index) => { + return extend({}, rule, { + validator: this, + index: index + }); + }); + this._validationInfo = { + result: null, + deferred: null + }; + }, + + _updateValidationResult(result) { + if(!this._validationInfo.result || this._validationInfo.result.id !== result.id) { + const complete = this._validationInfo.deferred && this._validationInfo.result.complete; + this._validationInfo.result = extend({}, result, { complete }); + } else { + for(const prop in result) { + if(prop !== 'id' && prop !== 'complete') { + this._validationInfo.result[prop] = result[prop]; + } + } + } + }, + + validate() { + const currentResult = this._validationInfo && this._validationInfo.result; + const value = this.target(); + if(currentResult && currentResult.status === VALIDATION_STATUS_PENDING && currentResult.value === value) { + return extend({}, currentResult); + } + const result = ValidationEngine.validate(value, this.validationRules, this.name); + result.id = new Guid().toString(); + this._applyValidationResult(result); + result.complete && result.complete.then((res) => { + if(res.id === this._validationInfo.result.id) { + this._applyValidationResult(res); + } + }); + return extend({}, this._validationInfo.result); + }, + + reset() { + this.target(null); + const result = { + id: null, + isValid: true, + brokenRule: null, + pendingRules: null, + status: VALIDATION_STATUS_VALID, + complete: null + }; + + this._applyValidationResult(result); + return result; + }, + + _applyValidationResult(result) { + result.validator = this; + this._updateValidationResult(result); + this.target.dxValidator.isValid(this._validationInfo.result.isValid); + this.target.dxValidator.validationError(this._validationInfo.result.brokenRule); + this.target.dxValidator.validationErrors(this._validationInfo.result.brokenRules); + this.target.dxValidator.validationStatus(this._validationInfo.result.status); + if(result.status === VALIDATION_STATUS_PENDING) { + if(!this._validationInfo.deferred) { + this._validationInfo.deferred = new Deferred(); + this._validationInfo.result.complete = this._validationInfo.deferred.promise(); + } + this._eventsStrategy.fireEvent('validating', [this._validationInfo.result]); + return; + } + if(result.status !== VALIDATION_STATUS_PENDING) { + this._eventsStrategy.fireEvent('validated', [result]); + if(this._validationInfo.deferred) { + this._validationInfo.deferred.resolve(result); + this._validationInfo.deferred = null; + } + } + }, + + on(eventName, eventHandler) { + this._eventsStrategy.on(eventName, eventHandler); + return this; + }, + + off(eventName, eventHandler) { + this._eventsStrategy.off(eventName, eventHandler); + return this; + } + }); + + + ko.extenders.dxValidator = function(target, option) { + target.dxValidator = new koDxValidator(target, option); + target.subscribe(target.dxValidator.validate.bind(target.dxValidator)); + + return target; + }; + + // TODO: MODULARITY: Move this to another place? + + ValidationEngine.registerModelForValidation = function(model) { + each(model, function(name, member) { + if(ko.isObservable(member) && member.dxValidator) { + ValidationEngine.registerValidatorInGroup(model, member.dxValidator); + } + }); + }; + + ValidationEngine.unregisterModelForValidation = function(model) { + each(model, function(name, member) { + if(ko.isObservable(member) && member.dxValidator) { + ValidationEngine.removeRegisteredValidator(model, member.dxValidator); + } + }); + }; + + ValidationEngine.validateModel = ValidationEngine.validateGroup; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/variable_wrapper_utils.js b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/variable_wrapper_utils.js new file mode 100644 index 0000000000000000000000000000000000000000..8c41d56af3afb361c611b011ad7c283a945453c1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/integration/knockout/variable_wrapper_utils.js @@ -0,0 +1,24 @@ +// eslint-disable-next-line no-restricted-imports +import ko from 'knockout'; +import variableWrapper from '../../core/utils/variable_wrapper'; + +if(ko) { + variableWrapper.inject({ + isWrapped: ko.isObservable, + isWritableWrapped: ko.isWritableObservable, + wrap: ko.observable, + unwrap: function(value) { + if(ko.isObservable(value)) { + return ko.utils.unwrapObservable(value); + } + return this.callBase(value); + }, + assign: function(variable, value) { + if(ko.isObservable(variable)) { + variable(value); + } else { + this.callBase(variable, value); + } + } + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization.d.ts b/packages/f-theme-editor/farris-theme-editor/js/localization.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9524455672c37676fae326411a3005640f9ad214 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization.d.ts @@ -0,0 +1,120 @@ +/** + * @docid localization.formatDate + * @publicName formatDate(value, format) + * @param1 value:date + * @static + * @namespace DevExpress.localization + * @public + */ +export function formatDate(value: Date, format: Format): string; + +/** + * @docid localization.formatMessage + * @publicName formatMessage(key, value) + * @param2 value:string|Array + * @static + * @namespace DevExpress.localization + * @public + */ +export function formatMessage(key: string, ...values: Array): string; + +/** + * @docid localization.formatNumber + * @publicName formatNumber(value, format) + * @static + * @namespace DevExpress.localization + * @public + */ +export function formatNumber(value: number, format: Format): string; + +/** + * @docid localization.loadMessages + * @publicName loadMessages(messages) + * @param1 messages:object + * @static + * @namespace DevExpress.localization + * @public + */ +export function loadMessages(messages: any): void; + +/** + * @docid localization.locale + * @publicName locale() + * @static + * @namespace DevExpress.localization + * @public + */ +export function locale(): string; + +/** + * @docid localization.locale + * @publicName locale(locale) + * @static + * @namespace DevExpress.localization + * @public + */ +// eslint-disable-next-line @typescript-eslint/no-shadow +export function locale(locale: string): void; + +/** + * @docid localization.parseDate + * @publicName parseDate(text, format) + * @return date + * @static + * @namespace DevExpress.localization + * @public + */ +export function parseDate(text: string, format: Format): Date; + +/** + * @docid localization.parseNumber + * @publicName parseNumber(text, format) + * @static + * @namespace DevExpress.localization + * @public + */ +export function parseNumber(text: string, format: Format): number; + +type PredefinedFormat = 'billions' | 'currency' | 'day' | 'decimal' | 'exponential' | 'fixedPoint' | 'largeNumber' | 'longDate' | 'longTime' | 'millions' | 'millisecond' | 'month' | 'monthAndDay' | 'monthAndYear' | 'percent' | 'quarter' | 'quarterAndYear' | 'shortDate' | 'shortTime' | 'thousands' | 'trillions' | 'year' | 'dayOfWeek' | 'hour' | 'longDateLongTime' | 'minute' | 'second' | 'shortDateShortTime'; +export interface FormatObject { + /** + * @docid Format.currency + * @public + */ + currency?: string; + /** + * @docid Format.formatter + * @public + * @type_function_param1 value:number|date + */ + formatter?: ((value: number | Date) => string); + /** + * @docid Format.parser + * @public + * @type_function_return number|date + */ + parser?: ((value: string) => number | Date); + /** + * @docid Format.precision + * @public + */ + precision?: number; + /** + * @docid Format.type + * @public + * @type Enums.Format|string + */ + type?: PredefinedFormat | string; +} +type ExternalFormat = any; + +/** + * @docid + * @type Object|Enums.Format|string|function + * @type_function_param1 value:number|date + * @default undefined + * @section Common + * @namespace DevExpress.ui + * @public + */ +export type Format = FormatObject | PredefinedFormat | string | ((value: number | Date) => string) | ExternalFormat; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization.js b/packages/f-theme-editor/farris-theme-editor/js/localization.js new file mode 100644 index 0000000000000000000000000000000000000000..e865a740c75f750c05379ad9a48596e8000ce3af --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization.js @@ -0,0 +1,32 @@ +import core from './localization/core'; +import message from './localization/message'; +import number from './localization/number'; +import date from './localization/date'; +import './localization/currency'; + +/** + * @name localization + */ + +export const locale = core.locale.bind(core); + +export const loadMessages = message.load.bind(message); +export const formatMessage = message.format.bind(message); +export const formatNumber = number.format.bind(number); +export const parseNumber = number.parse.bind(number); +export const formatDate = date.format.bind(date); +export const parseDate = date.parse.bind(date); +export { + message, + number, + date +}; + +export function disableIntl() { + if(number.engine() === 'intl') { + number.resetInjection(); + } + if(date.engine() === 'intl') { + date.resetInjection(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/core.js b/packages/f-theme-editor/farris-theme-editor/js/localization/core.js new file mode 100644 index 0000000000000000000000000000000000000000..0d096f183a46bd21eb46d12f8a3cfcea7ae45d15 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/core.js @@ -0,0 +1,41 @@ +import dependencyInjector from '../core/utils/dependency_injector'; +import parentLocales from './cldr-data/parent_locales'; +import getParentLocale from './parentLocale'; + +const DEFAULT_LOCALE = 'en'; + +export default dependencyInjector({ + locale: (() => { + let currentLocale = DEFAULT_LOCALE; + + return locale => { + if(!locale) { + return currentLocale; + } + + currentLocale = locale; + }; + })(), + + getValueByClosestLocale: function(getter) { + let locale = this.locale(); + let value = getter(locale); + let isRootLocale; + + while(!value && !isRootLocale) { + locale = getParentLocale(parentLocales, locale); + + if(locale) { + value = getter(locale); + } else { + isRootLocale = true; + } + } + + if(value === undefined && locale !== DEFAULT_LOCALE) { + return getter(DEFAULT_LOCALE); + } + + return value; + } +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/currency.js b/packages/f-theme-editor/farris-theme-editor/js/localization/currency.js new file mode 100644 index 0000000000000000000000000000000000000000..b469b714666ced55bc4506221e025798f26f5cf8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/currency.js @@ -0,0 +1,24 @@ +import { extend } from '../core/utils/extend'; + +export default { + _formatNumberCore: function(value, format, formatConfig) { + if(format === 'currency') { + formatConfig.precision = formatConfig.precision || 0; + + let result = this.format(value, extend({}, formatConfig, { type: 'fixedpoint' })); + const currencyPart = this.getCurrencySymbol().symbol.replace(/\$/g, '$$$$'); + + result = result.replace(/^(\D*)(\d.*)/, '$1' + currencyPart + '$2'); + + return result; + } + + return this.callBase.apply(this, arguments); + }, + getCurrencySymbol: function() { + return { symbol: '$' }; + }, + getOpenXmlCurrencyFormat: function() { + return '$#,##0{0}_);\\($#,##0{0}\\)'; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/date.d.ts b/packages/f-theme-editor/farris-theme-editor/js/localization/date.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..8668641dfbc32697230bc6a8b3c84fcd2175c072 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/date.d.ts @@ -0,0 +1,12 @@ +import { Format as LocalizationFormat } from '../localization'; + +type Format = 'abbreviated' | 'short' | 'narrow'; + +interface DateLocalization { + firstDayOfWeekIndex(): number; + format(date?: Date, format?: LocalizationFormat): string | Date | undefined; + getDayNames(format?: Format): string[]; + getMonthNames(format?: Format): string[]; +} +declare const dateLocalization: DateLocalization; +export default dateLocalization; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/date.js b/packages/f-theme-editor/farris-theme-editor/js/localization/date.js new file mode 100644 index 0000000000000000000000000000000000000000..91412e5934aa3106722ad41b8d57003e9f60e781 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/date.js @@ -0,0 +1,197 @@ +import dependencyInjector from '../core/utils/dependency_injector'; +import { isString } from '../core/utils/type'; +import { each } from '../core/utils/iterator'; +import { inArray } from '../core/utils/array'; +import errors from '../core/errors'; +import { getFormatter as getLDMLDateFormatter } from './ldml/date.formatter'; +import { getFormat as getLDMLDateFormat } from './ldml/date.format'; +import { getParser as getLDMLDateParser } from './ldml/date.parser'; +import defaultDateNames from './default_date_names'; +import firstDayOfWeekData from './cldr-data/first_day_of_week_data'; +import localizationCore from './core'; +import numberLocalization from './number'; +import intlDateLocalization from './intl/date'; + +const DEFAULT_DAY_OF_WEEK_INDEX = 0; +const hasIntl = typeof Intl !== 'undefined'; + +const FORMATS_TO_PATTERN_MAP = { + 'shortdate': 'M/d/y', + 'shorttime': 'h:mm a', + 'longdate': 'EEEE, MMMM d, y', + 'longtime': 'h:mm:ss a', + 'monthandday': 'MMMM d', + 'monthandyear': 'MMMM y', + 'quarterandyear': 'QQQ y', + 'day': 'd', + 'year': 'y', + 'shortdateshorttime': 'M/d/y, h:mm a', + 'longdatelongtime': 'EEEE, MMMM d, y, h:mm:ss a', + 'month': 'LLLL', + 'shortyear': 'yy', + 'dayofweek': 'EEEE', + 'quarter': 'QQQ', + 'hour': 'HH', + 'minute': 'mm', + 'second': 'ss', + 'millisecond': 'SSS', + 'datetime-local': 'yyyy-MM-ddTHH\':\'mm\':\'ss' +}; + +const possiblePartPatterns = { + year: ['y', 'yy', 'yyyy'], + day: ['d', 'dd'], + month: ['M', 'MM', 'MMM', 'MMMM'], + hours: ['H', 'HH', 'h', 'hh', 'ah'], + minutes: ['m', 'mm'], + seconds: ['s', 'ss'], + milliseconds: ['S', 'SS', 'SSS'] +}; + +const dateLocalization = dependencyInjector({ + engine: function() { + return 'base'; + }, + _getPatternByFormat: function(format) { + return FORMATS_TO_PATTERN_MAP[format.toLowerCase()]; + }, + _expandPattern: function(pattern) { + return this._getPatternByFormat(pattern) || pattern; + }, + formatUsesMonthName: function(format) { + return this._expandPattern(format).indexOf('MMMM') !== -1; + }, + + formatUsesDayName: function(format) { + return this._expandPattern(format).indexOf('EEEE') !== -1; + }, + getFormatParts: function(format) { + const pattern = this._getPatternByFormat(format) || format; + const result = []; + + each(pattern.split(/\W+/), (_, formatPart) => { + each(possiblePartPatterns, (partName, possiblePatterns) => { + if(inArray(formatPart, possiblePatterns) > -1) { + result.push(partName); + } + }); + }); + + return result; + }, + getMonthNames: function(format) { + return defaultDateNames.getMonthNames(format); + }, + getDayNames: function(format) { + return defaultDateNames.getDayNames(format); + }, + getQuarterNames: function(format) { + return defaultDateNames.getQuarterNames(format); + }, + getPeriodNames: function(format) { + return defaultDateNames.getPeriodNames(format); + }, + getTimeSeparator: function() { + return ':'; + }, + + is24HourFormat: function(format) { + const amTime = new Date(2017, 0, 20, 11, 0, 0, 0); + const pmTime = new Date(2017, 0, 20, 23, 0, 0, 0); + const amTimeFormatted = this.format(amTime, format); + const pmTimeFormatted = this.format(pmTime, format); + + for(let i = 0; i < amTimeFormatted.length; i++) { + if(amTimeFormatted[i] !== pmTimeFormatted[i]) { + return !isNaN(parseInt(amTimeFormatted[i])); + } + } + }, + + format: function(date, format) { + if(!date) { + return; + } + + if(!format) { + return date; + } + + let formatter; + + if(typeof (format) === 'function') { + formatter = format; + } else if(format.formatter) { + formatter = format.formatter; + } else { + format = format.type || format; + if(isString(format)) { + format = FORMATS_TO_PATTERN_MAP[format.toLowerCase()] || format; + return numberLocalization.convertDigits(getLDMLDateFormatter(format, this)(date)); + } + } + + if(!formatter) { + // TODO: log warning or error + return; + } + + return formatter(date); + }, + + parse: function(text, format) { + const that = this; + let ldmlFormat; + let formatter; + + if(!text) { + return; + } + + if(!format) { + return this.parse(text, 'shortdate'); + } + + if(format.parser) { + return format.parser(text); + } + + if(typeof format === 'string' && !FORMATS_TO_PATTERN_MAP[format.toLowerCase()]) { + ldmlFormat = format; + } else { + formatter = value => { + const text = that.format(value, format); + return numberLocalization.convertDigits(text, true); + }; + try { + ldmlFormat = getLDMLDateFormat(formatter); + } catch(e) {} + } + + if(ldmlFormat) { + text = numberLocalization.convertDigits(text, true); + return getLDMLDateParser(ldmlFormat, this)(text); + } + + errors.log('W0012'); + const result = new Date(text); + + if(!result || isNaN(result.getTime())) { + return; + } + + return result; + }, + + firstDayOfWeekIndex: function() { + const index = localizationCore.getValueByClosestLocale((locale) => firstDayOfWeekData[locale]); + + return index === undefined ? DEFAULT_DAY_OF_WEEK_INDEX : index; + } +}); + +if(hasIntl) { + dateLocalization.inject(intlDateLocalization); +} + +export default dateLocalization; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/default_date_names.js b/packages/f-theme-editor/farris-theme-editor/js/localization/default_date_names.js new file mode 100644 index 0000000000000000000000000000000000000000..85bbdaf91feee44ccf03bf01be0455e1402b18ff --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/default_date_names.js @@ -0,0 +1,34 @@ +import { map } from '../core/utils/iterator'; + +const MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; +const DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; +const PERIODS = ['AM', 'PM']; +const QUARTERS = ['Q1', 'Q2', 'Q3', 'Q4']; + +// TODO: optimize +const cutCaptions = (captions, format) => { + const lengthByFormat = { + abbreviated: 3, + short: 2, + narrow: 1 + }; + + return map(captions, caption => { + return caption.substr(0, lengthByFormat[format]); + }); +}; + +export default { + getMonthNames: function(format) { + return cutCaptions(MONTHS, format); + }, + getDayNames: function(format) { + return cutCaptions(DAYS, format); + }, + getQuarterNames: function(format) { + return QUARTERS; + }, + getPeriodNames: function(format) { + return PERIODS; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/core.js b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/core.js new file mode 100644 index 0000000000000000000000000000000000000000..514a36ad0eb86efe785f54f65168ad9b7fa5272b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/core.js @@ -0,0 +1,35 @@ +// eslint-disable-next-line no-restricted-imports +import Globalize from 'globalize'; +import coreLocalization from '../core'; + +if(Globalize && Globalize.load) { + const likelySubtags = { + 'supplemental': { + 'version': { + '_cldrVersion': '28', + '_unicodeVersion': '8.0.0', + '_number': '$Revision: 11965 $' + }, + 'likelySubtags': { + 'en': 'en-Latn-US', + 'de': 'de-Latn-DE', + 'ru': 'ru-Cyrl-RU', + 'ja': 'ja-Jpan-JP' + } + } + }; + + if(!Globalize.locale()) { + Globalize.load(likelySubtags); + Globalize.locale('en'); + } + + coreLocalization.inject({ + locale: function(locale) { + if(!locale) { + return Globalize.locale().locale; + } + Globalize.locale(locale); + } + }); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/currency.js b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/currency.js new file mode 100644 index 0000000000000000000000000000000000000000..c92a17ed24ed9b25c668496141d657f7843c5238 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/currency.js @@ -0,0 +1,141 @@ +import openXmlCurrencyFormat from '../open_xml_currency_format'; +import './core'; +import './number'; +import '../currency'; +// eslint-disable-next-line no-restricted-imports +import 'globalize/currency'; + +const enCurrencyUSD = { + 'main': { + 'en': { + 'identity': { + 'version': { + '_cldrVersion': '28', + '_number': '$Revision: 11972 $' + }, + 'language': 'en' + }, + 'numbers': { + 'currencies': { + 'USD': { + 'displayName': 'US Dollar', + 'displayName-count-one': 'US dollar', + 'displayName-count-other': 'US dollars', + 'symbol': '$', + 'symbol-alt-narrow': '$' + } + } + } + } + } +}; + +const currencyData = { + 'supplemental': { + 'version': { + '_cldrVersion': '28', + '_unicodeVersion': '8.0.0', + '_number': '$Revision: 11969 $' + }, + 'currencyData': { + 'fractions': { + 'DEFAULT': { + '_rounding': '0', + '_digits': '2' + } + } + } + } +}; + +// eslint-disable-next-line no-restricted-imports +import Globalize from 'globalize'; +import config from '../../core/config'; +import numberLocalization from '../number'; + +if(Globalize && Globalize.formatCurrency) { + + if(Globalize.locale().locale === 'en') { + Globalize.load( + enCurrencyUSD, + currencyData + ); + + Globalize.locale('en'); + } + + const formattersCache = {}; + + const getFormatter = (currency, format) => { + let formatter; + let formatCacheKey; + + if(typeof format === 'object') { + formatCacheKey = Globalize.locale().locale + ':' + currency + ':' + JSON.stringify(format); + } else { + formatCacheKey = Globalize.locale().locale + ':' + currency + ':' + format; + } + formatter = formattersCache[formatCacheKey]; + if(!formatter) { + formatter = formattersCache[formatCacheKey] = Globalize.currencyFormatter(currency, format); + } + + return formatter; + }; + + const globalizeCurrencyLocalization = { + _formatNumberCore: function(value, format, formatConfig) { + if(format === 'currency') { + const currency = formatConfig && formatConfig.currency || config().defaultCurrency; + return getFormatter(currency, this._normalizeFormatConfig(format, formatConfig, value))(value); + } + + return this.callBase.apply(this, arguments); + }, + _normalizeFormatConfig: function(format, formatConfig, value) { + const config = this.callBase(format, formatConfig, value); + + if(format === 'currency') { + config.style = 'accounting'; + } + + return config; + }, + format: function(value, format) { + if(typeof value !== 'number') { + return value; + } + + format = this._normalizeFormat(format); + + if(format) { + if(format.currency === 'default') { + format.currency = config().defaultCurrency; + } + + if(format.type === 'currency') { + return this._formatNumber(value, this._parseNumberFormatString('currency'), format); + } else if(!format.type && format.currency) { + return getFormatter(format.currency, format)(value); + } + } + + return this.callBase.apply(this, arguments); + }, + getCurrencySymbol: function(currency) { + if(!currency) { + currency = config().defaultCurrency; + } + + return Globalize.cldr.main('numbers/currencies/' + currency); + }, + getOpenXmlCurrencyFormat: function(currency) { + const currencySymbol = this.getCurrencySymbol(currency).symbol; + const accountingFormat = Globalize.cldr.main('numbers/currencyFormats-numberSystem-latn').accounting; + + return openXmlCurrencyFormat(currencySymbol, accountingFormat); + } + }; + + numberLocalization.inject(globalizeCurrencyLocalization); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/date.js b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/date.js new file mode 100644 index 0000000000000000000000000000000000000000..f4e0ce026134b4ea84f0e721a4d06cea9f9b092b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/date.js @@ -0,0 +1,806 @@ +import './core'; +import './number'; +// eslint-disable-next-line no-restricted-imports +import 'globalize/date'; + +const timeData = { + 'supplemental': { + 'version': { + '_cldrVersion': '28', + '_unicodeVersion': '8.0.0', + '_number': '$Revision: 11969 $' + }, + 'timeData': { + '001': { + '_allowed': 'H h', + '_preferred': 'H' + }, + 'DE': { + '_allowed': 'H', + '_preferred': 'H' + }, + 'JP': { + '_allowed': 'H K h', + '_preferred': 'H' + }, + 'RU': { + '_allowed': 'H', + '_preferred': 'H' + }, + 'US': { + '_allowed': 'H h', + '_preferred': 'h' + } + } + } +}; + +const enCaGregorian = { + 'main': { + 'en': { + 'identity': { + 'version': { + '_cldrVersion': '28', + '_number': '$Revision: 11972 $' + }, + 'language': 'en' + }, + 'dates': { + 'calendars': { + 'gregorian': { + 'months': { + 'format': { + 'abbreviated': { + '1': 'Jan', + '2': 'Feb', + '3': 'Mar', + '4': 'Apr', + '5': 'May', + '6': 'Jun', + '7': 'Jul', + '8': 'Aug', + '9': 'Sep', + '10': 'Oct', + '11': 'Nov', + '12': 'Dec' + }, + 'narrow': { + '1': 'J', + '2': 'F', + '3': 'M', + '4': 'A', + '5': 'M', + '6': 'J', + '7': 'J', + '8': 'A', + '9': 'S', + '10': 'O', + '11': 'N', + '12': 'D' + }, + 'wide': { + '1': 'January', + '2': 'February', + '3': 'March', + '4': 'April', + '5': 'May', + '6': 'June', + '7': 'July', + '8': 'August', + '9': 'September', + '10': 'October', + '11': 'November', + '12': 'December' + } + }, + 'stand-alone': { + 'abbreviated': { + '1': 'Jan', + '2': 'Feb', + '3': 'Mar', + '4': 'Apr', + '5': 'May', + '6': 'Jun', + '7': 'Jul', + '8': 'Aug', + '9': 'Sep', + '10': 'Oct', + '11': 'Nov', + '12': 'Dec' + }, + 'narrow': { + '1': 'J', + '2': 'F', + '3': 'M', + '4': 'A', + '5': 'M', + '6': 'J', + '7': 'J', + '8': 'A', + '9': 'S', + '10': 'O', + '11': 'N', + '12': 'D' + }, + 'wide': { + '1': 'January', + '2': 'February', + '3': 'March', + '4': 'April', + '5': 'May', + '6': 'June', + '7': 'July', + '8': 'August', + '9': 'September', + '10': 'October', + '11': 'November', + '12': 'December' + } + } + }, + 'days': { + 'format': { + 'abbreviated': { + 'sun': 'Sun', + 'mon': 'Mon', + 'tue': 'Tue', + 'wed': 'Wed', + 'thu': 'Thu', + 'fri': 'Fri', + 'sat': 'Sat' + }, + 'narrow': { + 'sun': 'S', + 'mon': 'M', + 'tue': 'T', + 'wed': 'W', + 'thu': 'T', + 'fri': 'F', + 'sat': 'S' + }, + 'short': { + 'sun': 'Su', + 'mon': 'Mo', + 'tue': 'Tu', + 'wed': 'We', + 'thu': 'Th', + 'fri': 'Fr', + 'sat': 'Sa' + }, + 'wide': { + 'sun': 'Sunday', + 'mon': 'Monday', + 'tue': 'Tuesday', + 'wed': 'Wednesday', + 'thu': 'Thursday', + 'fri': 'Friday', + 'sat': 'Saturday' + } + }, + 'stand-alone': { + 'abbreviated': { + 'sun': 'Sun', + 'mon': 'Mon', + 'tue': 'Tue', + 'wed': 'Wed', + 'thu': 'Thu', + 'fri': 'Fri', + 'sat': 'Sat' + }, + 'narrow': { + 'sun': 'S', + 'mon': 'M', + 'tue': 'T', + 'wed': 'W', + 'thu': 'T', + 'fri': 'F', + 'sat': 'S' + }, + 'short': { + 'sun': 'Su', + 'mon': 'Mo', + 'tue': 'Tu', + 'wed': 'We', + 'thu': 'Th', + 'fri': 'Fr', + 'sat': 'Sa' + }, + 'wide': { + 'sun': 'Sunday', + 'mon': 'Monday', + 'tue': 'Tuesday', + 'wed': 'Wednesday', + 'thu': 'Thursday', + 'fri': 'Friday', + 'sat': 'Saturday' + } + } + }, + 'quarters': { + 'format': { + 'abbreviated': { + '1': 'Q1', + '2': 'Q2', + '3': 'Q3', + '4': 'Q4' + }, + 'narrow': { + '1': '1', + '2': '2', + '3': '3', + '4': '4' + }, + 'wide': { + '1': '1st quarter', + '2': '2nd quarter', + '3': '3rd quarter', + '4': '4th quarter' + } + }, + 'stand-alone': { + 'abbreviated': { + '1': 'Q1', + '2': 'Q2', + '3': 'Q3', + '4': 'Q4' + }, + 'narrow': { + '1': '1', + '2': '2', + '3': '3', + '4': '4' + }, + 'wide': { + '1': '1st quarter', + '2': '2nd quarter', + '3': '3rd quarter', + '4': '4th quarter' + } + } + }, + 'dayPeriods': { + 'format': { + 'abbreviated': { + 'midnight': 'midnight', + 'am': 'AM', + 'am-alt-variant': 'am', + 'noon': 'noon', + 'pm': 'PM', + 'pm-alt-variant': 'pm', + 'morning1': 'in the morning', + 'afternoon1': 'in the afternoon', + 'evening1': 'in the evening', + 'night1': 'at night' + }, + 'narrow': { + 'midnight': 'mi', + 'am': 'a', + 'am-alt-variant': 'am', + 'noon': 'n', + 'pm': 'p', + 'pm-alt-variant': 'pm', + 'morning1': 'in the morning', + 'afternoon1': 'in the afternoon', + 'evening1': 'in the evening', + 'night1': 'at night' + }, + 'wide': { + 'midnight': 'midnight', + 'am': 'AM', + 'am-alt-variant': 'am', + 'noon': 'noon', + 'pm': 'PM', + 'pm-alt-variant': 'pm', + 'morning1': 'in the morning', + 'afternoon1': 'in the afternoon', + 'evening1': 'in the evening', + 'night1': 'at night' + } + }, + 'stand-alone': { + 'abbreviated': { + 'midnight': 'midnight', + 'am': 'AM', + 'am-alt-variant': 'am', + 'noon': 'noon', + 'pm': 'PM', + 'pm-alt-variant': 'pm', + 'morning1': 'in the morning', + 'afternoon1': 'in the afternoon', + 'evening1': 'in the evening', + 'night1': 'at night' + }, + 'narrow': { + 'midnight': 'midnight', + 'am': 'AM', + 'am-alt-variant': 'am', + 'noon': 'noon', + 'pm': 'PM', + 'pm-alt-variant': 'pm', + 'morning1': 'in the morning', + 'afternoon1': 'in the afternoon', + 'evening1': 'in the evening', + 'night1': 'at night' + }, + 'wide': { + 'midnight': 'midnight', + 'am': 'AM', + 'am-alt-variant': 'am', + 'noon': 'noon', + 'pm': 'PM', + 'pm-alt-variant': 'pm', + 'morning1': 'morning', + 'afternoon1': 'afternoon', + 'evening1': 'evening', + 'night1': 'night' + } + } + }, + 'eras': { + 'eraNames': { + '0': 'Before Christ', + '0-alt-variant': 'Before Common Era', + '1': 'Anno Domini', + '1-alt-variant': 'Common Era' + }, + 'eraAbbr': { + '0': 'BC', + '0-alt-variant': 'BCE', + '1': 'AD', + '1-alt-variant': 'CE' + }, + 'eraNarrow': { + '0': 'B', + '0-alt-variant': 'BCE', + '1': 'A', + '1-alt-variant': 'CE' + } + }, + 'dateFormats': { + 'full': 'EEEE, MMMM d, y', + 'long': 'MMMM d, y', + 'medium': 'MMM d, y', + 'short': 'M/d/yy' + }, + 'timeFormats': { + 'full': 'h:mm:ss a zzzz', + 'long': 'h:mm:ss a z', + 'medium': 'h:mm:ss a', + 'short': 'h:mm a' + }, + 'dateTimeFormats': { + 'full': '{1} \'at\' {0}', + 'long': '{1} \'at\' {0}', + 'medium': '{1}, {0}', + 'short': '{1}, {0}', + 'availableFormats': { + 'd': 'd', + 'E': 'ccc', + 'Ed': 'd E', + 'Ehm': 'E h:mm a', + 'EHm': 'E HH:mm', + 'Ehms': 'E h:mm:ss a', + 'EHms': 'E HH:mm:ss', + 'Gy': 'y G', + 'GyMMM': 'MMM y G', + 'GyMMMd': 'MMM d, y G', + 'GyMMMEd': 'E, MMM d, y G', + 'h': 'h a', + 'H': 'HH', + 'hm': 'h:mm a', + 'Hm': 'HH:mm', + 'hms': 'h:mm:ss a', + 'Hms': 'HH:mm:ss', + 'hmsv': 'h:mm:ss a v', + 'Hmsv': 'HH:mm:ss v', + 'hmv': 'h:mm a v', + 'Hmv': 'HH:mm v', + 'M': 'L', + 'Md': 'M/d', + 'MEd': 'E, M/d', + 'MMM': 'LLL', + 'MMMd': 'MMM d', + 'MMMEd': 'E, MMM d', + 'MMMMd': 'MMMM d', + 'ms': 'mm:ss', + 'y': 'y', + 'yM': 'M/y', + 'yMd': 'M/d/y', + 'yMEd': 'E, M/d/y', + 'yMMM': 'MMM y', + 'yMMMd': 'MMM d, y', + 'yMMMEd': 'E, MMM d, y', + 'yMMMM': 'MMMM y', + 'yQQQ': 'QQQ y', + 'yQQQQ': 'QQQQ y' + }, + 'appendItems': { + 'Day': '{0} ({2}: {1})', + 'Day-Of-Week': '{0} {1}', + 'Era': '{0} {1}', + 'Hour': '{0} ({2}: {1})', + 'Minute': '{0} ({2}: {1})', + 'Month': '{0} ({2}: {1})', + 'Quarter': '{0} ({2}: {1})', + 'Second': '{0} ({2}: {1})', + 'Timezone': '{0} {1}', + 'Week': '{0} ({2}: {1})', + 'Year': '{0} {1}' + }, + 'intervalFormats': { + 'intervalFormatFallback': '{0} – {1}', + 'd': { + 'd': 'd – d' + }, + 'h': { + 'a': 'h a – h a', + 'h': 'h – h a' + }, + 'H': { + 'H': 'HH – HH' + }, + 'hm': { + 'a': 'h:mm a – h:mm a', + 'h': 'h:mm – h:mm a', + 'm': 'h:mm – h:mm a' + }, + 'Hm': { + 'H': 'HH:mm – HH:mm', + 'm': 'HH:mm – HH:mm' + }, + 'hmv': { + 'a': 'h:mm a – h:mm a v', + 'h': 'h:mm – h:mm a v', + 'm': 'h:mm – h:mm a v' + }, + 'Hmv': { + 'H': 'HH:mm – HH:mm v', + 'm': 'HH:mm – HH:mm v' + }, + 'hv': { + 'a': 'h a – h a v', + 'h': 'h – h a v' + }, + 'Hv': { + 'H': 'HH – HH v' + }, + 'M': { + 'M': 'M – M' + }, + 'Md': { + 'd': 'M/d – M/d', + 'M': 'M/d – M/d' + }, + 'MEd': { + 'd': 'E, M/d – E, M/d', + 'M': 'E, M/d – E, M/d' + }, + 'MMM': { + 'M': 'MMM – MMM' + }, + 'MMMd': { + 'd': 'MMM d – d', + 'M': 'MMM d – MMM d' + }, + 'MMMEd': { + 'd': 'E, MMM d – E, MMM d', + 'M': 'E, MMM d – E, MMM d' + }, + 'y': { + 'y': 'y – y' + }, + 'yM': { + 'M': 'M/y – M/y', + 'y': 'M/y – M/y' + }, + 'yMd': { + 'd': 'M/d/y – M/d/y', + 'M': 'M/d/y – M/d/y', + 'y': 'M/d/y – M/d/y' + }, + 'yMEd': { + 'd': 'E, M/d/y – E, M/d/y', + 'M': 'E, M/d/y – E, M/d/y', + 'y': 'E, M/d/y – E, M/d/y' + }, + 'yMMM': { + 'M': 'MMM – MMM y', + 'y': 'MMM y – MMM y' + }, + 'yMMMd': { + 'd': 'MMM d – d, y', + 'M': 'MMM d – MMM d, y', + 'y': 'MMM d, y – MMM d, y' + }, + 'yMMMEd': { + 'd': 'E, MMM d – E, MMM d, y', + 'M': 'E, MMM d – E, MMM d, y', + 'y': 'E, MMM d, y – E, MMM d, y' + }, + 'yMMMM': { + 'M': 'MMMM – MMMM y', + 'y': 'MMMM y – MMMM y' + } + } + } + } + } + } + } + } +}; + +const weekData = { + 'supplemental': { + 'version': { + '_cldrVersion': '28', + '_unicodeVersion': '8.0.0', + '_number': '$Revision: 11969 $' + }, + 'weekData': { + 'minDays': { + '001': '1', + 'US': '1', + 'DE': '4' + }, + 'firstDay': { + '001': 'mon', + 'DE': 'mon', + 'RU': 'mon', + 'JP': 'sun', + 'US': 'sun' + }, + 'weekendStart': { + '001': 'sat' + }, + 'weekendEnd': { + '001': 'sun' + } + } + } +}; + +const ACCEPTABLE_JSON_FORMAT_PROPERTIES = ['skeleton', 'date', 'time', 'datetime', 'raw']; +const RTL_MARKS_REGEX = /[\u200E\u200F]/g; + +// eslint-disable-next-line no-restricted-imports +import Globalize from 'globalize'; +import dateLocalization from '../date'; +import { isObject } from '../../core/utils/type'; +import { inArray } from '../../core/utils/array'; +import * as iteratorUtils from '../../core/utils/iterator'; + +if(Globalize && Globalize.formatDate) { + + if(Globalize.locale().locale === 'en') { + Globalize.load( + weekData, + timeData, + enCaGregorian + ); + + Globalize.locale('en'); + } + + const formattersCache = {}; + + const FORMATS_TO_GLOBALIZE_MAP = { + 'shortdate': { + path: 'dateTimeFormats/availableFormats/yMd' + }, + 'shorttime': { + path: 'timeFormats/short' + }, + 'longdate': { + path: 'dateFormats/full' + }, + 'longtime': { + path: 'timeFormats/medium' + }, + 'monthandday': { + path: 'dateTimeFormats/availableFormats/MMMMd' + }, + 'monthandyear': { + path: 'dateTimeFormats/availableFormats/yMMMM' + }, + 'quarterandyear': { + path: 'dateTimeFormats/availableFormats/yQQQ' + }, + 'day': { + path: 'dateTimeFormats/availableFormats/d' + }, + 'year': { + path: 'dateTimeFormats/availableFormats/y' + }, + 'shortdateshorttime': { + path: 'dateTimeFormats/short', + parts: ['shorttime', 'shortdate'] + }, + 'longdatelongtime': { + path: 'dateTimeFormats/medium', + parts: ['longtime', 'longdate'] + }, + 'month': { + pattern: 'LLLL' + }, + 'shortyear': { + pattern: 'yy' + }, + 'dayofweek': { + pattern: 'EEEE' + }, + 'quarter': { + pattern: 'QQQ' + }, + 'millisecond': { + pattern: 'SSS' + }, + 'hour': { + pattern: 'HH' + }, + 'minute': { + pattern: 'mm' + }, + 'second': { + pattern: 'ss' + } + }; + + const globalizeDateLocalization = { + engine: function() { + return 'globalize'; + }, + + _getPatternByFormat: function(format) { + const that = this; + const lowerFormat = format.toLowerCase(); + const globalizeFormat = FORMATS_TO_GLOBALIZE_MAP[lowerFormat]; + + if(lowerFormat === 'datetime-local') { + return 'yyyy-MM-ddTHH\':\'mm\':\'ss'; + } + + if(!globalizeFormat) { + return; + } + + let result = globalizeFormat.path && that._getFormatStringByPath(globalizeFormat.path) || globalizeFormat.pattern; + + if(globalizeFormat.parts) { + iteratorUtils.each(globalizeFormat.parts, (index, part) => { + result = result.replace('{' + index + '}', that._getPatternByFormat(part)); + }); + } + return result; + }, + + _getFormatStringByPath: function(path) { + return Globalize.locale().main('dates/calendars/gregorian/' + path); + }, + + getPeriodNames: function() { + const json = Globalize.locale().main('dates/calendars/gregorian/dayPeriods/stand-alone/wide'); + return [json['am'], json['pm']]; + }, + + getMonthNames: function(format, type) { + const months = Globalize.locale().main('dates/calendars/gregorian/months/' + (type === 'format' ? type : 'stand-alone') + '/' + (format || 'wide')); + + return iteratorUtils.map(months, month => { return month; }); + }, + + getDayNames: function(format) { + const days = Globalize.locale().main('dates/calendars/gregorian/days/stand-alone/' + (format || 'wide')); + + return iteratorUtils.map(days, day => { return day; }); + }, + + getTimeSeparator: function() { + return Globalize.locale().main('numbers/symbols-numberSystem-latn/timeSeparator'); + }, + + removeRtlMarks(text) { + return text.replace(RTL_MARKS_REGEX, ''); + }, + + format: function(date, format) { + if(!date) { + return; + } + + if(!format) { + return date; + } + + let formatter; + let formatCacheKey; + + if(typeof (format) === 'function') { + return format(date); + } + + if(format.formatter) { + return format.formatter(date); + } + + format = format.type || format; + + if(typeof format === 'string') { + formatCacheKey = Globalize.locale().locale + ':' + format; + formatter = formattersCache[formatCacheKey]; + if(!formatter) { + format = { + raw: this._getPatternByFormat(format) || format + }; + + formatter = formattersCache[formatCacheKey] = Globalize.dateFormatter(format); + } + } else { + if(!this._isAcceptableFormat(format)) { + return; + } + + formatter = Globalize.dateFormatter(format); + } + + return this.removeRtlMarks(formatter(date)); + }, + + parse: function(text, format) { + if(!text) { + return; + } + + if(!format || typeof (format) === 'function' || isObject(format) && !this._isAcceptableFormat(format)) { + if(format) { + const parsedValue = this.callBase(text, format); + if(parsedValue) { + return parsedValue; + } + } + + return Globalize.parseDate(text); + } + + if(format.parser) { + return format.parser(text); + } + + if(typeof format === 'string') { + format = { + raw: this._getPatternByFormat(format) || format + }; + } + + const parsedDate = Globalize.parseDate(text, format); + return parsedDate ? parsedDate : this.callBase(text, format); + }, + + _isAcceptableFormat: function(format) { + if(format.parser) { + return true; + } + + for(let i = 0; i < ACCEPTABLE_JSON_FORMAT_PROPERTIES.length; i++) { + if(Object.prototype.hasOwnProperty.call(format, ACCEPTABLE_JSON_FORMAT_PROPERTIES[i])) { + return true; + } + } + }, + + firstDayOfWeekIndex: function() { + const firstDay = Globalize.locale().supplemental.weekData.firstDay(); + + return inArray(firstDay, this._getDayKeys()); + }, + + _getDayKeys: function() { + const days = Globalize.locale().main('dates/calendars/gregorian/days/format/short'); + + return iteratorUtils.map(days, (day, key) => { return key; }); + } + }; + + dateLocalization.resetInjection(); + dateLocalization.inject(globalizeDateLocalization); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/message.js b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/message.js new file mode 100644 index 0000000000000000000000000000000000000000..a1aee22fb7d641bbfebcba3585fa110ea819d03e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/message.js @@ -0,0 +1,83 @@ +import './core'; + +// eslint-disable-next-line no-restricted-imports +import Globalize from 'globalize'; +import messageLocalization from '../message'; +import coreLocalization from '../core'; + +// eslint-disable-next-line no-restricted-imports +import 'globalize/message'; + +if(Globalize && Globalize.formatMessage) { + + const DEFAULT_LOCALE = 'en'; + + const originalLoadMessages = Globalize.loadMessages; + + Globalize.loadMessages = messages => { + messageLocalization.load(messages); + }; + + const globalizeMessageLocalization = { + engine: function() { + return 'globalize'; + }, + + ctor: function() { + this.load(this._dictionary); + }, + + load: function(messages) { + this.callBase(messages); + originalLoadMessages(messages); + }, + + getMessagesByLocales: function() { + return Globalize.cldr.get('globalize-messages'); + }, + + getFormatter: function(key, locale) { + const currentLocale = locale || coreLocalization.locale(); + let formatter = this._getFormatterBase(key, locale); + + if(!formatter) { + formatter = this._formatterByGlobalize(key, locale); + } + + if(!formatter && currentLocale !== DEFAULT_LOCALE) { + formatter = this.getFormatter(key, DEFAULT_LOCALE); + } + + return formatter; + }, + + _formatterByGlobalize: function(key, locale) { + const currentGlobalize = !locale || locale === coreLocalization.locale() ? Globalize : new Globalize(locale); + let result; + + if(this._messageLoaded(key, locale)) { + result = currentGlobalize.messageFormatter(key); + } + + return result; + }, + + _messageLoaded: function(key, locale) { + const currentCldr = locale ? new Globalize(locale).cldr : Globalize.locale(); + const value = currentCldr.get(['globalize-messages/{bundle}', key]); + + return !!value; + }, + + _loadSingle: function(key, value, locale) { + const data = {}; + + data[locale] = {}; + data[locale][key] = value; + + this.load(data); + } + }; + + messageLocalization.inject(globalizeMessageLocalization); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/number.js b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/number.js new file mode 100644 index 0000000000000000000000000000000000000000..acd42d62fc90d8156523a0c4f571ac6adc9b8f16 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/globalize/number.js @@ -0,0 +1,276 @@ +import './core'; +// eslint-disable-next-line no-restricted-imports +import Globalize from 'globalize'; +import numberLocalization from '../number'; +import errors from '../../core/errors'; +// eslint-disable-next-line no-restricted-imports +import 'globalize/number'; + +if(Globalize && Globalize.formatNumber) { + + const enNumbers = { + 'main': { + 'en': { + 'identity': { + 'version': { + '_cldrVersion': '28', + '_number': '$Revision: 11972 $' + }, + 'language': 'en' + }, + 'numbers': { + 'defaultNumberingSystem': 'latn', + 'otherNumberingSystems': { + 'native': 'latn' + }, + 'minimumGroupingDigits': '1', + 'symbols-numberSystem-latn': { + 'decimal': '.', + 'group': ',', + 'list': ';', + 'percentSign': '%', + 'plusSign': '+', + 'minusSign': '-', + 'exponential': 'E', + 'superscriptingExponent': '×', + 'perMille': '‰', + 'infinity': '∞', + 'nan': 'NaN', + 'timeSeparator': ':' + }, + 'decimalFormats-numberSystem-latn': { + 'standard': '#,##0.###', + 'long': { + 'decimalFormat': { + '1000-count-one': '0 thousand', + '1000-count-other': '0 thousand', + '10000-count-one': '00 thousand', + '10000-count-other': '00 thousand', + '100000-count-one': '000 thousand', + '100000-count-other': '000 thousand', + '1000000-count-one': '0 million', + '1000000-count-other': '0 million', + '10000000-count-one': '00 million', + '10000000-count-other': '00 million', + '100000000-count-one': '000 million', + '100000000-count-other': '000 million', + '1000000000-count-one': '0 billion', + '1000000000-count-other': '0 billion', + '10000000000-count-one': '00 billion', + '10000000000-count-other': '00 billion', + '100000000000-count-one': '000 billion', + '100000000000-count-other': '000 billion', + '1000000000000-count-one': '0 trillion', + '1000000000000-count-other': '0 trillion', + '10000000000000-count-one': '00 trillion', + '10000000000000-count-other': '00 trillion', + '100000000000000-count-one': '000 trillion', + '100000000000000-count-other': '000 trillion' + } + }, + 'short': { + 'decimalFormat': { + '1000-count-one': '0K', + '1000-count-other': '0K', + '10000-count-one': '00K', + '10000-count-other': '00K', + '100000-count-one': '000K', + '100000-count-other': '000K', + '1000000-count-one': '0M', + '1000000-count-other': '0M', + '10000000-count-one': '00M', + '10000000-count-other': '00M', + '100000000-count-one': '000M', + '100000000-count-other': '000M', + '1000000000-count-one': '0B', + '1000000000-count-other': '0B', + '10000000000-count-one': '00B', + '10000000000-count-other': '00B', + '100000000000-count-one': '000B', + '100000000000-count-other': '000B', + '1000000000000-count-one': '0T', + '1000000000000-count-other': '0T', + '10000000000000-count-one': '00T', + '10000000000000-count-other': '00T', + '100000000000000-count-one': '000T', + '100000000000000-count-other': '000T' + } + } + }, + 'scientificFormats-numberSystem-latn': { + 'standard': '#E0' + }, + 'percentFormats-numberSystem-latn': { + 'standard': '#,##0%' + }, + 'currencyFormats-numberSystem-latn': { + 'currencySpacing': { + 'beforeCurrency': { + 'currencyMatch': '[:^S:]', + 'surroundingMatch': '[:digit:]', + 'insertBetween': ' ' + }, + 'afterCurrency': { + 'currencyMatch': '[:^S:]', + 'surroundingMatch': '[:digit:]', + 'insertBetween': ' ' + } + }, + 'standard': '¤#,##0.00', + 'accounting': '¤#,##0.00;(¤#,##0.00)', + 'short': { + 'standard': { + '1000-count-one': '¤0K', + '1000-count-other': '¤0K', + '10000-count-one': '¤00K', + '10000-count-other': '¤00K', + '100000-count-one': '¤000K', + '100000-count-other': '¤000K', + '1000000-count-one': '¤0M', + '1000000-count-other': '¤0M', + '10000000-count-one': '¤00M', + '10000000-count-other': '¤00M', + '100000000-count-one': '¤000M', + '100000000-count-other': '¤000M', + '1000000000-count-one': '¤0B', + '1000000000-count-other': '¤0B', + '10000000000-count-one': '¤00B', + '10000000000-count-other': '¤00B', + '100000000000-count-one': '¤000B', + '100000000000-count-other': '¤000B', + '1000000000000-count-one': '¤0T', + '1000000000000-count-other': '¤0T', + '10000000000000-count-one': '¤00T', + '10000000000000-count-other': '¤00T', + '100000000000000-count-one': '¤000T', + '100000000000000-count-other': '¤000T' + } + }, + 'unitPattern-count-one': '{0} {1}', + 'unitPattern-count-other': '{0} {1}' + }, + 'miscPatterns-numberSystem-latn': { + 'atLeast': '{0}+', + 'range': '{0}–{1}' + } + } + } + } + }; + + if(Globalize.locale().locale === 'en') { + Globalize.load(enNumbers); + Globalize.locale('en'); + } + + const formattersCache = {}; + + const getFormatter = format => { + let formatter; + let formatCacheKey; + + if(typeof format === 'object') { + formatCacheKey = Globalize.locale().locale + ':' + JSON.stringify(format); + } else { + formatCacheKey = Globalize.locale().locale + ':' + format; + } + formatter = formattersCache[formatCacheKey]; + if(!formatter) { + formatter = formattersCache[formatCacheKey] = Globalize.numberFormatter(format); + } + + return formatter; + }; + + const globalizeNumberLocalization = { + engine: function() { + return 'globalize'; + }, + + _formatNumberCore: function(value, format, formatConfig) { + if(format === 'exponential') { + return this.callBase.apply(this, arguments); + } + + return getFormatter(this._normalizeFormatConfig(format, formatConfig, value))(value); + }, + _normalizeFormatConfig: function(format, formatConfig, value) { + let config; + + if(format === 'decimal') { + config = { + minimumIntegerDigits: formatConfig.precision || 1, + useGrouping: false, + minimumFractionDigits: 0, + maximumFractionDigits: 20, + round: value < 0 ? 'ceil' : 'floor' + }; + } else { + config = this._getPrecisionConfig(formatConfig.precision); + } + if(format === 'percent') { + config.style = 'percent'; + } + + return config; + }, + + _getPrecisionConfig: function(precision) { + let config; + + if(precision === null) { + config = { + minimumFractionDigits: 0, + maximumFractionDigits: 20 + }; + } else { + config = { + minimumFractionDigits: precision || 0, + maximumFractionDigits: precision || 0 + }; + } + + return config; + }, + + format: function(value, format) { + if(typeof value !== 'number') { + return value; + } + + format = this._normalizeFormat(format); + + if(!format || typeof (format) !== 'function' && !format.type && !format.formatter) { + return getFormatter(format)(value); + } + + return this.callBase.apply(this, arguments); + }, + + parse: function(text, format) { + if(!text) { + return; + } + + if(format && (format.parser || typeof format === 'string')) { + return this.callBase.apply(this, arguments); + } + + if(format) { + // Current parser functionality provided as-is and is independent of the most of capabilities of formatter. + errors.log('W0011'); + } + + let result = Globalize.parseNumber(text); + + if(isNaN(result)) { + result = this.callBase.apply(this, arguments); + } + + return result; + } + }; + + numberLocalization.resetInjection(); + numberLocalization.inject(globalizeNumberLocalization); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/intl/date.js b/packages/f-theme-editor/farris-theme-editor/js/localization/intl/date.js new file mode 100644 index 0000000000000000000000000000000000000000..53903f404e49ff84c7672fc4f3cd92d2163d01f5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/intl/date.js @@ -0,0 +1,343 @@ +/* globals Intl */ +import { extend } from '../../core/utils/extend'; +import localizationCoreUtils from '../core'; + +const SYMBOLS_TO_REMOVE_REGEX = /[\u200E\u200F]/g; + +const getIntlFormatter = format => { + return date => { + // NOTE: Intl in some browsers formates dates with timezone offset which was at the moment for this date. + // But the method "new Date" creates date using current offset. So, we decided to format dates in the UTC timezone. + if(!format.timeZoneName) { + const year = date.getFullYear(); + // NOTE: new Date(99,0,1) will return 1999 year, but 99 expected + const recognizableAsTwentyCentury = String(year).length < 3; + const safeYearShift = 400; + const temporaryYearValue = recognizableAsTwentyCentury ? year + safeYearShift : year; + const utcDate = new Date(Date.UTC(temporaryYearValue, date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); + if(recognizableAsTwentyCentury) { + utcDate.setFullYear(year); + } + const utcFormat = extend({ timeZone: 'UTC' }, format); + + return formatDateTime(utcDate, utcFormat); + } + + return formatDateTime(date, format); + }; +}; + +const formattersCache = {}; +const getFormatter = format => { + const key = localizationCoreUtils.locale() + '/' + JSON.stringify(format); + if(!formattersCache[key]) { + formattersCache[key] = (new Intl.DateTimeFormat(localizationCoreUtils.locale(), format)).format; + } + + return formattersCache[key]; +}; + +function formatDateTime(date, format) { + return getFormatter(format)(date).replace(SYMBOLS_TO_REMOVE_REGEX, ''); +} + +const formatNumber = number => { + return (new Intl.NumberFormat(localizationCoreUtils.locale())).format(number); +}; + +const getAlternativeNumeralsMap = (() => { + const numeralsMapCache = {}; + + return locale => { + if(!(locale in numeralsMapCache)) { + if(formatNumber(0) === '0') { + numeralsMapCache[locale] = false; + return false; + } + numeralsMapCache[locale] = {}; + for(let i = 0; i < 10; ++i) { + numeralsMapCache[locale][formatNumber(i)] = i; + } + } + + return numeralsMapCache[locale]; + }; +})(); + +const normalizeNumerals = dateString => { + const alternativeNumeralsMap = getAlternativeNumeralsMap(localizationCoreUtils.locale()); + + if(!alternativeNumeralsMap) { + return dateString; + } + + return dateString.split('').map(sign => { + return sign in alternativeNumeralsMap ? String(alternativeNumeralsMap[sign]) : sign; + }).join(''); +}; + +const removeLeadingZeroes = str => { + return str.replace(/(\D)0+(\d)/g, '$1$2'); +}; +const dateStringEquals = (actual, expected) => { + return removeLeadingZeroes(actual) === removeLeadingZeroes(expected); +}; + +const normalizeMonth = text => { + return text.replace('d\u2019', 'de '); // NOTE: For "ca" locale +}; + +const intlFormats = { + 'day': { day: 'numeric' }, + 'dayofweek': { weekday: 'long' }, + 'longdate': { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }, + 'longdatelongtime': { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric' }, + 'longtime': { hour: 'numeric', minute: 'numeric', second: 'numeric' }, + 'month': { month: 'long' }, + 'monthandday': { month: 'long', day: 'numeric' }, + 'monthandyear': { year: 'numeric', month: 'long' }, + 'shortdate': {}, + 'shorttime': { hour: 'numeric', minute: 'numeric' }, + 'shortyear': { year: '2-digit' }, + 'year': { year: 'numeric' } +}; + +Object.defineProperty(intlFormats, 'shortdateshorttime', { + get: function() { + const defaultOptions = Intl.DateTimeFormat(localizationCoreUtils.locale()).resolvedOptions(); + + return { year: defaultOptions.year, month: defaultOptions.month, day: defaultOptions.day, hour: 'numeric', minute: 'numeric' }; + } +}); + +const getIntlFormat = format => { + return typeof format === 'string' && intlFormats[format.toLowerCase()]; +}; + +const monthNameStrategies = { + standalone: function(monthIndex, monthFormat) { + const date = new Date(1999, monthIndex, 13, 1); + const dateString = getIntlFormatter({ month: monthFormat })(date); + + return dateString; + }, + format: function(monthIndex, monthFormat) { + const date = new Date(0, monthIndex, 13, 1); + const dateString = normalizeMonth(getIntlFormatter({ day: 'numeric', month: monthFormat })(date)); + const parts = dateString.split(' ').filter(part => { + return part.indexOf('13') < 0; + }); + + if(parts.length === 1) { + return parts[0]; + } else if(parts.length === 2) { + return parts[0].length > parts[1].length ? parts[0] : parts[1]; // NOTE: For "lt" locale + } + + return monthNameStrategies.standalone(monthIndex, monthFormat); + } +}; + +export default { + engine: function() { + return 'intl'; + }, + getMonthNames: function(format, type) { + const intlFormats = { + wide: 'long', + abbreviated: 'short', + narrow: 'narrow' + }; + + const monthFormat = intlFormats[format || 'wide']; + + type = type === 'format' ? type : 'standalone'; + + return Array.apply(null, new Array(12)).map((_, monthIndex) => { + return monthNameStrategies[type](monthIndex, monthFormat); + }); + }, + + getDayNames: function(format) { + const intlFormats = { + wide: 'long', + abbreviated: 'short', + short: 'narrow', + narrow: 'narrow' + }; + + const getIntlDayNames = format => { + return Array.apply(null, new Array(7)).map((_, dayIndex) => { + return getIntlFormatter({ weekday: format })(new Date(0, 0, dayIndex)); + }); + }; + + const result = getIntlDayNames(intlFormats[format || 'wide']); + + return result; + }, + + getPeriodNames: function() { + const hour12Formatter = getIntlFormatter({ hour: 'numeric', hour12: true }); + + return [ 1, 13 ].map(hours => { + const hourNumberText = formatNumber(1); // NOTE: For "bn" locale + const timeParts = hour12Formatter(new Date(0, 0, 1, hours)).split(hourNumberText); + + if(timeParts.length !== 2) { + return ''; + } + + const biggerPart = timeParts[0].length > timeParts[1].length ? timeParts[0] : timeParts[1]; + + return biggerPart.trim(); + }); + }, + + format: function(date, format) { + if(!date) { + return; + } + + if(!format) { + return date; + } + + // TODO: refactor (extract code form base) + if(typeof (format) !== 'function' && !format.formatter) { + format = format.type || format; + } + const intlFormat = getIntlFormat(format); + + if(intlFormat) { + return getIntlFormatter(intlFormat)(date); + } + + const formatType = typeof format; + if(format.formatter || formatType === 'function' || formatType === 'string') { + return this.callBase.apply(this, arguments); + } + + return getIntlFormatter(format)(date); + }, + + parse: function(dateString, format) { + let formatter; + + if(format && !format.parser && typeof dateString === 'string') { + dateString = normalizeMonth(dateString); + formatter = (date) => { + return normalizeMonth(this.format(date, format)); + }; + } + return this.callBase(dateString, formatter || format); + }, + + _parseDateBySimpleFormat: function(dateString, format) { + dateString = normalizeNumerals(dateString); + + const formatParts = this.getFormatParts(format); + const dateParts = dateString + .split(/\D+/) + .filter(part => { return part.length > 0; }); + + if(formatParts.length !== dateParts.length) { + return; + } + + const dateArgs = this._generateDateArgs(formatParts, dateParts); + + const constructDate = (dateArgs, ampmShift) => { + const hoursShift = ampmShift ? 12 : 0; + return new Date(dateArgs.year, dateArgs.month, dateArgs.day, (dateArgs.hours + hoursShift) % 24, dateArgs.minutes, dateArgs.seconds); + }; + const constructValidDate = ampmShift => { + const parsedDate = constructDate(dateArgs, ampmShift); + if(dateStringEquals(normalizeNumerals(this.format(parsedDate, format)), dateString)) { + return parsedDate; + } + }; + + return constructValidDate(false) || constructValidDate(true); + }, + + _generateDateArgs: function(formatParts, dateParts) { + const currentDate = new Date(); + const dateArgs = { + year: currentDate.getFullYear(), + month: currentDate.getMonth(), + day: currentDate.getDate(), + hours: 0, + minutes: 0, + seconds: 0 + }; + + formatParts.forEach((formatPart, index) => { + const datePart = dateParts[index]; + let parsed = parseInt(datePart, 10); + + if(formatPart === 'month') { + parsed = parsed - 1; + } + + dateArgs[formatPart] = parsed; + }); + + return dateArgs; + }, + + formatUsesMonthName: function(format) { + if(typeof format === 'object' && !(format.type || format.format)) { + return format.month === 'long'; + } + + return this.callBase.apply(this, arguments); + }, + + formatUsesDayName: function(format) { + if(typeof format === 'object' && !(format.type || format.format)) { + return format.weekday === 'long'; + } + + return this.callBase.apply(this, arguments); + }, + getTimeSeparator: function() { + const formatOptions = { + hour: 'numeric', + minute: 'numeric', + hour12: false + }; + return normalizeNumerals(formatDateTime(new Date(2001, 1, 1, 11, 11), formatOptions)).replace(/\d/g, ''); + }, + + getFormatParts: function(format) { + if(typeof format === 'string') { + return this.callBase(format); + } + const intlFormat = extend({}, intlFormats[format.toLowerCase()]); + const date = new Date(2001, 2, 4, 5, 6, 7); + let formattedDate = getIntlFormatter(intlFormat)(date); + + formattedDate = normalizeNumerals(formattedDate); + + const formatParts = [ + { name: 'year', value: 1 }, + { name: 'month', value: 3 }, + { name: 'day', value: 4 }, + { name: 'hours', value: 5 }, + { name: 'minutes', value: 6 }, + { name: 'seconds', value: 7 } + ]; + + return formatParts + .map(part => { + return { + name: part.name, + index: formattedDate.indexOf(part.value) + }; + }) + .filter(part => { return part.index > -1; }) + .sort((a, b) => { return a.index - b.index; }) + .map(part => { return part.name; }); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/intl/number.js b/packages/f-theme-editor/farris-theme-editor/js/localization/intl/number.js new file mode 100644 index 0000000000000000000000000000000000000000..a96a0fe988a80e968c0c9f1352a006a1e9c0989c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/intl/number.js @@ -0,0 +1,123 @@ +/* globals Intl */ +import dxConfig from '../../core/config'; +import localizationCoreUtils from '../core'; +import openXmlCurrencyFormat from '../open_xml_currency_format'; +import accountingFormats from '../cldr-data/accounting_formats'; + +const detectCurrencySymbolRegex = /([^\s0]+)?(\s*)0*[.,]*0*(\s*)([^\s0]+)?/; +const formattersCache = {}; +const getFormatter = format => { + const key = localizationCoreUtils.locale() + '/' + JSON.stringify(format); + if(!formattersCache[key]) { + formattersCache[key] = (new Intl.NumberFormat(localizationCoreUtils.locale(), format)).format; + } + + return formattersCache[key]; +}; +const getCurrencyFormatter = currency => { + return (new Intl.NumberFormat(localizationCoreUtils.locale(), { style: 'currency', currency: currency })); +}; + +export default { + engine: function() { + return 'intl'; + }, + _formatNumberCore: function(value, format, formatConfig) { + if(format === 'exponential') { + return this.callBase.apply(this, arguments); + } + + return getFormatter(this._normalizeFormatConfig(format, formatConfig, value))(value); + }, + _normalizeFormatConfig: function(format, formatConfig, value) { + let config; + + if(format === 'decimal') { + config = { + minimumIntegerDigits: formatConfig.precision || undefined, + useGrouping: false, + maximumFractionDigits: String(value).length, + round: value < 0 ? 'ceil' : 'floor' + }; + } else { + config = this._getPrecisionConfig(formatConfig.precision); + } + + if(format === 'percent') { + config.style = 'percent'; + } else if(format === 'currency') { + config.style = 'currency'; + config.currency = formatConfig.currency || dxConfig().defaultCurrency; + } + + return config; + }, + _getPrecisionConfig: function(precision) { + let config; + + if(precision === null) { + config = { + minimumFractionDigits: 0, + maximumFractionDigits: 20 + }; + } else { + config = { + minimumFractionDigits: precision || 0, + maximumFractionDigits: precision || 0 + }; + } + + return config; + }, + format: function(value, format) { + if('number' !== typeof value) { + return value; + } + + format = this._normalizeFormat(format); + + if(format.currency === 'default') { + format.currency = dxConfig().defaultCurrency; + } + + if(!format || 'function' !== typeof format && !format.type && !format.formatter) { + return getFormatter(format)(value); + } + + return this.callBase.apply(this, arguments); + }, + _getCurrencySymbolInfo: function(currency) { + const formatter = getCurrencyFormatter(currency); + return this._extractCurrencySymbolInfo(formatter.format(0)); + }, + _extractCurrencySymbolInfo: function(currencyValueString) { + const match = detectCurrencySymbolRegex.exec(currencyValueString) || []; + const position = match[1] ? 'before' : 'after'; + const symbol = match[1] || match[4] || ''; + const delimiter = match[2] || match[3] || ''; + + return { + position: position, + symbol: symbol, + delimiter: delimiter + }; + }, + + getCurrencySymbol: function(currency) { + if(!currency) { + currency = dxConfig().defaultCurrency; + } + + const symbolInfo = this._getCurrencySymbolInfo(currency); + return { + 'symbol': symbolInfo.symbol + }; + }, + getOpenXmlCurrencyFormat: function(currency) { + const targetCurrency = currency || dxConfig().defaultCurrency; + const currencySymbol = this._getCurrencySymbolInfo(targetCurrency).symbol; + const closestAccountingFormat = localizationCoreUtils.getValueByClosestLocale(locale => accountingFormats[locale]); + + return openXmlCurrencyFormat(currencySymbol, closestAccountingFormat); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/language_codes.js b/packages/f-theme-editor/farris-theme-editor/js/localization/language_codes.js new file mode 100644 index 0000000000000000000000000000000000000000..5092ff4f338b0db1c5bc254ea6c35d0f474d2ce3 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/language_codes.js @@ -0,0 +1,358 @@ +import localizationCoreUtils from './core'; +const LANGUAGE_CODES = { + 'ar': 1, + 'bg': 2, + 'ca': 3, + 'zh-Hans': 4, + 'cs': 5, + 'da': 6, + 'de': 7, + 'el': 8, + 'en': 9, + 'es': 10, + 'fi': 11, + 'fr': 12, + 'he': 13, + 'hu': 14, + 'is': 15, + 'it': 16, + 'ja': 17, + 'ko': 18, + 'nl': 19, + 'no': 20, + 'pl': 21, + 'pt': 22, + 'rm': 23, + 'ro': 24, + 'ru': 25, + 'hr': 26, + 'sk': 27, + 'sq': 28, + 'sv': 29, + 'th': 30, + 'tr': 31, + 'ur': 32, + 'id': 33, + 'uk': 34, + 'be': 35, + 'sl': 36, + 'et': 37, + 'lv': 38, + 'lt': 39, + 'tg': 40, + 'fa': 41, + 'vi': 42, + 'hy': 43, + 'az': 44, + 'eu': 45, + 'hsb': 46, + 'mk': 47, + 'tn': 50, + 'xh': 52, + 'zu': 53, + 'af': 54, + 'ka': 55, + 'fo': 56, + 'hi': 57, + 'mt': 58, + 'se': 59, + 'ga': 60, + 'ms': 62, + 'kk': 63, + 'ky': 64, + 'sw': 65, + 'tk': 66, + 'uz': 67, + 'tt': 68, + 'bn': 69, + 'pa': 70, + 'gu': 71, + 'or': 72, + 'ta': 73, + 'te': 74, + 'kn': 75, + 'ml': 76, + 'as': 77, + 'mr': 78, + 'sa': 79, + 'mn': 80, + 'bo': 81, + 'cy': 82, + 'km': 83, + 'lo': 84, + 'gl': 86, + 'kok': 87, + 'syr': 90, + 'si': 91, + 'iu': 93, + 'am': 94, + 'tzm': 95, + 'ne': 97, + 'fy': 98, + 'ps': 99, + 'fil': 100, + 'dv': 101, + 'ha': 104, + 'yo': 106, + 'quz': 107, + 'nso': 108, + 'ba': 109, + 'lb': 110, + 'kl': 111, + 'ig': 112, + 'ii': 120, + 'arn': 122, + 'moh': 124, + 'br': 126, + 'ug': 128, + 'mi': 129, + 'oc': 130, + 'co': 131, + 'gsw': 132, + 'sah': 133, + 'qut': 134, + 'rw': 135, + 'wo': 136, + 'prs': 140, + 'gd': 145, + 'ar-SA': 1025, + 'bg-BG': 1026, + 'ca-ES': 1027, + 'zh-TW': 1028, + 'cs-CZ': 1029, + 'da-DK': 1030, + 'de-DE': 1031, + 'el-GR': 1032, + 'en-US': 1033, + 'fi-FI': 1035, + 'fr-FR': 1036, + 'he-IL': 1037, + 'hu-HU': 1038, + 'is-IS': 1039, + 'it-IT': 1040, + 'ja-JP': 1041, + 'ko-KR': 1042, + 'nl-NL': 1043, + 'nb-NO': 1044, + 'pl-PL': 1045, + 'pt-BR': 1046, + 'rm-CH': 1047, + 'ro-RO': 1048, + 'ru-RU': 1049, + 'hr-HR': 1050, + 'sk-SK': 1051, + 'sq-AL': 1052, + 'sv-SE': 1053, + 'th-TH': 1054, + 'tr-TR': 1055, + 'ur-PK': 1056, + 'id-ID': 1057, + 'uk-UA': 1058, + 'be-BY': 1059, + 'sl-SI': 1060, + 'et-EE': 1061, + 'lv-LV': 1062, + 'lt-LT': 1063, + 'tg-Cyrl-TJ': 1064, + 'fa-IR': 1065, + 'vi-VN': 1066, + 'hy-AM': 1067, + 'az-Latn-AZ': 1068, + 'eu-ES': 1069, + 'hsb-DE': 1070, + 'mk-MK': 1071, + 'tn-ZA': 1074, + 'xh-ZA': 1076, + 'zu-ZA': 1077, + 'af-ZA': 1078, + 'ka-GE': 1079, + 'fo-FO': 1080, + 'hi-IN': 1081, + 'mt-MT': 1082, + 'se-NO': 1083, + 'ms-MY': 1086, + 'kk-KZ': 1087, + 'ky-KG': 1088, + 'sw-KE': 1089, + 'tk-TM': 1090, + 'uz-Latn-UZ': 1091, + 'tt-RU': 1092, + 'bn-IN': 1093, + 'pa-IN': 1094, + 'gu-IN': 1095, + 'or-IN': 1096, + 'ta-IN': 1097, + 'te-IN': 1098, + 'kn-IN': 1099, + 'ml-IN': 1100, + 'as-IN': 1101, + 'mr-IN': 1102, + 'sa-IN': 1103, + 'mn-MN': 1104, + 'bo-CN': 1105, + 'cy-GB': 1106, + 'km-KH': 1107, + 'lo-LA': 1108, + 'gl-ES': 1110, + 'kok-IN': 1111, + 'syr-SY': 1114, + 'si-LK': 1115, + 'iu-Cans-CA': 1117, + 'am-ET': 1118, + 'ne-NP': 1121, + 'fy-NL': 1122, + 'ps-AF': 1123, + 'fil-PH': 1124, + 'dv-MV': 1125, + 'ha-Latn-NG': 1128, + 'yo-NG': 1130, + 'quz-BO': 1131, + 'nso-ZA': 1132, + 'ba-RU': 1133, + 'lb-LU': 1134, + 'kl-GL': 1135, + 'ig-NG': 1136, + 'ii-CN': 1144, + 'arn-CL': 1146, + 'moh-CA': 1148, + 'br-FR': 1150, + 'ug-CN': 1152, + 'mi-NZ': 1153, + 'oc-FR': 1154, + 'co-FR': 1155, + 'gsw-FR': 1156, + 'sah-RU': 1157, + 'qut-GT': 1158, + 'rw-RW': 1159, + 'wo-SN': 1160, + 'prs-AF': 1164, + 'gd-GB': 1169, + 'ar-IQ': 2049, + 'zh-CN': 2052, + 'de-CH': 2055, + 'en-GB': 2057, + 'es-MX': 2058, + 'fr-BE': 2060, + 'it-CH': 2064, + 'nl-BE': 2067, + 'nn-NO': 2068, + 'pt-PT': 2070, + 'sr-Latn-CS': 2074, + 'sv-FI': 2077, + 'az-Cyrl-AZ': 2092, + 'dsb-DE': 2094, + 'se-SE': 2107, + 'ga-IE': 2108, + 'ms-BN': 2110, + 'uz-Cyrl-UZ': 2115, + 'bn-BD': 2117, + 'mn-Mong-CN': 2128, + 'iu-Latn-CA': 2141, + 'tzm-Latn-DZ': 2143, + 'quz-EC': 2155, + 'ar-EG': 3073, + 'zh-HK': 3076, + 'de-AT': 3079, + 'en-AU': 3081, + 'es-ES': 3082, + 'fr-CA': 3084, + 'sr-Cyrl-CS': 3098, + 'se-FI': 3131, + 'quz-PE': 3179, + 'ar-LY': 4097, + 'zh-SG': 4100, + 'de-LU': 4103, + 'en-CA': 4105, + 'es-GT': 4106, + 'fr-CH': 4108, + 'hr-BA': 4122, + 'smj-NO': 4155, + 'ar-DZ': 5121, + 'zh-MO': 5124, + 'de-LI': 5127, + 'en-NZ': 5129, + 'es-CR': 5130, + 'fr-LU': 5132, + 'bs-Latn-BA': 5146, + 'smj-SE': 5179, + 'ar-MA': 6145, + 'en-IE': 6153, + 'es-PA': 6154, + 'fr-MC': 6156, + 'sr-Latn-BA': 6170, + 'sma-NO': 6203, + 'ar-TN': 7169, + 'en-ZA': 7177, + 'es-DO': 7178, + 'sr-Cyrl-BA': 7194, + 'sma-SE': 7227, + 'ar-OM': 8193, + 'en-JM': 8201, + 'es-VE': 8202, + 'bs-Cyrl-BA': 8218, + 'sms-FI': 8251, + 'ar-YE': 9217, + 'en-029': 9225, + 'es-CO': 9226, + 'sr-Latn-RS': 9242, + 'smn-FI': 9275, + 'ar-SY': 10241, + 'en-BZ': 10249, + 'es-PE': 10250, + 'sr-Cyrl-RS': 10266, + 'ar-JO': 11265, + 'en-TT': 11273, + 'es-AR': 11274, + 'sr-Latn-ME': 11290, + 'ar-LB': 12289, + 'en-ZW': 12297, + 'es-EC': 12298, + 'sr-Cyrl-ME': 12314, + 'ar-KW': 13313, + 'en-PH': 13321, + 'es-CL': 13322, + 'ar-AE': 14337, + 'es-UY': 14346, + 'ar-BH': 15361, + 'es-PY': 15370, + 'ar-QA': 16385, + 'en-IN': 16393, + 'es-BO': 16394, + 'en-MY': 17417, + 'es-SV': 17418, + 'en-SG': 18441, + 'es-HN': 18442, + 'es-NI': 19466, + 'es-PR': 20490, + 'es-US': 21514, + 'bs-Cyrl': 25626, + 'bs-Latn': 26650, + 'sr-Cyrl': 27674, + 'sr-Latn': 28698, + 'smn': 28731, + 'az-Cyrl': 29740, + 'sms': 29755, + 'zh': 30724, + 'nn': 30740, + 'bs': 30746, + 'az-Latn': 30764, + 'sma': 30779, + 'uz-Cyrl': 30787, + 'mn-Cyrl': 30800, + 'iu-Cans': 30813, + 'zh-Hant': 31748, + 'nb': 31764, + 'sr': 31770, + 'tg-Cyrl': 31784, + 'dsb': 31790, + 'smj': 31803, + 'uz-Latn': 31811, + 'mn-Mong': 31824, + 'iu-Latn': 31837, + 'tzm-Latn': 31839, + 'ha-Latn': 31848 +}; + +export function getLanguageId() { + return LANGUAGE_CODES[localizationCoreUtils.locale()]; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.format.js b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.format.js new file mode 100644 index 0000000000000000000000000000000000000000..e3b9b860bd7283017e000ac79e880606a7c6ba08 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.format.js @@ -0,0 +1,203 @@ +import numberLocalization from '../number'; + +const ARABIC_COMMA = '\u060C'; +const FORMAT_SEPARATORS = ' .,:;/\\<>()-[]' + ARABIC_COMMA; +const AM_PM_PATTERN = '. m.'; + +const checkDigit = function(char) { + const code = char && numberLocalization.convertDigits(char, false).charCodeAt(0); + const zeroCode = numberLocalization.convertDigits('0', false).charCodeAt(0); + + return zeroCode <= code && code < zeroCode + 10; +}; + +const checkPatternContinue = function(text, patterns, index, isDigit) { + const char = text[index]; + const nextChar = text[index + 1]; + + if(!isDigit) { + if(char === '.' || (char === ' ' && text.slice(index - 1, index + 3) === AM_PM_PATTERN)) { + return true; + } + if(char === '-' && !checkDigit(nextChar)) { + return true; + } + } + const isDigitChanged = isDigit && patterns.some(pattern => text[index] !== pattern[index]); + return FORMAT_SEPARATORS.indexOf(char) < 0 && (isDigit === checkDigit(char) && (!isDigit || isDigitChanged)); +}; + +const getPatternStartIndex = function(defaultPattern, index) { + if(!checkDigit(defaultPattern[index])) { + while(index > 0 + && !checkDigit(defaultPattern[index - 1]) + && (defaultPattern[index - 1] === '.' + || FORMAT_SEPARATORS.indexOf(defaultPattern[index - 1]) < 0)) { + index--; + } + } + return index; +}; + +const getDifference = function(defaultPattern, patterns, processedIndexes, isDigit) { + let i = 0; + const result = []; + + const patternsFilter = function(pattern) { + return defaultPattern[i] !== pattern[i] && (isDigit === undefined || checkDigit(defaultPattern[i]) === isDigit); + }; + + if(!Array.isArray(patterns)) { + patterns = [patterns]; + } + + for(i = 0; i < defaultPattern.length; i++) { + if(processedIndexes.indexOf(i) < 0 && patterns.filter(patternsFilter).length) { + i = getPatternStartIndex(defaultPattern, i); + do { + isDigit = checkDigit(defaultPattern[i]); + if(!result.length && !isDigit && checkDigit(patterns[0][i])) { + break; + } + result.push(i); + processedIndexes.unshift(i); + i++; + } while(defaultPattern[i] && checkPatternContinue(defaultPattern, patterns, i, isDigit)); + break; + } + } + + if(result.length === 1 && (defaultPattern[processedIndexes[0] - 1] === '0' || defaultPattern[processedIndexes[0] - 1] === '٠')) { + processedIndexes.unshift(processedIndexes[0] - 1); + } + + return result; +}; + +const replaceCharsCore = function(pattern, indexes, char, patternPositions) { + const baseCharIndex = indexes[0]; + const patternIndex = baseCharIndex < patternPositions.length ? patternPositions[baseCharIndex] : baseCharIndex; + + indexes.forEach(function(_, index) { + pattern = pattern.substr(0, patternIndex + index) + (char.length > 1 ? char[index] : char) + pattern.substr(patternIndex + index + 1); + }); + + if(indexes.length === 1) { + pattern = pattern.replace('0' + char, char + char); + pattern = pattern.replace('٠' + char, char + char); + } + + return pattern; +}; + +const replaceChars = function(pattern, indexes, char, patternPositions) { + let i; + let index; + let patternIndex; + + if(!checkDigit(pattern[indexes[0]] || '0')) { + const letterCount = Math.max(indexes.length <= 3 ? 3 : 4, char.length); + + while(indexes.length > letterCount) { + index = indexes.pop(); + patternIndex = patternPositions[index]; + + patternPositions[index] = -1; + for(i = index + 1; i < patternPositions.length; i++) { + patternPositions[i]--; + } + pattern = pattern.substr(0, patternIndex) + pattern.substr(patternIndex + 1); + } + + index = indexes[indexes.length - 1] + 1, + patternIndex = index < patternPositions.length ? patternPositions[index] : index; + + while(indexes.length < letterCount) { + + indexes.push(indexes[indexes.length - 1] + 1); + for(i = index; i < patternPositions.length; i++) { + patternPositions[i]++; + } + pattern = pattern.substr(0, patternIndex) + ' ' + pattern.substr(patternIndex); + } + } + + pattern = replaceCharsCore(pattern, indexes, char, patternPositions); + + return pattern; +}; + +const formatValue = function(value, formatter) { + if(Array.isArray(value)) { + return value.map(function(value) { + return (formatter(value) || '').toString(); + }); + } + return (formatter(value) || '').toString(); +}; + +const ESCAPE_CHARS_REGEXP = /[a-zA-Z]/g; + +const escapeChars = function(pattern, defaultPattern, processedIndexes, patternPositions) { + const escapeIndexes = defaultPattern.split('').map(function(char, index) { + if(processedIndexes.indexOf(index) < 0 && (char.match(ESCAPE_CHARS_REGEXP) || char === '\'')) { + return patternPositions[index]; + } + return -1; + }); + + pattern = pattern.split('').map(function(char, index) { + let result = char; + const isCurrentCharEscaped = escapeIndexes.indexOf(index) >= 0; + const isPrevCharEscaped = index > 0 && escapeIndexes.indexOf(index - 1) >= 0; + const isNextCharEscaped = escapeIndexes.indexOf(index + 1) >= 0; + + if(isCurrentCharEscaped) { + if(!isPrevCharEscaped) { + result = '\'' + result; + } + if(!isNextCharEscaped) { + result = result + '\''; + } + } + + return result; + }).join(''); + + return pattern; +}; + +export const getFormat = function(formatter) { + const processedIndexes = []; + const defaultPattern = formatValue(new Date(2009, 8, 8, 6, 5, 4), formatter); + const patternPositions = defaultPattern.split('').map(function(_, index) { return index; }); + let result = defaultPattern; + const replacedPatterns = {}; + const datePatterns = [ + { date: new Date(2009, 8, 8, 6, 5, 4, 111), pattern: 'S' }, + { date: new Date(2009, 8, 8, 6, 5, 2), pattern: 's' }, + { date: new Date(2009, 8, 8, 6, 2, 4), pattern: 'm' }, + { date: new Date(2009, 8, 8, 18, 5, 4), pattern: 'H', isDigit: true }, + { date: new Date(2009, 8, 8, 2, 5, 4), pattern: 'h', isDigit: true }, + { date: new Date(2009, 8, 8, 18, 5, 4), pattern: 'a', isDigit: false }, + { date: new Date(2009, 8, 1, 6, 5, 4), pattern: 'd' }, + { date: [new Date(2009, 8, 2, 6, 5, 4), new Date(2009, 8, 3, 6, 5, 4), new Date(2009, 8, 4, 6, 5, 4)], pattern: 'E' }, + { date: new Date(2009, 9, 6, 6, 5, 4), pattern: 'M' }, + { date: new Date(1998, 8, 8, 6, 5, 4), pattern: 'y' }]; + + if(!result) return; + + datePatterns.forEach(function(test) { + const diff = getDifference(defaultPattern, formatValue(test.date, formatter), processedIndexes, test.isDigit); + const pattern = test.pattern === 'M' && !replacedPatterns['d'] ? 'L' : test.pattern; + + result = replaceChars(result, diff, pattern, patternPositions); + replacedPatterns[pattern] = diff.length; + }); + + result = escapeChars(result, defaultPattern, processedIndexes, patternPositions); + + if(processedIndexes.length) { + return result; + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.formatter.js b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.formatter.js new file mode 100644 index 0000000000000000000000000000000000000000..13f36b7df0afee96f9add26823e218992c9f1ea4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.formatter.js @@ -0,0 +1,140 @@ +function leftPad(text, length) { + while(text.length < length) { + text = '0' + text; + } + return text; +} + +const FORMAT_TYPES = { + '3': 'abbreviated', + '4': 'wide', + '5': 'narrow' +}; + +const LDML_FORMATTERS = { + y: function(date, count, useUtc) { + let year = date[useUtc ? 'getUTCFullYear' : 'getFullYear'](); + if(count === 2) { + year = year % 100; + } + return leftPad(year.toString(), count); + }, + M: function(date, count, useUtc, dateParts) { + const month = date[useUtc ? 'getUTCMonth' : 'getMonth'](); + const formatType = FORMAT_TYPES[count]; + if(formatType) { + return dateParts.getMonthNames(formatType, 'format')[month]; + } + return leftPad((month + 1).toString(), Math.min(count, 2)); + }, + L: function(date, count, useUtc, dateParts) { + const month = date[useUtc ? 'getUTCMonth' : 'getMonth'](); + const formatType = FORMAT_TYPES[count]; + if(formatType) { + return dateParts.getMonthNames(formatType, 'standalone')[month]; + } + return leftPad((month + 1).toString(), Math.min(count, 2)); + }, + Q: function(date, count, useUtc, dateParts) { + const month = date[useUtc ? 'getUTCMonth' : 'getMonth'](); + const quarter = Math.floor(month / 3); + const formatType = FORMAT_TYPES[count]; + if(formatType) { + return dateParts.getQuarterNames(formatType)[quarter]; + } + return leftPad((quarter + 1).toString(), Math.min(count, 2)); + }, + E: function(date, count, useUtc, dateParts) { + const day = date[useUtc ? 'getUTCDay' : 'getDay'](); + const formatType = FORMAT_TYPES[count < 3 ? 3 : count]; + return dateParts.getDayNames(formatType)[day]; + }, + a: function(date, count, useUtc, dateParts) { + const hours = date[useUtc ? 'getUTCHours' : 'getHours'](); + const period = hours < 12 ? 0 : 1; + const formatType = FORMAT_TYPES[count]; + return dateParts.getPeriodNames(formatType)[period]; + }, + d: function(date, count, useUtc) { + return leftPad(date[useUtc ? 'getUTCDate' : 'getDate']().toString(), Math.min(count, 2)); + }, + H: function(date, count, useUtc) { + return leftPad(date[useUtc ? 'getUTCHours' : 'getHours']().toString(), Math.min(count, 2)); + }, + h: function(date, count, useUtc) { + const hours = date[useUtc ? 'getUTCHours' : 'getHours'](); + return leftPad((hours % 12 || 12).toString(), Math.min(count, 2)); + }, + m: function(date, count, useUtc) { + return leftPad(date[useUtc ? 'getUTCMinutes' : 'getMinutes']().toString(), Math.min(count, 2)); + }, + s: function(date, count, useUtc) { + return leftPad(date[useUtc ? 'getUTCSeconds' : 'getSeconds']().toString(), Math.min(count, 2)); + }, + S: function(date, count, useUtc) { + return leftPad(date[useUtc ? 'getUTCMilliseconds' : 'getMilliseconds']().toString(), 3).substr(0, count); + }, + x: function(date, count, useUtc) { + const timezoneOffset = useUtc ? 0 : date.getTimezoneOffset(); + const signPart = timezoneOffset > 0 ? '-' : '+'; + const timezoneOffsetAbs = Math.abs(timezoneOffset); + const hours = Math.floor(timezoneOffsetAbs / 60); + const minutes = timezoneOffsetAbs % 60; + const hoursPart = leftPad(hours.toString(), 2); + const minutesPart = leftPad(minutes.toString(), 2); + + return signPart + hoursPart + (count >= 3 ? ':' : '') + (count > 1 || minutes ? minutesPart : ''); + }, + X: function(date, count, useUtc) { + if(useUtc || !date.getTimezoneOffset()) { + return 'Z'; + } + return LDML_FORMATTERS.x(date, count, useUtc); + }, + Z: function(date, count, useUtc) { + return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc); + } +}; + +export const getFormatter = function(format, dateParts) { + return function(date) { + let charIndex; + let formatter; + let char; + let charCount = 0; + const separator = '\''; + let isEscaping = false; + let isCurrentCharEqualsNext; + let result = ''; + + if(!date) return null; + + if(!format) return date; + + const useUtc = format[format.length - 1] === 'Z' || format.slice(-3) === '\'Z\''; + + for(charIndex = 0; charIndex < format.length; charIndex++) { + char = format[charIndex]; + formatter = LDML_FORMATTERS[char]; + isCurrentCharEqualsNext = char === format[charIndex + 1]; + charCount++; + + if(!isCurrentCharEqualsNext) { + if(formatter && !isEscaping) { + result += formatter(date, charCount, useUtc, dateParts); + } + charCount = 0; + } + + if(char === separator && !isCurrentCharEqualsNext) { + isEscaping = !isEscaping; + } else if(isEscaping || !formatter) { + result += char; + } + if(char === separator && isCurrentCharEqualsNext) { + charIndex++; + } + } + return result; + }; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.parser.js b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.parser.js new file mode 100644 index 0000000000000000000000000000000000000000..199685d749d3a06487cdd648ccd454074c700639 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/date.parser.js @@ -0,0 +1,352 @@ +import { escapeRegExp } from '../../core/utils/common'; +import { logger } from '../../core/utils/console'; + +const FORMAT_TYPES = { + '3': 'abbreviated', + '4': 'wide', + '5': 'narrow' +}; + +const monthRegExpGenerator = function(count, dateParts) { + if(count > 2) { + return Object.keys(FORMAT_TYPES).map(function(count) { + return ['format', 'standalone'].map(function(type) { + return dateParts.getMonthNames(FORMAT_TYPES[count], type).join('|'); + }).join('|'); + }).join('|'); + } + return count === 2 ? '1[012]|0?[1-9]' : '0??[1-9]|1[012]'; +}; + +const PATTERN_REGEXPS = { + ':': function(count, dateParts) { + const countSuffix = count > 1 ? `{${count}}` : ''; + let timeSeparator = escapeRegExp(dateParts.getTimeSeparator()); + timeSeparator !== ':' && (timeSeparator = `${timeSeparator}|:`); + return `${timeSeparator}${countSuffix}`; + }, + y: function(count) { + return count === 2 ? `[0-9]{${count}}` : '[0-9]+?'; + }, + M: monthRegExpGenerator, + L: monthRegExpGenerator, + Q: function(count, dateParts) { + if(count > 2) { + return dateParts.getQuarterNames(FORMAT_TYPES[count], 'format').join('|'); + } + return '0?[1-4]'; + }, + E: function(count, dateParts) { + return '\\D*'; + }, + a: function(count, dateParts) { + return dateParts.getPeriodNames(FORMAT_TYPES[count < 3 ? 3 : count], 'format').join('|'); + }, + d: function(count) { + return count === 2 ? '3[01]|[12][0-9]|0?[1-9]' : '0??[1-9]|[12][0-9]|3[01]'; + }, + H: function(count) { + return count === 2 ? '2[0-3]|1[0-9]|0?[0-9]' : '0??[0-9]|1[0-9]|2[0-3]'; + }, + h: function(count) { + return count === 2 ? '1[012]|0?[1-9]' : '0??[1-9]|1[012]'; + }, + m: function(count) { + return count === 2 ? '[1-5][0-9]|0?[0-9]' : '0??[0-9]|[1-5][0-9]'; + }, + s: function(count) { + return count === 2 ? '[1-5][0-9]|0?[0-9]' : '0??[0-9]|[1-5][0-9]'; + }, + S: function(count) { + return `[0-9]{1,${count}}`; + }, + w: function(count) { + return count === 2 ? '[1-5][0-9]|0?[0-9]' : '0??[0-9]|[1-5][0-9]'; + } +}; + +const parseNumber = Number; + +const caseInsensitiveIndexOf = function(array, value) { + return array.map((item) => item.toLowerCase()).indexOf(value.toLowerCase()); +}; + +const monthPatternParser = function(text, count, dateParts) { + if(count > 2) { + return ['format', 'standalone'].map(function(type) { + return Object.keys(FORMAT_TYPES).map(function(count) { + const monthNames = dateParts.getMonthNames(FORMAT_TYPES[count], type); + return caseInsensitiveIndexOf(monthNames, text); + }); + }).reduce(function(a, b) { + return a.concat(b); + }).filter(function(index) { + return index >= 0; + })[0]; + } + return parseNumber(text) - 1; +}; + +const PATTERN_PARSERS = { + y: function(text, count) { + const year = parseNumber(text); + if(count === 2) { + return year < 30 ? 2000 + year : 1900 + year; + } + return year; + }, + M: monthPatternParser, + L: monthPatternParser, + Q: function(text, count, dateParts) { + if(count > 2) { + return dateParts.getQuarterNames(FORMAT_TYPES[count], 'format').indexOf(text); + } + return parseNumber(text) - 1; + }, + E: function(text, count, dateParts) { + const dayNames = dateParts.getDayNames(FORMAT_TYPES[count < 3 ? 3 : count], 'format'); + return caseInsensitiveIndexOf(dayNames, text); + }, + a: function(text, count, dateParts) { + const periodNames = dateParts.getPeriodNames(FORMAT_TYPES[count < 3 ? 3 : count], 'format'); + return caseInsensitiveIndexOf(periodNames, text); + }, + d: parseNumber, + H: parseNumber, + h: parseNumber, + m: parseNumber, + s: parseNumber, + S: function(text, count) { + count = Math.max(count, 3); + text = text.slice(0, 3); + while(count < 3) { + text = text + '0'; + count++; + } + return parseNumber(text); + } +}; + +const ORDERED_PATTERNS = ['y', 'M', 'd', 'h', 'm', 's', 'S']; +const PATTERN_SETTERS = { + y: 'setFullYear', + M: 'setMonth', + L: 'setMonth', + a: function(date, value, datePartValues) { + let hours = date.getHours(); + + const hourPartValue = datePartValues['h']; + if(hourPartValue !== undefined && hourPartValue !== hours) { + hours--; + } + + if(!value && hours === 12) { + hours = 0; + } else if(value && hours !== 12) { + hours += 12; + } + + date.setHours(hours); + }, + d: 'setDate', + H: 'setHours', + h: 'setHours', + m: 'setMinutes', + s: 'setSeconds', + S: 'setMilliseconds' +}; + +const getSameCharCount = function(text, index) { + const char = text[index]; + if(!char) { + return 0; + } + let count = 0; + + do { + index++; + count++; + } while(text[index] === char); + + return count; +}; + +const createPattern = function(char, count) { + let result = ''; + for(let i = 0; i < count; i++) { + result += char; + } + return result; +}; + +export const getRegExpInfo = function(format, dateParts) { + let regexpText = ''; + let stubText = ''; + let isEscaping; + const patterns = []; + + const addPreviousStub = function() { + if(stubText) { + patterns.push(`'${stubText}'`); + regexpText += `${escapeRegExp(stubText)})`; + stubText = ''; + } + }; + + for(let i = 0; i < format.length; i++) { + const char = format[i]; + const isEscapeChar = char === '\''; + const regexpPart = PATTERN_REGEXPS[char]; + + if(isEscapeChar) { + isEscaping = !isEscaping; + if(format[i - 1] !== '\'') { + continue; + } + } + + if(regexpPart && !isEscaping) { + const count = getSameCharCount(format, i); + const pattern = createPattern(char, count); + + addPreviousStub(); + patterns.push(pattern); + + regexpText += `(${regexpPart(count, dateParts)})`; + i += count - 1; + } else { + if(!stubText) { + regexpText += '('; + } + stubText += char; + } + } + + addPreviousStub(); + if(!isPossibleForParsingFormat(patterns)) { + logger.warn(`The following format may be parsed incorrectly: ${format}.`); + } + + return { + patterns: patterns, + regexp: new RegExp(`^${regexpText}$`, 'i') + }; +}; + +const digitFieldSymbols = ['d', 'H', 'h', 'm', 's', 'w', 'M', 'L', 'Q']; +export const isPossibleForParsingFormat = function(patterns) { + const isDigitPattern = (pattern) => { + if(!pattern) { + return false; + } + const char = pattern[0]; + return ['y', 'S'].includes(char) || digitFieldSymbols.includes(char) && pattern.length < 3; + }; + + const isAmbiguousDigitPattern = (pattern) => { + return pattern[0] !== 'S' && pattern.length !== 2; + }; + + let possibleForParsing = true; + let ambiguousDigitPatternsCount = 0; + return patterns.every((pattern, index, patterns) => { + if(isDigitPattern(pattern)) { + if(isAmbiguousDigitPattern(pattern)) { + possibleForParsing = (++ambiguousDigitPatternsCount) < 2; + } + if(!isDigitPattern(patterns[index + 1])) { + ambiguousDigitPatternsCount = 0; + } + } + return possibleForParsing; + }); +}; + +export const getPatternSetters = function() { + return PATTERN_SETTERS; +}; + +const setPatternPart = function(date, pattern, text, dateParts, datePartValues) { + const patternChar = pattern[0]; + const partSetter = PATTERN_SETTERS[patternChar]; + const partParser = PATTERN_PARSERS[patternChar]; + + if(partSetter && partParser) { + const value = partParser(text, pattern.length, dateParts); + datePartValues[pattern] = value; + if(date[partSetter]) { + date[partSetter](value); + } else { + partSetter(date, value, datePartValues); + } + } +}; + +const setPatternPartFromNow = function(date, pattern, now) { + const setterName = PATTERN_SETTERS[pattern]; + const getterName = 'g' + setterName.substr(1); + const value = now[getterName](); + date[setterName](value); +}; + +const getShortPatterns = function(fullPatterns) { + return fullPatterns.map(function(pattern) { + if(pattern[0] === '\'') { + return ''; + } else { + return pattern[0] === 'H' ? 'h' : pattern[0]; + } + }); +}; + +const getMaxOrderedPatternIndex = function(patterns) { + const indexes = patterns.map(function(pattern) { + return ORDERED_PATTERNS.indexOf(pattern); + }); + + return Math.max.apply(Math, indexes); +}; + +const getOrderedFormatPatterns = function(formatPatterns) { + const otherPatterns = formatPatterns.filter(function(pattern) { + return ORDERED_PATTERNS.indexOf(pattern) < 0; + }); + + return ORDERED_PATTERNS.concat(otherPatterns); +}; + +export const getParser = function(format, dateParts) { + const regExpInfo = getRegExpInfo(format, dateParts); + + return function(text) { + const regExpResult = regExpInfo.regexp.exec(text); + + if(regExpResult) { + const now = new Date(); + const date = new Date(now.getFullYear(), 0, 1); + const formatPatterns = getShortPatterns(regExpInfo.patterns); + const maxPatternIndex = getMaxOrderedPatternIndex(formatPatterns); + const orderedFormatPatterns = getOrderedFormatPatterns(formatPatterns); + const datePartValues = { }; + + orderedFormatPatterns.forEach(function(pattern, index) { + if(!pattern || (index < ORDERED_PATTERNS.length && index > maxPatternIndex)) { + return; + } + + const patternIndex = formatPatterns.indexOf(pattern); + if(patternIndex >= 0) { + const regExpPattern = regExpInfo.patterns[patternIndex]; + const regExpText = regExpResult[patternIndex + 1]; + setPatternPart(date, regExpPattern, regExpText, dateParts, datePartValues); + } else { + setPatternPartFromNow(date, pattern, now); + } + }); + + return date; + } + + return null; + }; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/number.js b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/number.js new file mode 100644 index 0000000000000000000000000000000000000000..cacdc0d95488dc87a32c9c42aa03bf3e046bb5b1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/ldml/number.js @@ -0,0 +1,223 @@ +import { fitIntoRange } from '../../core/utils/math'; +import { toFixed } from '../utils'; + +const DEFAULT_CONFIG = { thousandsSeparator: ',', decimalSeparator: '.' }; +const ESCAPING_CHAR = '\''; +const MAXIMUM_NUMBER_LENGTH = 15; + +function getGroupSizes(formatString) { + return formatString.split(',').slice(1).map(function(str) { + return str.split('').filter(function(char) { + return char === '#' || char === '0'; + }).length; + }); +} + +function getSignParts(format) { + const signParts = format.split(';'); + + if(signParts.length === 1) { + signParts.push('-' + signParts[0]); + } + + return signParts; +} + +function reverseString(str) { + return str.toString().split('').reverse().join(''); +} + +function isPercentFormat(format) { + return format.indexOf('%') !== -1 && !format.match(/'[^']*%[^']*'/g); +} + +function removeStubs(str) { + return str.replace(/'.+'/g, ''); +} + +function getNonRequiredDigitCount(floatFormat) { + if(!floatFormat) return 0; + const format = removeStubs(floatFormat); + return format.length - format.replace(/[#]/g, '').length; +} + +function getRequiredDigitCount(floatFormat) { + if(!floatFormat) return 0; + const format = removeStubs(floatFormat); + return format.length - format.replace(/[0]/g, '').length; +} + +function normalizeValueString(valuePart, minDigitCount, maxDigitCount) { + if(!valuePart) return ''; + + if(valuePart.length > maxDigitCount) { + valuePart = valuePart.substr(0, maxDigitCount); + } + + while(valuePart.length > minDigitCount && valuePart.slice(-1) === '0') { + valuePart = valuePart.substr(0, valuePart.length - 1); + } + + while(valuePart.length < minDigitCount) { + valuePart += '0'; + } + + return valuePart; +} + +function applyGroups(valueString, groupSizes, thousandsSeparator) { + if(!groupSizes.length) return valueString; + + const groups = []; + let index = 0; + + while(valueString) { + const groupSize = groupSizes[index]; + if(!groupSize) { + break; + } + groups.push(valueString.slice(0, groupSize)); + valueString = valueString.slice(groupSize); + if(index < groupSizes.length - 1) { + index++; + } + } + return groups.join(thousandsSeparator); +} + +function formatNumberPart(format, valueString) { + return format.split(ESCAPING_CHAR).map(function(formatPart, escapeIndex) { + const isEscape = escapeIndex % 2; + if(!formatPart && isEscape) { + return ESCAPING_CHAR; + } + return isEscape ? formatPart : formatPart.replace(/[,#0]+/, valueString); + }).join(''); +} + +function getFloatPointIndex(format) { + let isEscape = false; + + for(let index = 0; index < format.length; index++) { + if(format[index] === '\'') { + isEscape = !isEscape; + } + if(format[index] === '.' && !isEscape) { + return index; + } + } + + return format.length; +} + +export function getFormatter(format, config) { + config = config || DEFAULT_CONFIG; + + return function(value) { + if(typeof value !== 'number' || isNaN(value)) return ''; + + const signFormatParts = getSignParts(format); + const isPositiveZero = 1 / value === Infinity; + const isPositive = value > 0 || isPositiveZero; + const numberFormat = signFormatParts[isPositive ? 0 : 1]; + + if(isPercentFormat(numberFormat)) { + value = value * 100; + } + + if(!isPositive) { + value = -value; + } + + const floatPointIndex = getFloatPointIndex(numberFormat); + const floatFormatParts = [numberFormat.substr(0, floatPointIndex), numberFormat.substr(floatPointIndex + 1)]; + const minFloatPrecision = getRequiredDigitCount(floatFormatParts[1]); + const maxFloatPrecision = minFloatPrecision + getNonRequiredDigitCount(floatFormatParts[1]); + const minIntegerPrecision = getRequiredDigitCount(floatFormatParts[0]); + const maxIntegerPrecision = getNonRequiredDigitCount(floatFormatParts[0]) || config.unlimitedIntegerDigits ? undefined : minIntegerPrecision; + const integerLength = Math.floor(value).toString().length; + const floatPrecision = fitIntoRange(maxFloatPrecision, 0, MAXIMUM_NUMBER_LENGTH - integerLength); + const groupSizes = getGroupSizes(floatFormatParts[0]).reverse(); + + const valueParts = toFixed(value, floatPrecision < 0 ? 0 : floatPrecision).split('.'); + + let valueIntegerPart = normalizeValueString(reverseString(valueParts[0]), minIntegerPrecision, maxIntegerPrecision); + const valueFloatPart = normalizeValueString(valueParts[1], minFloatPrecision, maxFloatPrecision); + + valueIntegerPart = applyGroups(valueIntegerPart, groupSizes, config.thousandsSeparator); + + const integerString = reverseString(formatNumberPart(reverseString(floatFormatParts[0]), valueIntegerPart)); + const floatString = maxFloatPrecision ? formatNumberPart(floatFormatParts[1], valueFloatPart) : ''; + + const result = integerString + (floatString.match(/\d/) ? config.decimalSeparator : '') + floatString; + + return result; + }; +} + +function parseValue(text, isPercent, isNegative) { + const value = (isPercent ? 0.01 : 1) * parseFloat(text) || 0; + + return isNegative ? -value : value; +} + +function prepareValueText(valueText, formatter, isPercent, isIntegerPart) { + let nextValueText = valueText; + let char; + let text; + let nextText; + + do { + if(nextText) { + char = text.length === nextText.length ? '0' : '1'; + valueText = isIntegerPart ? char + valueText : valueText + char; + } + text = nextText || formatter(parseValue(nextValueText, isPercent)); + nextValueText = isIntegerPart ? '1' + nextValueText : nextValueText + '1'; + nextText = formatter(parseValue(nextValueText, isPercent)); + } while(text !== nextText && (isIntegerPart ? text.length === nextText.length : text.length <= nextText.length)); + + if(isIntegerPart && nextText.length > text.length) { + const hasGroups = formatter(12345).indexOf('12345') === -1; + do { + valueText = '1' + valueText; + } while(hasGroups && parseValue(valueText, isPercent) < 100000); + } + + return valueText; +} + +function getFormatByValueText(valueText, formatter, isPercent, isNegative) { + let format = formatter(parseValue(valueText, isPercent, isNegative)); + const valueTextParts = valueText.split('.'); + const valueTextWithModifiedFloat = valueTextParts[0] + '.3' + valueTextParts[1].slice(1); + const valueWithModifiedFloat = parseValue(valueTextWithModifiedFloat, isPercent, isNegative); + const decimalSeparatorIndex = formatter(valueWithModifiedFloat).indexOf('3') - 1; + + format = format.replace(/(\d)\D(\d)/g, '$1,$2'); + + if(decimalSeparatorIndex >= 0) { + format = format.slice(0, decimalSeparatorIndex) + '.' + format.slice(decimalSeparatorIndex + 1); + } + + format = format.replace(/1+/, '1').replace(/1/g, '#'); + + if(!isPercent) { + format = format.replace('%', '\'%\''); // lgtm[js/incomplete-sanitization] + } + + return format; +} + +export function getFormat(formatter) { + let valueText = '.'; + const isPercent = formatter(1).indexOf('100') >= 0; + + valueText = prepareValueText(valueText, formatter, isPercent, true); + valueText = prepareValueText(valueText, formatter, isPercent, false); + + const positiveFormat = getFormatByValueText(valueText, formatter, isPercent, false); + const negativeFormat = getFormatByValueText(valueText, formatter, isPercent, true); + + return negativeFormat === '-' + positiveFormat ? positiveFormat : positiveFormat + ';' + negativeFormat; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/message.d.ts b/packages/f-theme-editor/farris-theme-editor/js/localization/message.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..35fd53c0e3cab1926108ad01c4ee264674d62c7a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/message.d.ts @@ -0,0 +1,6 @@ +type messageLocalizationType = { + getFormatter(name: string): () => string; + format(name: string): string; +}; +declare const messageLocalization: messageLocalizationType; +export default messageLocalization; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/message.js b/packages/f-theme-editor/farris-theme-editor/js/localization/message.js new file mode 100644 index 0000000000000000000000000000000000000000..0bc3a97bc2ded7c35b784b67e9caaf16df6751fd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/message.js @@ -0,0 +1,121 @@ +import $ from '../core/renderer'; +import dependencyInjector from '../core/utils/dependency_injector'; +import { extend } from '../core/utils/extend'; +import { each } from '../core/utils/iterator'; +import { format as stringFormat } from '../core/utils/string'; +import { humanize } from '../core/utils/inflector'; +import coreLocalization from './core'; +import { defaultMessages } from './default_messages'; + +const baseDictionary = extend(true, {}, defaultMessages); + +const getDataByLocale = (localeData, locale) => { + return localeData[locale] || {}; +}; + +const newMessages = {}; + +const messageLocalization = dependencyInjector({ + engine: function() { + return 'base'; + }, + + _dictionary: baseDictionary, + + load: function(messages) { + extend(true, this._dictionary, messages); + }, + + _localizablePrefix: '@', + + setup: function(localizablePrefix) { + this._localizablePrefix = localizablePrefix; + }, + + localizeString: function(text) { + const that = this; + const regex = new RegExp('(^|[^a-zA-Z_0-9' + that._localizablePrefix + '-]+)(' + that._localizablePrefix + '{1,2})([a-zA-Z_0-9-]+)', 'g'); + const escapeString = that._localizablePrefix + that._localizablePrefix; + + return text.replace(regex, (str, prefix, escape, localizationKey) => { + const defaultResult = that._localizablePrefix + localizationKey; + let result; + + if(escape !== escapeString) { + result = that.format(localizationKey); + } + + if(!result) { + newMessages[localizationKey] = humanize(localizationKey); + } + + return prefix + (result || defaultResult); + }); + }, + + localizeNode: function(node) { + const that = this; + + $(node).each((index, nodeItem) => { + if(!nodeItem.nodeType) { + return; + } + + if(nodeItem.nodeType === 3) { + nodeItem.nodeValue = that.localizeString(nodeItem.nodeValue); + } else { + if(!$(nodeItem).is('iframe')) { // T199912 + each(nodeItem.attributes || [], (index, attr) => { + if(typeof attr.value === 'string') { + const localizedValue = that.localizeString(attr.value); + + if(attr.value !== localizedValue) { + attr.value = localizedValue; + } + } + }); + + $(nodeItem).contents().each((index, node) => { + that.localizeNode(node); + }); + } + } + }); + }, + + getMessagesByLocales: function() { + return this._dictionary; + }, + + getDictionary: function(onlyNew) { + if(onlyNew) { + return newMessages; + } + return extend({}, newMessages, this.getMessagesByLocales()[coreLocalization.locale()]); + }, + + getFormatter: function(key) { + return this._getFormatterBase(key) || this._getFormatterBase(key, 'en'); + }, + + _getFormatterBase: function(key, locale) { + const message = coreLocalization.getValueByClosestLocale((locale) => getDataByLocale(this._dictionary, locale)[key]); + + if(message) { + return function() { + const args = arguments.length === 1 && Array.isArray(arguments[0]) ? arguments[0].slice(0) : Array.prototype.slice.call(arguments, 0); + args.unshift(message); + return stringFormat.apply(this, args); + }; + } + }, + + format: function(key) { + const formatter = this.getFormatter(key); + const values = Array.prototype.slice.call(arguments, 1); + + return formatter && formatter.apply(this, values) || ''; + } +}); + +export default messageLocalization; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/cs.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/cs.json new file mode 100644 index 0000000000000000000000000000000000000000..b8f46d530ee6f8a47e7e1b14f77399a3dfb6e028 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/cs.json @@ -0,0 +1,558 @@ +{ + "cs": { + "Yes": "Ano", + "No": "Ne", + "Cancel": "Zrušit", + "Clear": "Smazat", + "Done": "Hotovo", + "Loading": "Nahrávání...", + "Select": "Výběr...", + "Search": "Hledat", + "Back": "Zpět", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Žádná data k zobrazení", + + "dxDropDownEditor-selectLabel": "Výběr", + + "validation-required": "povinné", + "validation-required-formatted": "{0} je povinných", + "validation-numeric": "Hodnota musí být číslo", + "validation-numeric-formatted": "{0} musí být číslo", + "validation-range": "Hodnota je mimo rozsah", + "validation-range-formatted": "{0} je mimo rozsah", + "validation-stringLength": "Délka textového řetezce není správná", + "validation-stringLength-formatted": "Délka textu {0} není správná", + "validation-custom": "Neplatná hodnota", + "validation-custom-formatted": "{0} je neplatných", + "validation-async": "Neplatná hodnota", + "validation-async-formatted": "{0} je neplatných", + "validation-compare": "Hodnoty se neshodují", + "validation-compare-formatted": "{0} se neshoduje", + "validation-pattern": "Hodnota neodpovídá vzoru", + "validation-pattern-formatted": "{0} neodpovídá vzoru", + "validation-email": "Neplatný email", + "validation-email-formatted": "{0} není platný", + "validation-mask": "Hodnota není platná", + + "dxLookup-searchPlaceholder": "Minimální počet znaků: {0}", + + "dxList-pullingDownText": "Stáhněte dolů pro obnovení...", + "dxList-pulledDownText": "Uvolněte pro obnovení...", + "dxList-refreshingText": "Obnovuji...", + "dxList-pageLoadingText": "Nahrávám...", + "dxList-nextButtonText": "Více", + "dxList-selectAll": "Vybrat vše", + "dxListEditDecorator-delete": "Smazat", + "dxListEditDecorator-more": "Více", + + "dxScrollView-pullingDownText": "Stáhněte dolů pro obnovení...", + "dxScrollView-pulledDownText": "Uvolněte pro obnovení...", + "dxScrollView-refreshingText": "Obnovuji...", + "dxScrollView-reachBottomText": "Nahrávám...", + + "dxDateBox-simulatedDataPickerTitleTime": "Vyberte čas", + "dxDateBox-simulatedDataPickerTitleDate": "Vyberte datum", + "dxDateBox-simulatedDataPickerTitleDateTime": "Vyberte datum a čas", + "dxDateBox-validation-datetime": "Hodnota musí být datum nebo čas", + + "dxFileUploader-selectFile": "Vyberte soubor", + "dxFileUploader-dropFile": "nebo přeneste soubor sem", + "dxFileUploader-bytes": "bytů", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Nahrát", + "dxFileUploader-uploaded": "Nahráno", + "dxFileUploader-readyToUpload": "Připraveno k nahrání", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Nahrávání selhalo", + "dxFileUploader-invalidFileExtension": "", + "dxFileUploader-invalidMaxFileSize": "", + "dxFileUploader-invalidMinFileSize": "", + + "dxRangeSlider-ariaFrom": "Od", + "dxRangeSlider-ariaTill": "Do", + "dxSwitch-switchedOnText": "ZAP", + "dxSwitch-switchedOffText": "VYP", + + "dxForm-optionalMark": "volitelný", + "dxForm-requiredMessage": "{0} je vyžadováno", + + "dxNumberBox-invalidValueMessage": "Hodnota musí být číslo", + "dxNumberBox-noDataText": "Žádná data", + + "dxDataGrid-columnChooserTitle": "Výběr sloupců", + "dxDataGrid-columnChooserEmptyText": "Přesuňte sloupec zde pro skytí", + "dxDataGrid-groupContinuesMessage": "Pokračovat na další straně", + "dxDataGrid-groupContinuedMessage": "Pokračování z předchozí strany", + "dxDataGrid-groupHeaderText": "Sloučit sloupce", + "dxDataGrid-ungroupHeaderText": "Oddělit", + "dxDataGrid-ungroupAllText": "Oddělit vše", + "dxDataGrid-editingEditRow": "Upravit", + "dxDataGrid-editingSaveRowChanges": "Uložit", + "dxDataGrid-editingCancelRowChanges": "Zrušit", + "dxDataGrid-editingDeleteRow": "Smazat", + "dxDataGrid-editingUndeleteRow": "Obnovit", + "dxDataGrid-editingConfirmDeleteMessage": "Opravdu chcete smazat tento záznam?", + "dxDataGrid-validationCancelChanges": "Zrušit změny", + "dxDataGrid-groupPanelEmptyText": "Přeneste hlavičku sloupce zde pro sloučení", + "dxDataGrid-noDataText": "Žádná data", + "dxDataGrid-searchPanelPlaceholder": "Hledání...", + "dxDataGrid-filterRowShowAllText": "(Vše)", + "dxDataGrid-filterRowResetOperationText": "Reset", + "dxDataGrid-filterRowOperationEquals": "Rovná se", + "dxDataGrid-filterRowOperationNotEquals": "Nerovná se", + "dxDataGrid-filterRowOperationLess": "Menší", + "dxDataGrid-filterRowOperationLessOrEquals": "Menší nebo rovno", + "dxDataGrid-filterRowOperationGreater": "Větší", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Větší nebo rovno", + "dxDataGrid-filterRowOperationStartsWith": "Začíná na", + "dxDataGrid-filterRowOperationContains": "Obsahuje", + "dxDataGrid-filterRowOperationNotContains": "Neobsahuje", + "dxDataGrid-filterRowOperationEndsWith": "Končí na", + "dxDataGrid-filterRowOperationBetween": "Mezi", + "dxDataGrid-filterRowOperationBetweenStartText": "Začíná", + "dxDataGrid-filterRowOperationBetweenEndText": "Končí", + "dxDataGrid-applyFilterText": "Použít filtr", + "dxDataGrid-trueText": "Platí", + "dxDataGrid-falseText": "Neplatí", + "dxDataGrid-sortingAscendingText": "Srovnat vzestupně", + "dxDataGrid-sortingDescendingText": "Srovnat sestupně", + "dxDataGrid-sortingClearText": "Zrušit rovnání", + "dxDataGrid-editingSaveAllChanges": "Uložit změny", + "dxDataGrid-editingCancelAllChanges": "Zrušit změny", + "dxDataGrid-editingAddRow": "Přidat řádek", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min {1} je {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max {1} je {0}", + "dxDataGrid-summaryAvg": "Prům.: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Průměr ze {1} je {0}", + "dxDataGrid-summarySum": "Suma: {0}", + "dxDataGrid-summarySumOtherColumn": "Suma {1} je {0}", + "dxDataGrid-summaryCount": "Počet: {0}", + "dxDataGrid-columnFixingFix": "Uchytit", + "dxDataGrid-columnFixingUnfix": "Uvolnit", + "dxDataGrid-columnFixingLeftPosition": "Vlevo", + "dxDataGrid-columnFixingRightPosition": "Vpravo", + "dxDataGrid-exportTo": "Export", + "dxDataGrid-exportToExcel": "Export do sešitu Excel", + "dxDataGrid-exporting": "Export...", + "dxDataGrid-excelFormat": "soubor Excel", + "dxDataGrid-selectedRows": "Vybrané řádky", + "dxDataGrid-exportSelectedRows": "Export vybraných řádků", + "dxDataGrid-exportAll": "Exportovat všechny záznamy", + "dxDataGrid-headerFilterEmptyValue": "(prázdné)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Zrušit", + "dxDataGrid-ariaColumn": "Sloupec", + "dxDataGrid-ariaValue": "Hodnota", + "dxDataGrid-ariaFilterCell": "Filtrovat buňku", + "dxDataGrid-ariaCollapse": "Sbalit", + "dxDataGrid-ariaExpand": "Rozbalit", + "dxDataGrid-ariaDataGrid": "Datová mřížka", + "dxDataGrid-ariaSearchInGrid": "Hledat v datové mřížce", + "dxDataGrid-ariaSelectAll": "Vybrat vše", + "dxDataGrid-ariaSelectRow": "Vybrat řádek", + "dxDataGrid-filterBuilderPopupTitle": "Tvorba Filtru", + "dxDataGrid-filterPanelCreateFilter": "Vytvořit Filtr", + "dxDataGrid-filterPanelClearFilter": "Smazat", + "dxDataGrid-filterPanelFilterEnabledHint": "Povolit Filtr", + + "dxTreeList-ariaTreeList": "Tree list", + "dxTreeList-editingAddRowToNode": "Přidat", + + "dxPager-infoText": "Strana {0} ze {1} ({2} položek)", + "dxPager-pagesCountText": "ze", + "dxPager-pageSizesAllText": "Vše", + + "dxPivotGrid-grandTotal": "Celkem", + "dxPivotGrid-total": "{0} Celkem", + "dxPivotGrid-fieldChooserTitle": "Výběr pole", + "dxPivotGrid-showFieldChooser": "Zobrazit výběr pole", + "dxPivotGrid-expandAll": "Rozbalit vše", + "dxPivotGrid-collapseAll": "Sbalit vše", + "dxPivotGrid-sortColumnBySummary": "Srovnat \"{0}\" podle tohoto sloupce", + "dxPivotGrid-sortRowBySummary": "Srovnat \"{0}\" podle tohoto řádku", + "dxPivotGrid-removeAllSorting": "Odstranit veškeré třídění", + "dxPivotGrid-dataNotAvailable": "nedostupné", + "dxPivotGrid-rowFields": "Pole řádků", + "dxPivotGrid-columnFields": "Pole sloupců", + "dxPivotGrid-dataFields": "Pole dat", + "dxPivotGrid-filterFields": "Filtrovat pole", + "dxPivotGrid-allFields": "Všechna pole", + "dxPivotGrid-columnFieldArea": "Zde vložte pole sloupců", + "dxPivotGrid-dataFieldArea": "Zde vložte pole dat", + "dxPivotGrid-rowFieldArea": "Zde vložte pole řádků", + "dxPivotGrid-filterFieldArea": "Zde vložte filtr pole", + + "dxScheduler-editorLabelTitle": "Předmět", + "dxScheduler-editorLabelStartDate": "Počáteční datum", + "dxScheduler-editorLabelEndDate": "Koncové datum", + "dxScheduler-editorLabelDescription": "Popis", + "dxScheduler-editorLabelRecurrence": "Opakovat", + + "dxScheduler-openAppointment": "Otevřít schůzku", + + "dxScheduler-recurrenceNever": "Nikdy", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Denně", + "dxScheduler-recurrenceWeekly": "Týdně", + "dxScheduler-recurrenceMonthly": "Měsíčně", + "dxScheduler-recurrenceYearly": "Ročně", + + "dxScheduler-recurrenceRepeatEvery": "Každý", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Konec opakování", + "dxScheduler-recurrenceAfter": "Po", + "dxScheduler-recurrenceOn": "Zap", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "dní", + "dxScheduler-recurrenceRepeatWeekly": "týdnů", + "dxScheduler-recurrenceRepeatMonthly": "měsíců", + "dxScheduler-recurrenceRepeatYearly": "roků", + + "dxScheduler-switcherDay": "Den", + "dxScheduler-switcherWeek": "Týden", + "dxScheduler-switcherWorkWeek": "Pracovní týden", + "dxScheduler-switcherMonth": "Měsíc", + + "dxScheduler-switcherAgenda": "Agenda", + + "dxScheduler-switcherTimelineDay": "Časová osa den", + "dxScheduler-switcherTimelineWeek": "Časová osa týden", + "dxScheduler-switcherTimelineWorkWeek": "Časová osa pracovní týden", + "dxScheduler-switcherTimelineMonth": "Časová osa měsíc", + + "dxScheduler-recurrenceRepeatOnDate": "na den", + "dxScheduler-recurrenceRepeatCount": "výskytů", + "dxScheduler-allDay": "Celý den", + + "dxScheduler-confirmRecurrenceEditMessage": "Chcete upravit pouze tuto schůzku nebo celou sérii?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Chcete smazat pouze tuto schůzku nebo celou sérii?", + + "dxScheduler-confirmRecurrenceEditSeries": "Upravit sérii", + "dxScheduler-confirmRecurrenceDeleteSeries": "Smazat sérii", + "dxScheduler-confirmRecurrenceEditOccurrence": "Upravit schůzku", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Smazat schůzku", + + "dxScheduler-noTimezoneTitle": "Bez časové zóny", + "dxScheduler-moreAppointments": "{0} navíc", + + "dxCalendar-todayButtonText": "Dnes", + "dxCalendar-ariaWidgetName": "Kalendář", + + "dxColorView-ariaRed": "Červená", + "dxColorView-ariaGreen": "Zelená", + "dxColorView-ariaBlue": "Modrá", + "dxColorView-ariaAlpha": "Průhledná", + "dxColorView-ariaHex": "Kód barvy", + + "dxTagBox-selected": "{0} vybráno", + "dxTagBox-allSelected": "Vše vybráno ({0})", + "dxTagBox-moreSelected": "{0} navíc", + + "vizExport-printingButtonText": "Tisk", + "vizExport-titleMenuText": "Export/import", + "vizExport-exportButtonText": "{0} souborů", + + "dxFilterBuilder-and": "A", + "dxFilterBuilder-or": "NEBO", + "dxFilterBuilder-notAnd": "NAND", + "dxFilterBuilder-notOr": "NOR", + "dxFilterBuilder-addCondition": "Přidat podmínku", + "dxFilterBuilder-addGroup": "Přidat skupinu", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Rovná se", + "dxFilterBuilder-filterOperationNotEquals": "Nerovná se", + "dxFilterBuilder-filterOperationLess": "Menší než", + "dxFilterBuilder-filterOperationLessOrEquals": "Menší nebo rovno než", + "dxFilterBuilder-filterOperationGreater": "Větší než", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Větší nebo rovno než", + "dxFilterBuilder-filterOperationStartsWith": "Začíná na", + "dxFilterBuilder-filterOperationContains": "Obsahuje", + "dxFilterBuilder-filterOperationNotContains": "Neobsahuje", + "dxFilterBuilder-filterOperationEndsWith": "Končí na", + "dxFilterBuilder-filterOperationIsBlank": "Je prázdné", + "dxFilterBuilder-filterOperationIsNotBlank": "Není prázdné", + "dxFilterBuilder-filterOperationBetween": "Mezi", + "dxFilterBuilder-filterOperationAnyOf": "Libovolný z", + "dxFilterBuilder-filterOperationNoneOf": "Žádný z", + + "dxHtmlEditor-dialogColorCaption": "!TODO!", + "dxHtmlEditor-dialogBackgroundCaption": "!TODO!", + "dxHtmlEditor-dialogLinkCaption": "!TODO!", + "dxHtmlEditor-dialogLinkUrlField": "!TODO!", + "dxHtmlEditor-dialogLinkTextField": "!TODO!", + "dxHtmlEditor-dialogLinkTargetField": "!TODO!", + "dxHtmlEditor-dialogImageCaption": "!TODO!", + "dxHtmlEditor-dialogImageUrlField": "!TODO!", + "dxHtmlEditor-dialogImageAltField": "!TODO!", + "dxHtmlEditor-dialogImageWidthField": "!TODO!", + "dxHtmlEditor-dialogImageHeightField": "!TODO!", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "!TODO!", + "dxHtmlEditor-normalText": "!TODO!", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Srovnat vzestupně", + "dxGantt-sortingDescendingText": "Srovnat sestupně", + "dxGantt-sortingClearText": "Zrušit rovnání", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/de.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/de.json new file mode 100644 index 0000000000000000000000000000000000000000..07bf018f8fdc4c790c32aae029ae04e564634dda --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/de.json @@ -0,0 +1,611 @@ +{ + "de": { + "Yes": "Ja", + "No": "Nein", + "Cancel": "Abbrechen", + "Clear": "Löschen", + "Done": "Fertig", + "Loading": "Laden...", + "Select": "Auswählen...", + "Search": "Suchen...", + "Back": "Zurück", + "OK": "OK", + "dxCollectionWidget-noDataText": "Keine Daten verfügbar", + "dxDropDownEditor-selectLabel": "Auswählen", + "validation-required": "Pflichtfeld", + "validation-required-formatted": "{0} ist ein Pflichtfeld", + "validation-numeric": "Der Wert muss eine Zahl sein", + "validation-numeric-formatted": "{0} muss eine Zahl sein", + "validation-range": "Der Wert ist nicht im gültigen Bereich", + "validation-range-formatted": "{0} ist nicht im gültigen Bereich", + "validation-stringLength": "Die Länge des Wertes ist nicht korrekt", + "validation-stringLength-formatted": "Die Länge von {0} ist nicht korrekt", + "validation-custom": "Der Wert ist ungültig", + "validation-custom-formatted": "{0} ist ungültig", + "validation-async": "Der Wert ist ungültig", + "validation-async-formatted": "{0} ist ungültig", + "validation-compare": "Der Wert ist unpassend", + "validation-compare-formatted": "{0} ist unpassend", + "validation-pattern": "Der Wert passt nicht zum Muster", + "validation-pattern-formatted": "{0} passt nicht zum Muster", + "validation-email": "Die Email-Adresse ist ungültig", + "validation-email-formatted": "{0} ist ungültig", + "validation-mask": "Der Wert ist ungültig", + "dxLookup-searchPlaceholder": "Minimale Anzahl Zeichen: {0}", + "dxList-pullingDownText": "Zum Aktualisieren nach unten ziehen", + "dxList-pulledDownText": "Zum Aktualisieren loslassen", + "dxList-refreshingText": "Aktualisiere...", + "dxList-pageLoadingText": "Laden...", + "dxList-nextButtonText": "Mehr", + "dxList-selectAll": "Alles auswählen", + "dxListEditDecorator-delete": "Entfernen", + "dxListEditDecorator-more": "Mehr", + "dxScrollView-pullingDownText": "Zum Aktualisieren nach unten ziehen", + "dxScrollView-pulledDownText": "Zum Aktualisieren loslassen", + "dxScrollView-refreshingText": "Aktualisiere...", + "dxScrollView-reachBottomText": "Laden...", + "dxDateBox-simulatedDataPickerTitleTime": "Zeit auswählen", + "dxDateBox-simulatedDataPickerTitleDate": "Datum auswählen", + "dxDateBox-simulatedDataPickerTitleDateTime": "Datum und Zeit auswählen", + "dxDateBox-validation-datetime": "Der Wert muss ein Datum oder eine Uhrzeit sein", + "dxFileUploader-selectFile": "Datei auswählen", + "dxFileUploader-dropFile": "oder hierher ziehen", + "dxFileUploader-bytes": "Bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Hochladen", + "dxFileUploader-uploaded": "Hochgeladen", + "dxFileUploader-readyToUpload": "Bereit zum hochladen", + "dxFileUploader-uploadAbortedMessage": "Upload abgebrochen", + "dxFileUploader-uploadFailedMessage": "Fehler beim hochladen", + "dxFileUploader-invalidFileExtension": "Unzulässiger Dateityp", + "dxFileUploader-invalidMaxFileSize": "Datei ist zu groß", + "dxFileUploader-invalidMinFileSize": "Datei ist zu klein", + "dxRangeSlider-ariaFrom": "Von", + "dxRangeSlider-ariaTill": "Bis", + "dxSwitch-switchedOnText": "EIN", + "dxSwitch-switchedOffText": "AUS", + "dxForm-optionalMark": "optional", + "dxForm-requiredMessage": "{0} ist ein Pflichtfeld", + "dxNumberBox-invalidValueMessage": "Der Wert muss eine Zahl sein", + "dxNumberBox-noDataText": "Keine Daten", + "dxDataGrid-columnChooserTitle": "Spaltenauswahl", + "dxDataGrid-columnChooserEmptyText": "Ziehen Sie Spalten hierhin, um sie zu verstecken", + "dxDataGrid-groupContinuesMessage": "Weiter auf der nächsten Seite", + "dxDataGrid-groupContinuedMessage": "Weiter von der vorherigen Seite", + "dxDataGrid-groupHeaderText": "Nach dieser Spalte gruppieren", + "dxDataGrid-ungroupHeaderText": "Gruppierung entfernen", + "dxDataGrid-ungroupAllText": "Alle Gruppierungen entfernen", + "dxDataGrid-editingEditRow": "Bearbeiten", + "dxDataGrid-editingSaveRowChanges": "Speichern", + "dxDataGrid-editingCancelRowChanges": "Abbrechen", + "dxDataGrid-editingDeleteRow": "Entfernen", + "dxDataGrid-editingUndeleteRow": "Wiederherstellen", + "dxDataGrid-editingConfirmDeleteMessage": "Sind Sie sicher, dass Sie diesen Datensatz löschen wollen?", + "dxDataGrid-validationCancelChanges": "Änderungen verwerfen", + "dxDataGrid-groupPanelEmptyText": "Ziehen Sie eine Spalte hierhin, um danach zu gruppieren", + "dxDataGrid-noDataText": "Keine Daten", + "dxDataGrid-searchPanelPlaceholder": "Suchen...", + "dxDataGrid-filterRowShowAllText": "(Alle)", + "dxDataGrid-filterRowResetOperationText": "Zurücksetzen", + "dxDataGrid-filterRowOperationEquals": "Ist gleich", + "dxDataGrid-filterRowOperationNotEquals": "Ist nicht gleich", + "dxDataGrid-filterRowOperationLess": "Kleiner als", + "dxDataGrid-filterRowOperationLessOrEquals": "Kleiner oder gleich", + "dxDataGrid-filterRowOperationGreater": "Größer als", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Größer oder gleich", + "dxDataGrid-filterRowOperationStartsWith": "Beginnt mit", + "dxDataGrid-filterRowOperationContains": "Enthält", + "dxDataGrid-filterRowOperationNotContains": "Enthält nicht", + "dxDataGrid-filterRowOperationEndsWith": "Endet mit", + "dxDataGrid-filterRowOperationBetween": "Zwischen", + "dxDataGrid-filterRowOperationBetweenStartText": "Anfang", + "dxDataGrid-filterRowOperationBetweenEndText": "Ende", + "dxDataGrid-applyFilterText": "Filter anwenden", + "dxDataGrid-trueText": "wahr", + "dxDataGrid-falseText": "falsch", + "dxDataGrid-sortingAscendingText": "Aufsteigend sortieren", + "dxDataGrid-sortingDescendingText": "Absteigend sortieren", + "dxDataGrid-sortingClearText": "Sortierung aufheben", + "dxDataGrid-editingSaveAllChanges": "Änderungen speichern", + "dxDataGrid-editingCancelAllChanges": "Änderungen verwerfen", + "dxDataGrid-editingAddRow": "Neue Zeile", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Minimum von {1} ist {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Maximum von {1} ist {0}", + "dxDataGrid-summaryAvg": "Ø: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Durchschnitt von {1} ist {0}", + "dxDataGrid-summarySum": "Summe: {0}", + "dxDataGrid-summarySumOtherColumn": "Summe von {1} ist {0}", + "dxDataGrid-summaryCount": "Anzahl: {0}", + "dxDataGrid-columnFixingFix": "Fixieren", + "dxDataGrid-columnFixingUnfix": "Lösen", + "dxDataGrid-columnFixingLeftPosition": "Nach links", + "dxDataGrid-columnFixingRightPosition": "Nach rechts", + "dxDataGrid-exportTo": "Exportieren", + "dxDataGrid-exportToExcel": "Exportieren als Excel-Datei", + "dxDataGrid-exporting": "Exportieren ...", + "dxDataGrid-excelFormat": "Excel-Datei", + "dxDataGrid-selectedRows": "Ausgewählte Zeilen", + "dxDataGrid-exportAll": "Alle Daten exportieren", + "dxDataGrid-exportSelectedRows": "Ausgewählte Zeilen exportieren", + "dxDataGrid-headerFilterEmptyValue": "(Leerwerte)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Abbrechen", + "dxDataGrid-ariaAdaptiveCollapse": "Zusätzliche Spalten verstecken", + "dxDataGrid-ariaAdaptiveExpand": "Zusätzliche Spalten anzeigen", + "dxDataGrid-ariaColumn": "Spalte", + "dxDataGrid-ariaValue": "Wert", + "dxDataGrid-ariaFilterCell": "Filterzelle", + "dxDataGrid-ariaCollapse": "Zusammenklappen", + "dxDataGrid-ariaExpand": "Aufklappen", + "dxDataGrid-ariaDataGrid": "Datentabelle", + "dxDataGrid-ariaSearchInGrid": "Suchen in der Datentabelle", + "dxDataGrid-ariaSelectAll": "Alle auswählen", + "dxDataGrid-ariaSelectRow": "Zeile auswählen", + "dxDataGrid-ariaToolbar": "Symbolleiste der Datentabelle", + "dxDataGrid-filterBuilderPopupTitle": "Filter-Generator", + "dxDataGrid-filterPanelCreateFilter": "Filter erzeugen", + "dxDataGrid-filterPanelClearFilter": "Zurücksetzen", + "dxDataGrid-filterPanelFilterEnabledHint": "Filter aktivieren", + "dxTreeList-ariaTreeList": "Strukturliste", + "dxTreeList-ariaSearchInGrid": "Suchen in der Strukturliste", + "dxTreeList-ariaToolbar": "Symbolleiste der Strukturliste", + "dxTreeList-editingAddRowToNode": "Hinzufügen", + "dxPager-infoText": "Seite {0} von {1} ({2} Elemente)", + "dxPager-pagesCountText": "von", + "dxPager-pageSizesAllText": "Alle", + "dxPivotGrid-grandTotal": "Gesamt", + "dxPivotGrid-total": "{0} Gesamt", + "dxPivotGrid-fieldChooserTitle": "Feldauswahl", + "dxPivotGrid-showFieldChooser": "Feldauswahl anzeigen", + "dxPivotGrid-expandAll": "Alle aufklappen", + "dxPivotGrid-collapseAll": "Alle zusammenklappen", + "dxPivotGrid-sortColumnBySummary": "\"{0}\" nach dieser Spalte sortieren", + "dxPivotGrid-sortRowBySummary": "\"{0}\" nach dieser Zeile sortieren", + "dxPivotGrid-removeAllSorting": "Sortierungen entfernen", + "dxPivotGrid-dataNotAvailable": "Entf.", + "dxPivotGrid-rowFields": "Zeilenfelder", + "dxPivotGrid-columnFields": "Spaltenfelder", + "dxPivotGrid-dataFields": "Datenfelder", + "dxPivotGrid-filterFields": "Filterfelder", + "dxPivotGrid-allFields": "Alle Felder", + "dxPivotGrid-columnFieldArea": "Spaltenfelder hierher ziehen", + "dxPivotGrid-dataFieldArea": "Datenfelder hierher ziehen", + "dxPivotGrid-rowFieldArea": "Zeilenfelder hierher ziehen", + "dxPivotGrid-filterFieldArea": "Filterfelder hierher ziehen", + "dxScheduler-editorLabelTitle": "Betreff", + "dxScheduler-editorLabelStartDate": "Anfangszeit", + "dxScheduler-editorLabelEndDate": "Endzeit", + "dxScheduler-editorLabelDescription": "Beschreibung", + "dxScheduler-editorLabelRecurrence": "Wiederholen", + "dxScheduler-openAppointment": "Termin öffnen", + "dxScheduler-recurrenceNever": "Nie", + "dxScheduler-recurrenceMinutely": "Minütlich", + "dxScheduler-recurrenceHourly": "Stündlich", + "dxScheduler-recurrenceDaily": "Täglich", + "dxScheduler-recurrenceWeekly": "Wöchentlich", + "dxScheduler-recurrenceMonthly": "Monatlich", + "dxScheduler-recurrenceYearly": "Jährlich", + "dxScheduler-recurrenceRepeatEvery": "Wiederholen alle", + "dxScheduler-recurrenceRepeatOn": "Wiederholen an", + "dxScheduler-recurrenceEnd": "Wiederholungsende", + "dxScheduler-recurrenceAfter": "Nach", + "dxScheduler-recurrenceOn": "Am", + "dxScheduler-recurrenceRepeatMinutely": "Minute(n)", + "dxScheduler-recurrenceRepeatHourly": "Stunde(n)", + "dxScheduler-recurrenceRepeatDaily": "Tag(e)", + "dxScheduler-recurrenceRepeatWeekly": "Woche(n)", + "dxScheduler-recurrenceRepeatMonthly": "Monat(e)", + "dxScheduler-recurrenceRepeatYearly": "Jahr(e)", + "dxScheduler-switcherDay": "Tag", + "dxScheduler-switcherWeek": "Woche", + "dxScheduler-switcherWorkWeek": "Arbeitswoche", + "dxScheduler-switcherMonth": "Monat", + "dxScheduler-switcherTimelineDay": "Zeitstrahl Tag", + "dxScheduler-switcherTimelineWeek": "Zeitstrahl Woche", + "dxScheduler-switcherTimelineWorkWeek": "Zeitstrahl Arbeitswoche", + "dxScheduler-switcherTimelineMonth": "Zeitstrahl Monat", + "dxScheduler-switcherAgenda": "Agenda", + "dxScheduler-recurrenceRepeatOnDate": "am Datum", + "dxScheduler-recurrenceRepeatCount": "Ereignisse", + "dxScheduler-allDay": "Ganztägig", + "dxScheduler-confirmRecurrenceEditMessage": "Möchten Sie nur diesen Termin bearbeiten, oder die gesamte Serie?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Möchten Sie nur diesen Termin löschen, oder die gesamte Serie?", + "dxScheduler-confirmRecurrenceEditSeries": "Serie bearbeiten", + "dxScheduler-confirmRecurrenceDeleteSeries": "Serie löschen", + "dxScheduler-confirmRecurrenceEditOccurrence": "Termin bearbeiten", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Termin löschen", + "dxScheduler-noTimezoneTitle": "Keine Zeitzone", + "dxScheduler-moreAppointments": "{0} weitere", + "dxCalendar-todayButtonText": "Heute", + "dxCalendar-ariaWidgetName": "Kalendar", + "dxColorView-ariaRed": "Rot", + "dxColorView-ariaGreen": "Grün", + "dxColorView-ariaBlue": "Blau", + "dxColorView-ariaAlpha": "Transparenz", + "dxColorView-ariaHex": "Farbwert", + "dxTagBox-selected": "{0} ausgewählt", + "dxTagBox-allSelected": "Alle ausgewählt ({0})", + "dxTagBox-moreSelected": "{0} weitere", + "vizExport-printingButtonText": "Drucken", + "vizExport-titleMenuText": "Export/Druck", + "vizExport-exportButtonText": "{0}-Datei", + "dxFilterBuilder-and": "Und", + "dxFilterBuilder-or": "Oder", + "dxFilterBuilder-notAnd": "Nicht Und", + "dxFilterBuilder-notOr": "Nicht Oder", + "dxFilterBuilder-addCondition": "Bedingung hinzufügen", + "dxFilterBuilder-addGroup": "Gruppe hinzufügen", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Ist gleich", + "dxFilterBuilder-filterOperationNotEquals": "Ist nicht gleich", + "dxFilterBuilder-filterOperationLess": "Kleiner als", + "dxFilterBuilder-filterOperationLessOrEquals": "Kleiner oder gleich", + "dxFilterBuilder-filterOperationGreater": "Größer als", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Größer oder gleich", + "dxFilterBuilder-filterOperationStartsWith": "Beginnt mit", + "dxFilterBuilder-filterOperationContains": "Enthält", + "dxFilterBuilder-filterOperationNotContains": "Enthält nicht", + "dxFilterBuilder-filterOperationEndsWith": "Endet mit", + "dxFilterBuilder-filterOperationIsBlank": "Ist leer", + "dxFilterBuilder-filterOperationIsNotBlank": "Ist nicht leer", + "dxFilterBuilder-filterOperationBetween": "Zwischen", + "dxFilterBuilder-filterOperationAnyOf": "Ist enthalten in", + "dxFilterBuilder-filterOperationNoneOf": "Ist nicht enthalten in", + + "dxHtmlEditor-dialogColorCaption": "Schriftfarbe ändern", + "dxHtmlEditor-dialogBackgroundCaption": "Hintergrundfarbe ändern", + "dxHtmlEditor-dialogLinkCaption": "Link hinzufügen", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Text", + "dxHtmlEditor-dialogLinkTargetField": "Link in neuem Fenster öffnen", + "dxHtmlEditor-dialogImageCaption": "Bild hinzufügen", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Alternativer Text", + "dxHtmlEditor-dialogImageWidthField": "Breite (px)", + "dxHtmlEditor-dialogImageHeightField": "Bildhöhe (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "Zeilen", + "dxHtmlEditor-dialogInsertTableColumnsField": "Spalten", + "dxHtmlEditor-dialogInsertTableCaption": "Tabelle einfügen", + "dxHtmlEditor-heading": "Überschrift", + "dxHtmlEditor-normalText": "Normaler Text", + "dxHtmlEditor-background": "Hintergrundfarbe", + "dxHtmlEditor-bold": "Fett", + "dxHtmlEditor-color": "Schriftfarbe", + "dxHtmlEditor-font": "Schriftart", + "dxHtmlEditor-italic": "Kursiv", + "dxHtmlEditor-link": "Link hinzufügen", + "dxHtmlEditor-image": "Bild hinzufügen", + "dxHtmlEditor-size": "Schriftgröße", + "dxHtmlEditor-strike": "Durchgestrichen", + "dxHtmlEditor-subscript": "Tiefgestellt", + "dxHtmlEditor-superscript": "Hochgestellt", + "dxHtmlEditor-underline": "Unterstrichen", + "dxHtmlEditor-blockquote": "Blockzitat", + "dxHtmlEditor-header": "Kopfzeile", + "dxHtmlEditor-increaseIndent": "Einzug vergrößern", + "dxHtmlEditor-decreaseIndent": "Einzug verkleinern", + "dxHtmlEditor-orderedList": "Sortierte Liste", + "dxHtmlEditor-bulletList": "Aufzählung", + "dxHtmlEditor-alignLeft": "Linksbündig", + "dxHtmlEditor-alignCenter": "Zentriert", + "dxHtmlEditor-alignRight": "Rechtsbündig", + "dxHtmlEditor-alignJustify": "Blocksatz", + "dxHtmlEditor-codeBlock": "Codeblock", + "dxHtmlEditor-variable": "Variable hinzufügen", + "dxHtmlEditor-undo": "Rückgängig", + "dxHtmlEditor-redo": "Wiederholen", + "dxHtmlEditor-clear": "Formate löschen", + "dxHtmlEditor-insertTable": "Tabelle einfügen", + "dxHtmlEditor-insertHeaderRow": "Kopfzeile einfügen", + "dxHtmlEditor-insertRowAbove": "Spalte oberhalb einfügen", + "dxHtmlEditor-insertRowBelow": "Spalte unterhalb einfügen", + "dxHtmlEditor-insertColumnLeft": "Spalte links einfügen", + "dxHtmlEditor-insertColumnRight": "Spalte rechts einfügen", + "dxHtmlEditor-deleteColumn": "Spalte löschen", + "dxHtmlEditor-deleteRow": "Zeile löschen", + "dxHtmlEditor-deleteTable": "Tabelle löschen", + "dxHtmlEditor-cellProperties": "Zelleneigenschaften", + "dxHtmlEditor-tableProperties": "Tabelleneigenschaften", + "dxHtmlEditor-insert": "Einfügen", + "dxHtmlEditor-delete": "Löschen", + "dxHtmlEditor-border": "Rahmen", + "dxHtmlEditor-style": "Stil", + "dxHtmlEditor-width": "Breite", + "dxHtmlEditor-height": "Höhe", + "dxHtmlEditor-borderColor": "Farbe", + "dxHtmlEditor-tableBackground": "Hintergrund", + "dxHtmlEditor-dimensions": "Abmessungen", + "dxHtmlEditor-alignment": "Ausrichtung", + "dxHtmlEditor-horizontal": "Horizontal", + "dxHtmlEditor-vertical": "Vertikal", + "dxHtmlEditor-paddingVertical": "Vertikaler Abstand", + "dxHtmlEditor-paddingHorizontal": "Horizontaler Abstand", + "dxHtmlEditor-pixels": "Pixel", + "dxHtmlEditor-list": "Liste", + "dxHtmlEditor-ordered": "Sortiert", + "dxHtmlEditor-bullet": "Aufzählung", + "dxHtmlEditor-align": "Ausrichten", + "dxHtmlEditor-center": "Zentrieren", + "dxHtmlEditor-left": "Links", + "dxHtmlEditor-right": "Rechts", + "dxHtmlEditor-indent": "Einzug", + "dxHtmlEditor-justify": "Blocksatz", + + "dxFileManager-newDirectoryName": "Ohne Titel", + "dxFileManager-rootDirectoryName": "Dateien", + "dxFileManager-errorNoAccess": "Zugriff verweigert. Die Operation kann nicht durchgeführt werden.", + "dxFileManager-errorDirectoryExistsFormat": "Ordner {0} existiert bereits.", + "dxFileManager-errorFileExistsFormat": "Datei {0} existiert bereits.", + "dxFileManager-errorFileNotFoundFormat": "Datei {0} wurde nicht gefunden.", + "dxFileManager-errorDirectoryNotFoundFormat": "Verzeichnis '{0}' nicht gefunden.", + "dxFileManager-errorWrongFileExtension": "Dateierweiterung ist nicht erlaubt.", + "dxFileManager-errorMaxFileSizeExceeded": "Die Dateigröße übersteigt die maximal erlaubte Größe.", + "dxFileManager-errorInvalidSymbols": "Der Dateiname enthält ungültige Zeichen.", + "dxFileManager-errorDefault": "Unbekannter Fehler", + "dxFileManager-errorDirectoryOpenFailed": "Das Verzeichnis kann nicht geöffnet werden", + + "dxFileManager-commandCreate": "Neues Verzeichnis", + "dxFileManager-commandRename": "Umbenennen", + "dxFileManager-commandMove": "Verschieben nach", + "dxFileManager-commandCopy": "Kopieren nach", + "dxFileManager-commandDelete": "Löschen", + "dxFileManager-commandDownload": "Herunterladen", + "dxFileManager-commandUpload": "Dateien hochladen", + "dxFileManager-commandRefresh": "Aktualisieren", + "dxFileManager-commandThumbnails": "Miniaturansicht", + "dxFileManager-commandDetails": "Detailansicht", + "dxFileManager-commandClearSelection": "Auswahl aufheben", + "dxFileManager-commandShowNavPane": "Navigationsbereich ein-/ausschalten", + + "dxFileManager-dialogDirectoryChooserMoveTitle": "Verschieben nach", + "dxFileManager-dialogDirectoryChooserMoveButtonText": "Verschieben", + "dxFileManager-dialogDirectoryChooserCopyTitle": "Kopieren nach", + "dxFileManager-dialogDirectoryChooserCopyButtonText": "Kopieren", + "dxFileManager-dialogRenameItemTitle": "Umbenennen", + "dxFileManager-dialogRenameItemButtonText": "Speichern", + "dxFileManager-dialogCreateDirectoryTitle": "Neues Verzeichnis", + "dxFileManager-dialogCreateDirectoryButtonText": "Erstellen", + "dxFileManager-dialogDeleteItemTitle": "Löschen", + "dxFileManager-dialogDeleteItemButtonText": "Löschen", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "Sind Sie sicher, dass Sie {0} löschen möchten?", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "Sind Sie sicher, dass Sie {0} Elemente löschen möchten?", + "dxFileManager-dialogButtonCancel": "Abbrechen", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "Ein Verzeichnis wird in {0} erstellt", + "dxFileManager-editingCreateSingleItemSuccessMessage": "Ein Verzeichnis wurde in {0} erstellt", + "dxFileManager-editingCreateSingleItemErrorMessage": "Verzeichnis wurde nicht erstellt", + "dxFileManager-editingCreateCommonErrorMessage": "Verzeichnis wurde nicht erstellt", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "Ein Element in {0} wird umbenannt", + "dxFileManager-editingRenameSingleItemSuccessMessage": "Ein Element in {0} wurde umbenannt", + "dxFileManager-editingRenameSingleItemErrorMessage": "Element wurde nicht umbenannt", + "dxFileManager-editingRenameCommonErrorMessage": "Element wurde nicht umbenannt", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "Ein Element aus {0} wird gelöscht", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "{0} Elemente aus {1} werden gelöscht", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "Ein Element aus {0} wurde gelöscht", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "{0} Elemente aus {1} wurden gelöscht", + "dxFileManager-editingDeleteSingleItemErrorMessage": "Element wurde nicht gelöscht", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "{0} Elemente wurden nicht gelöscht", + "dxFileManager-editingDeleteCommonErrorMessage": "Einige Elemente wurden nicht gelöscht", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "Ein Element wird nach {0} verschoben", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "{0} Elemente werden nach {1} verschoben", + "dxFileManager-editingMoveSingleItemSuccessMessage": "Ein Element wurde nach {0} verschoben", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "{0} Elemente wurden nach {1} verschoben", + "dxFileManager-editingMoveSingleItemErrorMessage": "Element wurde nicht verschoben", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "{0} Elemente wurden nicht verschoben", + "dxFileManager-editingMoveCommonErrorMessage": "Einige Elemente wurden nicht verschoben", + + "dxFileManager-editingCopySingleItemProcessingMessage": "Ein Element wird nach {0} kopiert", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "{0} Elemente werden nach {1} kopiert", + "dxFileManager-editingCopySingleItemSuccessMessage": "Ein Element wurde nach {0} kopiert", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "{0} Elemente wurden nach {1} kopiert", + "dxFileManager-editingCopySingleItemErrorMessage": "Element wurde nicht kopiert", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "{0} Elemente wurden nicht kopiert", + "dxFileManager-editingCopyCommonErrorMessage": "Einige Elemente wurden nicht kopiert", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "Ein Element wird nach {0} hochgeladen", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "{0} Elemente werden nach {1} hochgeladen", + "dxFileManager-editingUploadSingleItemSuccessMessage": "Ein Element wurde nach {0} hochgeladen", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "{0} Elemente wurden nach {1} hochgeladen", + "dxFileManager-editingUploadSingleItemErrorMessage": "Element wurde nicht hochgeladen", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "{0} Elemente wurden nicht hochgeladen", + "dxFileManager-editingUploadCanceledMessage": "Abgebrochen", + + "dxFileManager-listDetailsColumnCaptionName": "Name", + "dxFileManager-listDetailsColumnCaptionDateModified": "Zuletzt geändert am", + "dxFileManager-listDetailsColumnCaptionFileSize": "Dateigröße", + + "dxFileManager-listThumbnailsTooltipTextSize": "Größe", + "dxFileManager-listThumbnailsTooltipTextDateModified": "Zuletzt geändert am", + + "dxFileManager-notificationProgressPanelTitle": "Fortschritt", + "dxFileManager-notificationProgressPanelEmptyListText": "Keine Vorgänge", + "dxFileManager-notificationProgressPanelOperationCanceled": "Abgebrochen", + + "dxDiagram-categoryGeneral": "Allgemein", + "dxDiagram-categoryFlowchart": "Flussdiagramm", + "dxDiagram-categoryOrgChart": "Organisationsdiagramm", + "dxDiagram-categoryContainers": "Container", + "dxDiagram-categoryCustom": "Benutzerdefiniert", + + "dxDiagram-commandExportToSvg": "Export als SVG", + "dxDiagram-commandExportToPng": "Export als PNG", + "dxDiagram-commandExportToJpg": "Export als JPEG", + "dxDiagram-commandUndo": "Rückgängig", + "dxDiagram-commandRedo": "Wiederherstellen", + "dxDiagram-commandFontName": "Schriftartname", + "dxDiagram-commandFontSize": "Schriftgröße", + "dxDiagram-commandBold": "Fett", + "dxDiagram-commandItalic": "Kursiv", + "dxDiagram-commandUnderline": "Unterstrichen", + "dxDiagram-commandTextColor": "Textfarbe", + "dxDiagram-commandLineColor": "Linienfarbe", + "dxDiagram-commandLineWidth": "Linienstärke", + "dxDiagram-commandLineStyle": "Linienart", + "dxDiagram-commandLineStyleSolid": "Durchgezogen", + "dxDiagram-commandLineStyleDotted": "Gepunktet", + "dxDiagram-commandLineStyleDashed": "Gestrichelt", + "dxDiagram-commandFillColor": "Füllfarbe", + "dxDiagram-commandAlignLeft": "Linksbündig", + "dxDiagram-commandAlignCenter": "Zentriert", + "dxDiagram-commandAlignRight": "Rechtsbündig", + "dxDiagram-commandConnectorLineType": "Konnektor Linienart", + "dxDiagram-commandConnectorLineStraight": "Gerade", + "dxDiagram-commandConnectorLineOrthogonal": "Rechtwinklig", + "dxDiagram-commandConnectorLineStart": "Konnektor Linienanfang", + "dxDiagram-commandConnectorLineEnd": "Konnektor Linienende", + "dxDiagram-commandConnectorLineNone": "Keine", + "dxDiagram-commandConnectorLineArrow": "Pfeil", + "dxDiagram-commandFullscreen": "Vollbild", + "dxDiagram-commandUnits": "Einheiten", + "dxDiagram-commandPageSize": "Seitengröße", + "dxDiagram-commandPageOrientation": "Seitenausrichtung", + "dxDiagram-commandPageOrientationLandscape": "Querformat", + "dxDiagram-commandPageOrientationPortrait": "Hochformat", + "dxDiagram-commandPageColor": "Seitenfarbe", + "dxDiagram-commandShowGrid": "Raster anzeigen", + "dxDiagram-commandSnapToGrid": "Am Raster ausrichten", + "dxDiagram-commandGridSize": "Rastergröße", + "dxDiagram-commandZoomLevel": "Vergrößerungsstufe", + "dxDiagram-commandAutoZoom": "Automatische Vergrößerung", + "dxDiagram-commandFitToContent": "An Inhalt anpassen", + "dxDiagram-commandFitToWidth": "An Breite anpassen", + "dxDiagram-commandAutoZoomByContent": "Automatisch an Inhalt anpassen", + "dxDiagram-commandAutoZoomByWidth": "Automatisch an Breite anpassen", + "dxDiagram-commandSimpleView": "Einfache Ansicht", + "dxDiagram-commandCut": "Ausschneiden", + "dxDiagram-commandCopy": "Kopieren", + "dxDiagram-commandPaste": "Einfügen", + "dxDiagram-commandSelectAll": "Alles auswählen", + "dxDiagram-commandDelete": "Löschen", + "dxDiagram-commandBringToFront": "In den Vordergrund", + "dxDiagram-commandSendToBack": "In den Hintergrund", + "dxDiagram-commandLock": "Sperren", + "dxDiagram-commandUnlock": "Entsperren", + "dxDiagram-commandInsertShapeImage": "Bild einfügen...", + "dxDiagram-commandEditShapeImage": "Bild bearbeiten...", + "dxDiagram-commandDeleteShapeImage": "Bild löschen", + "dxDiagram-commandLayoutLeftToRight": "Von links nach rechts", + "dxDiagram-commandLayoutRightToLeft": "Von rechts nach links", + "dxDiagram-commandLayoutTopToBottom": "Von oben nach unten", + "dxDiagram-commandLayoutBottomToTop": "Von unten nach oben", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Abbrechen", + "dxDiagram-dialogInsertShapeImageTitle": "Bild einfügen", + "dxDiagram-dialogEditShapeImageTitle": "Bild bearbeiten", + "dxDiagram-dialogEditShapeImageSelectButton": "Bild auswählen", + "dxDiagram-dialogEditShapeImageLabelText": "oder Datei hier ablegen", + + "dxDiagram-uiExport": "Export", + "dxDiagram-uiProperties": "Eigenschaften", + "dxDiagram-uiSettings": "Einstellungen", + "dxDiagram-uiShowToolbox": "Toolbox anzeigen", + "dxDiagram-uiSearch": "Suchen", + "dxDiagram-uiStyle": "Stil", + "dxDiagram-uiLayout": "Layout", + "dxDiagram-uiLayoutTree": "Baum", + "dxDiagram-uiLayoutLayered": "Mehrschichtig", + "dxDiagram-uiDiagram": "Diagramm", + "dxDiagram-uiText": "Text", + "dxDiagram-uiObject": "Objekt", + "dxDiagram-uiConnector": "Verbindung", + "dxDiagram-uiPage": "Seite", + + "dxDiagram-shapeText": "Text", + "dxDiagram-shapeRectangle": "Rechteck", + "dxDiagram-shapeEllipse": "Ellipse", + "dxDiagram-shapeCross": "Kreuz", + "dxDiagram-shapeTriangle": "Dreieck", + "dxDiagram-shapeDiamond": "Raute", + "dxDiagram-shapeHeart": "Herz", + "dxDiagram-shapePentagon": "Fünfeck", + "dxDiagram-shapeHexagon": "Sechseck", + "dxDiagram-shapeOctagon": "Achteck", + "dxDiagram-shapeStar": "Stern", + "dxDiagram-shapeArrowLeft": "Pfeil nach links", + "dxDiagram-shapeArrowUp": "Pfeil nach oben", + "dxDiagram-shapeArrowRight": "Pfeil nach rechts", + "dxDiagram-shapeArrowDown": "Pfeil nach unten", + "dxDiagram-shapeArrowUpDown": "Pfeil nach oben und unten", + "dxDiagram-shapeArrowLeftRight": "Pfeil nach links und rechts", + "dxDiagram-shapeProcess": "Prozess", + "dxDiagram-shapeDecision": "Entscheidung", + "dxDiagram-shapeTerminator": "Abschluss", + "dxDiagram-shapePredefinedProcess": "Vordefinierter Prozess", + "dxDiagram-shapeDocument": "Dokument", + "dxDiagram-shapeMultipleDocuments": "Mehrere Dokumente", + "dxDiagram-shapeManualInput": "Manuelle Eingabe", + "dxDiagram-shapePreparation": "Vorbereitung", + "dxDiagram-shapeData": "Daten", + "dxDiagram-shapeDatabase": "Datenbank", + "dxDiagram-shapeHardDisk": "Festplatte", + "dxDiagram-shapeInternalStorage": "Lokaler Speicher", + "dxDiagram-shapePaperTape": "Lochstreifen", + "dxDiagram-shapeManualOperation": "Manuelle Verarbeitung", + "dxDiagram-shapeDelay": "Verzögerung", + "dxDiagram-shapeStoredData": "Gespeicherte Daten", + "dxDiagram-shapeDisplay": "Anzeige", + "dxDiagram-shapeMerge": "Zusammenführen", + "dxDiagram-shapeConnector": "Verbinder", + "dxDiagram-shapeOr": "Oder", + "dxDiagram-shapeSummingJunction": "Summierungsknoten", + "dxDiagram-shapeContainerDefaultText": "Container", + "dxDiagram-shapeVerticalContainer": "Vertikaler Container", + "dxDiagram-shapeHorizontalContainer": "Horizontaler Container", + "dxDiagram-shapeCardDefaultText": "Name der Person", + "dxDiagram-shapeCardWithImageOnLeft": "Karte mit Bild links", + "dxDiagram-shapeCardWithImageOnTop": "Karte mit Bild oben", + "dxDiagram-shapeCardWithImageOnRight": "Karte mit Bild rechts", + + "dxGantt-dialogTitle": "Titel", + "dxGantt-dialogStartTitle": "Beginn", + "dxGantt-dialogEndTitle": "Ende", + "dxGantt-dialogProgressTitle": "Fortschritt", + "dxGantt-dialogResourcesTitle": "Ressourcen", + "dxGantt-dialogResourceManagerTitle": "Ressourcen-Manager", + "dxGantt-dialogTaskDetailsTitle": "Aufgabendetails", + "dxGantt-dialogEditResourceListHint": "Ressourcenliste bearbeiten", + "dxGantt-dialogEditNoResources": "Keine Ressourcen", + "dxGantt-dialogButtonAdd": "Hinzufügen", + "dxGantt-contextMenuNewTask": "Neue Aufgabe", + "dxGantt-contextMenuNewSubtask": "Neue Teilaufgabe", + "dxGantt-contextMenuDeleteTask": "Aufgabe löschen", + "dxGantt-contextMenuDeleteDependency": "Abhängigkeit entfernen", + "dxGantt-dialogTaskDeleteConfirmation": "Abhängigkeiten und Teilaufgaben werden zusammen mit dieser Aufgabe gelöscht. Möchten Sie diese Aufgabe löschen?", + "dxGantt-dialogDependencyDeleteConfirmation": "Möchten Sie die Abhängigkeit von der Aufgabe entfernen?", + "dxGantt-dialogResourcesDeleteConfirmation": "Wenn Sie diese Ressource löschen, wird sie von allen Aufgaben entfernt. Möchten Sie die Ressource löschen? Ressource: {0}", + "dxGantt-dialogConstraintCriticalViolationMessage": "Die Aufgabe, die Sie verschieben möchten, ist mit einer zweiten Aufgabe durch eine Abhängigkeit verbunden. Die Änderung würde gegen Abhängigkeitsregeln verstossen. Wie möchten Sie fortfahren?", + "dxGantt-dialogConstraintViolationMessage": "Die Aufgabe, die Sie verschieben möchten, ist mit einer zweiten Aufgabe durch eine Abhängigkeit verbunden. Wie möchten Sie fortfahren?", + "dxGantt-dialogCancelOperationMessage": "Vorgang abbrechen", + "dxGantt-dialogDeleteDependencyMessage": "Abhängigkeit löschen", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "Aufgabe verschieben und Abhängigkeit beibehalten", + "dxGantt-undo": "Rückgängig", + "dxGantt-redo": "Wiederherstellen", + "dxGantt-expandAll": "Alle erweitern", + "dxGantt-collapseAll": "Alle reduzieren", + "dxGantt-addNewTask": "Neue Aufgabe hinzufügen", + "dxGantt-deleteSelectedTask": "Ausgewählte Aufgabe löschen", + "dxGantt-zoomIn": "Vergrößern", + "dxGantt-zoomOut": "Verkleinern", + "dxGantt-fullScreen": "Vollbildmodus", + "dxGantt-quarter": "Q{0}", + "dxGantt-sortingAscendingText": "Aufsteigend sortieren", + "dxGantt-sortingDescendingText": "Absteigend sortieren", + "dxGantt-sortingClearText": "Sortierung aufheben", + "dxGantt-showResources": "Ressourcen Anzeigen", + "dxGantt-showDependencies": "Abhängigkeiten Anzeigen", + "dxGantt-dialogStartDateValidation": "Startdatum muss später sein als {0}", + "dxGantt-dialogEndDateValidation": "Enddatum muss später sein als {0}" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/el.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/el.json new file mode 100644 index 0000000000000000000000000000000000000000..50b73887142117d226774d95e5f406a39ca01cc6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/el.json @@ -0,0 +1,557 @@ +{ + "el": { + "Yes": "Ναί", + "No": "Όχι", + "Cancel": "Ακύρωση", + "Clear": "Εκκαθάριση", + "Done": "Καταχώρηση", + "Loading": "Φόρτωση", + "Select": "Επιλέξτε...", + "Search": "Αναζήτηση", + "Back": "Πίσω", + "OK": "ΟΚ", + + "dxCollectionWidget-noDataText": "Δεν υπάρχουν δεδομένα προς εμφάνιση", + + "dxDropDownEditor-selectLabel": "Επιλέξτε", + + "validation-required": "Απαιτείται συμπλήρωση", + "validation-required-formatted": "{0} είναι απαιτούμενο προς συμπλήρωση", + "validation-numeric": "Η τιμή του πεδίου πρέπει να είναι αριθμητική", + "validation-numeric-formatted": "Το πεδίο {0} πρέπει να περιέχει αριθμητική τιμή", + "validation-range": "Τιμή εκτός ορίων", + "validation-range-formatted": "Η τιμή του πεδίου {0} βρισκεται εκτός ορίων", + "validation-stringLength": "Το μήκος της τιμής που εισάγατε είναι εκτός ορίων", + "validation-stringLength-formatted": "Το μήκος της τιμής του πεδίου {0} δεν είναι σωστό", + "validation-custom": "Η τιμή είναι άκυρη", + "validation-custom-formatted": "Η τιμή του πεδίου {0} είναι άκυρη", + "validation-async": "Η τιμή είναι άκυρη", + "validation-async-formatted": "Η τιμή του πεδίου {0} είναι άκυρη", + "validation-compare": "Οι τιμές δεν ταιριάζουν", + "validation-compare-formatted": "Η τιμή του πεδίου {0} δεν ταιριάζει", + "validation-pattern": "Η τιμη δεν είναι η αναμενόμενη", + "validation-pattern-formatted": "Η τιμή του πεδίου {0} δεν ειναι η αναμενόμενη", + "validation-email": "Το Email είναι άκυρο", + "validation-email-formatted": "Η τιμή του πεδίου {0} είναι άκυρη", + "validation-mask": "Η τιμή είναι άκυρη", + + "dxLookup-searchPlaceholder": "Ελάχιστος αριθμός χαρακτήρων: {0}", + + "dxList-pullingDownText": "Σύρετε απο πάνω προς τα κάτω για ανανέωση...", + "dxList-pulledDownText": "Απελευθερώστε για ανανέωση...", + "dxList-refreshingText": "Ανανέωση...", + "dxList-pageLoadingText": "Φόρτωση...", + "dxList-nextButtonText": "Περισσότερα", + "dxList-selectAll": "Επιλογή όλων", + "dxListEditDecorator-delete": "Διαγραφή", + "dxListEditDecorator-more": "Περισσότερα", + + "dxScrollView-pullingDownText": "Σύρετε απο πάνω προς τα κάτω για ανανέωση...", + "dxScrollView-pulledDownText": "Απελευθερώστε για ανανέωση...", + "dxScrollView-refreshingText": "Ανανέωση...", + "dxScrollView-reachBottomText": "Φόρτωση...", + + "dxDateBox-simulatedDataPickerTitleTime": "Επιλέξτε ώρα", + "dxDateBox-simulatedDataPickerTitleDate": "Επιλέξτε ημερομηνία", + "dxDateBox-simulatedDataPickerTitleDateTime": "Επιλέξτε ώρα και ημερομηνία", + "dxDateBox-validation-datetime": "Η τιμή πρέπει να αναπαριστά ημερομηνία", + + "dxFileUploader-selectFile": "Επιλέξτε αρχείο", + "dxFileUploader-dropFile": "ή σύρετε το αρχείο εδώ", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Μεταφόρτωση", + "dxFileUploader-uploaded": "Μεταφορτώθηκε", + "dxFileUploader-readyToUpload": "Έτοιμο προς μεταφόρτωση", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Η μεταφόρτωση απέτυχε", + "dxFileUploader-invalidFileExtension": "Ο τυπος του αρχείου δεν είναι επιτρεπτός", + "dxFileUploader-invalidMaxFileSize": "Το αρχείο είναι πολύ μεγάλο", + "dxFileUploader-invalidMinFileSize": "Το αρχειο είναι πολυ μικρό", + + "dxRangeSlider-ariaFrom": "Από", + "dxRangeSlider-ariaTill": "Εώς", + "dxSwitch-switchedOnText": "ON", + "dxSwitch-switchedOffText": "OFF", + + "dxForm-optionalMark": "Προαιρετικό", + "dxForm-requiredMessage": "Το πεδίο {0} είναι απαιτούμενο", + + "dxNumberBox-invalidValueMessage": "Η τιμή πρέπει να είναι αριθμητική", + "dxNumberBox-noDataText": "Δεν υπάρχουν δεδομένα", + + "dxDataGrid-columnChooserTitle": "Επιλογέας στήλης", + "dxDataGrid-columnChooserEmptyText": "Σύρετε μια στήλη εδώ για να την κρύψετε", + "dxDataGrid-groupContinuesMessage": "Συνέχεια στην επόμενη σελίδα", + "dxDataGrid-groupContinuedMessage": "Συνέχεια απο προηγούμενη σελίδα", + "dxDataGrid-groupHeaderText": "Ομαδοποίηση απο αυτή την στήλη", + "dxDataGrid-ungroupHeaderText": "Απόσπαση", + "dxDataGrid-ungroupAllText": "Απόσπαση όλων", + "dxDataGrid-editingEditRow": "Επεξεργασία", + "dxDataGrid-editingSaveRowChanges": "Αποθήκευση", + "dxDataGrid-editingCancelRowChanges": "Ακύρωση", + "dxDataGrid-editingDeleteRow": "Διαγραφή", + "dxDataGrid-editingUndeleteRow": "Ανάκτηση διαγραφής", + "dxDataGrid-editingConfirmDeleteMessage": "Είστε σίγουροι πως θέλετε την διαγραφή αυτής της εγγραφής;", + "dxDataGrid-validationCancelChanges": "Ακύρωση αλλαγών", + "dxDataGrid-groupPanelEmptyText": "Σύρετε μια στήλη εδώ για να ομαδοποιήσετε με βάση αυτή", + "dxDataGrid-noDataText": "Δεν υπάρχουν δεδομένα", + "dxDataGrid-searchPanelPlaceholder": "Αναζήτηση...", + "dxDataGrid-filterRowShowAllText": "(Όλα)", + "dxDataGrid-filterRowResetOperationText": "Επαναφορά", + "dxDataGrid-filterRowOperationEquals": "Ισούται", + "dxDataGrid-filterRowOperationNotEquals": "Διαφέρει", + "dxDataGrid-filterRowOperationLess": "Μικρότερο από", + "dxDataGrid-filterRowOperationLessOrEquals": "Μικρότερο ίσο από", + "dxDataGrid-filterRowOperationGreater": "Μεγαλύτερο από", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Μεγαλύτερο ίσο από", + "dxDataGrid-filterRowOperationStartsWith": "Ξεκινάει με", + "dxDataGrid-filterRowOperationContains": "Περιέχει", + "dxDataGrid-filterRowOperationNotContains": "Δεν περιέχει", + "dxDataGrid-filterRowOperationEndsWith": "Τελειώνει με", + "dxDataGrid-filterRowOperationBetween": "Ανάμεσα", + "dxDataGrid-filterRowOperationBetweenStartText": "Εκκίνηση", + "dxDataGrid-filterRowOperationBetweenEndText": "Τέλος", + "dxDataGrid-applyFilterText": "Εισαγωγή φίλτρου", + "dxDataGrid-trueText": "Αληθές", + "dxDataGrid-falseText": "Ψευδές", + "dxDataGrid-sortingAscendingText": "Ταξινόμηση αύξουσα", + "dxDataGrid-sortingDescendingText": "Ταξινόμηση φθήνουσα", + "dxDataGrid-sortingClearText": "Εκκαθάριση ταξινόμισης", + "dxDataGrid-editingSaveAllChanges": "Αποθήκευση αλλαγών", + "dxDataGrid-editingCancelAllChanges": "Απόρριψη αλλαγών", + "dxDataGrid-editingAddRow": "Προσθήκη γραμμής", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min of {1} is {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max of {1} is {0}", + "dxDataGrid-summaryAvg": "Avg: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Avg of {1} is {0}", + "dxDataGrid-summarySum": "Sum: {0}", + "dxDataGrid-summarySumOtherColumn": "Sum of {1} is {0}", + "dxDataGrid-summaryCount": "Ποσότητα: {0}", + "dxDataGrid-columnFixingFix": "Επιδιόρθωση", + "dxDataGrid-columnFixingUnfix": "Άρση επισκευής", + "dxDataGrid-columnFixingLeftPosition": "Προς τα αριστερά", + "dxDataGrid-columnFixingRightPosition": "Προς τα δεξιά", + "dxDataGrid-exportTo": "Εξαγωγή", + "dxDataGrid-exportToExcel": "Εξαγωγή σε Excel", + "dxDataGrid-exporting": "Εξαγωγή...", + "dxDataGrid-excelFormat": "Αρχείο Excel", + "dxDataGrid-selectedRows": "Επιλεγμένες γραμμές", + "dxDataGrid-exportSelectedRows": "Εξαγωγή επιλεγμένων γραμμών", + "dxDataGrid-exportAll": "Εξαγωγή όλων των δεδομένων", + "dxDataGrid-headerFilterEmptyValue": "(Blanks)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Ακύρωση", + "dxDataGrid-ariaColumn": "Στήλη", + "dxDataGrid-ariaValue": "Τιμή", + "dxDataGrid-ariaFilterCell": "Φιλτράρισμα κελιού", + "dxDataGrid-ariaCollapse": "Συρρίκνωση", + "dxDataGrid-ariaExpand": "Επέκταση", + "dxDataGrid-ariaDataGrid": "Πλέγμα δεδομένων", + "dxDataGrid-ariaSearchInGrid": "Αναζήτηση στο πλέγμα δεδομένων", + "dxDataGrid-ariaSelectAll": "Επιλογή όλων", + "dxDataGrid-ariaSelectRow": "Επιλέξτε σειρά", + "dxDataGrid-filterBuilderPopupTitle": "Δημιουργία φίλτρου", + "dxDataGrid-filterPanelCreateFilter": "Δημιουργία φίλτρου", + "dxDataGrid-filterPanelClearFilter": "Εκκαθάριση", + "dxDataGrid-filterPanelFilterEnabledHint": "Ενεργοποιήστε το φίλτρο", + + "dxTreeList-ariaTreeList": "Λίστα δένδρων", + "dxTreeList-editingAddRowToNode": "Προσθέτω", + + "dxPager-infoText": "Σελίδα {0} από {1} ({2} αντικείμενα)", + "dxPager-pagesCountText": "από", + "dxPager-pageSizesAllText": "Όλα", + "dxPivotGrid-grandTotal": "Σύνολο", + "dxPivotGrid-total": "{0} Σύνολο", + "dxPivotGrid-fieldChooserTitle": "Επιλογέας πεδίου", + "dxPivotGrid-showFieldChooser": "Εμφάνιση επιλογέα πεδίων", + "dxPivotGrid-expandAll": "Επέκταση όλων", + "dxPivotGrid-collapseAll": "Σύμπτυξη όλων", + "dxPivotGrid-sortColumnBySummary": "Ταξινόμηση \"{0}\" από αυτή την στήλη", + "dxPivotGrid-sortRowBySummary": "Ταξινόμηση \"{0}\" από αυτή την γραμμή", + "dxPivotGrid-removeAllSorting": "Κατάργηση κάθε ταξινόμησης", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Πεδία γραμμής", + "dxPivotGrid-columnFields": "Πεδία στήλης", + "dxPivotGrid-dataFields": "Πεδία δεδομένων", + "dxPivotGrid-filterFields": "Πεδία φίλτρου", + "dxPivotGrid-allFields": "Ολα τα πεδία", + "dxPivotGrid-columnFieldArea": "Τοποθετήστε τα πεδία στη στήλη εδώ", + "dxPivotGrid-dataFieldArea": "Τοποθετήστε τα πεδία δεδομένων εδώ", + "dxPivotGrid-rowFieldArea": "Τοποθετήστε τα πεδία γραμμών εδώ", + "dxPivotGrid-filterFieldArea": "Τοποθετήστε τα πεδία φίλτρων εδώ", + + "dxScheduler-editorLabelTitle": "Θέμα", + "dxScheduler-editorLabelStartDate": "Ημερομηνία έναρξης", + "dxScheduler-editorLabelEndDate": "Ημερομηνία λήξης", + "dxScheduler-editorLabelDescription": "Περιγραφή", + "dxScheduler-editorLabelRecurrence": "Επανάληψη", + + "dxScheduler-openAppointment": "Άνοιγμα ραντεβού", + + "dxScheduler-recurrenceNever": "Ποτέ", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Καθημερινά", + "dxScheduler-recurrenceWeekly": "Εβδομαδιαία", + "dxScheduler-recurrenceMonthly": "Μηνιαία", + "dxScheduler-recurrenceYearly": "Ετήσια", + + "dxScheduler-recurrenceRepeatEvery": "Κάθε", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Τερματισμός επανάληψης", + "dxScheduler-recurrenceAfter": "Μετά", + "dxScheduler-recurrenceOn": "On", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "μέρα(ες)", + "dxScheduler-recurrenceRepeatWeekly": "εβδομάδα(ες)", + "dxScheduler-recurrenceRepeatMonthly": "μήνα(ες)", + "dxScheduler-recurrenceRepeatYearly": "χρόνο(ους)", + + "dxScheduler-switcherDay": "Μέρα", + "dxScheduler-switcherWeek": "Εβδομάδα", + "dxScheduler-switcherWorkWeek": "Εβδομάδα εργασίας", + "dxScheduler-switcherMonth": "Μήνας", + + "dxScheduler-switcherAgenda": "Ημερήσια διάταξη", + + "dxScheduler-switcherTimelineDay": "Ημερήσιο Χρονολόγιο", + "dxScheduler-switcherTimelineWeek": "Εβδομαδιαίο Χρονολόγιο", + "dxScheduler-switcherTimelineWorkWeek": "Χρονολόγιο εβδομάδας εργασίας", + "dxScheduler-switcherTimelineMonth": "Μηνιαίο Χρονολόγιο", + + "dxScheduler-recurrenceRepeatOnDate": "στην ημερομηνία", + "dxScheduler-recurrenceRepeatCount": "περιστατικό(α)", + "dxScheduler-allDay": "Όλη μέρα", + + "dxScheduler-confirmRecurrenceEditMessage": "Θέλετε να επεξεργαστείτε μόνο αυτό το ραντεβού ή ολόκληρη τη σειρά;", + "dxScheduler-confirmRecurrenceDeleteMessage": "Θέλετε να διαγράψετε μόνο αυτό το ραντεβού ή ολόκληρη τη σειρά;", + + "dxScheduler-confirmRecurrenceEditSeries": "Επεξεργασία σειράς", + "dxScheduler-confirmRecurrenceDeleteSeries": "Διαγραφή σειράς", + "dxScheduler-confirmRecurrenceEditOccurrence": "Επεξεργασία συνάντησης", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Διαγραφή συνάντησης", + + "dxScheduler-noTimezoneTitle": "Χωρίς ζώνη ώρας", + "dxScheduler-moreAppointments": "{0} περισσότερα", + + "dxCalendar-todayButtonText": "Σήμερα", + "dxCalendar-ariaWidgetName": "Ημερολόγιο", + + "dxColorView-ariaRed": "Κόκκινο", + "dxColorView-ariaGreen": "Πράσινο", + "dxColorView-ariaBlue": "Μπλε", + "dxColorView-ariaAlpha": "Διάφανο", + "dxColorView-ariaHex": "Κωδικός χρώματος", + + "dxTagBox-selected": "{0} επιλεγμένο/α", + "dxTagBox-allSelected": "Όλα επιλέχθηκαν ({0})", + "dxTagBox-moreSelected": "{0} περισσότερα", + + "vizExport-printingButtonText": "Εκτύπωση", + "vizExport-titleMenuText": "Εξαγωγή/Εκτύπωση", + "vizExport-exportButtonText": "{0} αρχείο/α", + + "dxFilterBuilder-and": "Και", + "dxFilterBuilder-or": "Ή", + "dxFilterBuilder-notAnd": "Όχι Και", + "dxFilterBuilder-notOr": "Όχι Ή", + "dxFilterBuilder-addCondition": "Προσθήκη συνθηκών", + "dxFilterBuilder-addGroup": "Προσθήκη ομάδας", + "dxFilterBuilder-enterValueText": "<εισαγάγετε μια τιμή>", + "dxFilterBuilder-filterOperationEquals": "Ίσο με", + "dxFilterBuilder-filterOperationNotEquals": "Δεν είναι ίσο με", + "dxFilterBuilder-filterOperationLess": "Είναι μικρότερο από", + "dxFilterBuilder-filterOperationLessOrEquals": "Είναι μικρότερο΄ή ίσο από", + "dxFilterBuilder-filterOperationGreater": "Είναι μεγαλύτερο από", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Είναι μεγαλύτερο ή ίσο με", + "dxFilterBuilder-filterOperationStartsWith": "Ξεκινάει με", + "dxFilterBuilder-filterOperationContains": "Περιέχει", + "dxFilterBuilder-filterOperationNotContains": "Δεν περιέχει", + "dxFilterBuilder-filterOperationEndsWith": "Τελειώνει με", + "dxFilterBuilder-filterOperationIsBlank": "Είναι κενό", + "dxFilterBuilder-filterOperationIsNotBlank": "Δεν είναι κενό", + "dxFilterBuilder-filterOperationBetween": "Είναι ανάμεσα", + "dxFilterBuilder-filterOperationAnyOf": "Είναι κάποιο από αυτά", + "dxFilterBuilder-filterOperationNoneOf": "Δεν είναι τίποτα από αυτά", + + "dxHtmlEditor-dialogColorCaption": "Αλλαγή χρώματος γραμματοσειράς", + "dxHtmlEditor-dialogBackgroundCaption": "Αλλαγή χρώματος φόντου", + "dxHtmlEditor-dialogLinkCaption": "Προσθήκη συνδέσμου", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Κείμενο", + "dxHtmlEditor-dialogLinkTargetField": "Ανοίξτε το σύνδεσμο σε νέο παράθυρο", + "dxHtmlEditor-dialogImageCaption": "Προσθέστε εικόνα", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Εναλλακτικό κείμενο", + "dxHtmlEditor-dialogImageWidthField": "Πλάτος (px)", + "dxHtmlEditor-dialogImageHeightField": "Υψος (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Επικεφαλίδα", + "dxHtmlEditor-normalText": "Κανονικό κείμενο", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Ταξινόμηση αύξουσα", + "dxGantt-sortingDescendingText": "Ταξινόμηση φθήνουσα", + "dxGantt-sortingClearText": "Εκκαθάριση ταξινόμισης", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/en.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/en.json new file mode 100644 index 0000000000000000000000000000000000000000..51c185b1c8376b21b5e4499929f463322685c1ce --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/en.json @@ -0,0 +1,643 @@ +{ + "en": { + "Yes": "Yes", + "No": "No", + "Cancel": "Cancel", + "Clear": "Clear", + "Done": "Done", + "Loading": "Loading...", + "Select": "Select...", + "Search": "Search", + "Back": "Back", + "OK": "OK", + + "dxCollectionWidget-noDataText": "No data to display", + + "dxDropDownEditor-selectLabel": "Select", + + "validation-required": "Required", + "validation-required-formatted": "{0} is required", + "validation-numeric": "Value must be a number", + "validation-numeric-formatted": "{0} must be a number", + "validation-range": "Value is out of range", + "validation-range-formatted": "{0} is out of range", + "validation-stringLength": "The length of the value is not correct", + "validation-stringLength-formatted": "The length of {0} is not correct", + "validation-custom": "Value is invalid", + "validation-custom-formatted": "{0} is invalid", + "validation-async": "Value is invalid", + "validation-async-formatted": "{0} is invalid", + "validation-compare": "Values do not match", + "validation-compare-formatted": "{0} does not match", + "validation-pattern": "Value does not match pattern", + "validation-pattern-formatted": "{0} does not match pattern", + "validation-email": "Email is invalid", + "validation-email-formatted": "{0} is invalid", + "validation-mask": "Value is invalid", + + "dxLookup-searchPlaceholder": "Minimum character number: {0}", + + "dxList-pullingDownText": "Pull down to refresh...", + "dxList-pulledDownText": "Release to refresh...", + "dxList-refreshingText": "Refreshing...", + "dxList-pageLoadingText": "Loading...", + "dxList-nextButtonText": "More", + "dxList-selectAll": "Select All", + "dxListEditDecorator-delete": "Delete", + "dxListEditDecorator-more": "More", + + "dxScrollView-pullingDownText": "Pull down to refresh...", + "dxScrollView-pulledDownText": "Release to refresh...", + "dxScrollView-refreshingText": "Refreshing...", + "dxScrollView-reachBottomText": "Loading...", + + "dxDateBox-simulatedDataPickerTitleTime": "Select time", + "dxDateBox-simulatedDataPickerTitleDate": "Select date", + "dxDateBox-simulatedDataPickerTitleDateTime": "Select date and time", + "dxDateBox-validation-datetime": "Value must be a date or time", + + "dxFileUploader-selectFile": "Select file", + "dxFileUploader-dropFile": "or Drop file here", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Upload", + "dxFileUploader-uploaded": "Uploaded", + "dxFileUploader-readyToUpload": "Ready to upload", + "dxFileUploader-uploadAbortedMessage": "Upload cancelled", + "dxFileUploader-uploadFailedMessage": "Upload failed", + "dxFileUploader-invalidFileExtension": "File type is not allowed", + "dxFileUploader-invalidMaxFileSize": "File is too large", + "dxFileUploader-invalidMinFileSize": "File is too small", + + "dxRangeSlider-ariaFrom": "From", + "dxRangeSlider-ariaTill": "Till", + "dxSwitch-switchedOnText": "ON", + "dxSwitch-switchedOffText": "OFF", + + "dxForm-optionalMark": "optional", + "dxForm-requiredMessage": "{0} is required", + + "dxNumberBox-invalidValueMessage": "Value must be a number", + "dxNumberBox-noDataText": "No data", + + "dxDataGrid-columnChooserTitle": "Column Chooser", + "dxDataGrid-columnChooserEmptyText": "Drag a column here to hide it", + "dxDataGrid-groupContinuesMessage": "Continues on the next page", + "dxDataGrid-groupContinuedMessage": "Continued from the previous page", + "dxDataGrid-groupHeaderText": "Group by This Column", + "dxDataGrid-ungroupHeaderText": "Ungroup", + "dxDataGrid-ungroupAllText": "Ungroup All", + "dxDataGrid-editingEditRow": "Edit", + "dxDataGrid-editingSaveRowChanges": "Save", + "dxDataGrid-editingCancelRowChanges": "Cancel", + "dxDataGrid-editingDeleteRow": "Delete", + "dxDataGrid-editingUndeleteRow": "Undelete", + "dxDataGrid-editingConfirmDeleteMessage": "Are you sure you want to delete this record?", + "dxDataGrid-validationCancelChanges": "Cancel changes", + "dxDataGrid-groupPanelEmptyText": "Drag a column header here to group by that column", + "dxDataGrid-noDataText": "No data", + "dxDataGrid-searchPanelPlaceholder": "Search...", + "dxDataGrid-filterRowShowAllText": "(All)", + "dxDataGrid-filterRowResetOperationText": "Reset", + "dxDataGrid-filterRowOperationEquals": "Equals", + "dxDataGrid-filterRowOperationNotEquals": "Does not equal", + "dxDataGrid-filterRowOperationLess": "Less than", + "dxDataGrid-filterRowOperationLessOrEquals": "Less than or equal to", + "dxDataGrid-filterRowOperationGreater": "Greater than", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Greater than or equal to", + "dxDataGrid-filterRowOperationStartsWith": "Starts with", + "dxDataGrid-filterRowOperationContains": "Contains", + "dxDataGrid-filterRowOperationNotContains": "Does not contain", + "dxDataGrid-filterRowOperationEndsWith": "Ends with", + "dxDataGrid-filterRowOperationBetween": "Between", + "dxDataGrid-filterRowOperationBetweenStartText": "Start", + "dxDataGrid-filterRowOperationBetweenEndText": "End", + "dxDataGrid-applyFilterText": "Apply filter", + "dxDataGrid-trueText": "true", + "dxDataGrid-falseText": "false", + "dxDataGrid-sortingAscendingText": "Sort Ascending", + "dxDataGrid-sortingDescendingText": "Sort Descending", + "dxDataGrid-sortingClearText": "Clear Sorting", + "dxDataGrid-editingSaveAllChanges": "Save changes", + "dxDataGrid-editingCancelAllChanges": "Discard changes", + "dxDataGrid-editingAddRow": "Add a row", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min of {1} is {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max of {1} is {0}", + "dxDataGrid-summaryAvg": "Avg: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Avg of {1} is {0}", + "dxDataGrid-summarySum": "Sum: {0}", + "dxDataGrid-summarySumOtherColumn": "Sum of {1} is {0}", + "dxDataGrid-summaryCount": "Count: {0}", + "dxDataGrid-columnFixingFix": "Fix", + "dxDataGrid-columnFixingUnfix": "Unfix", + "dxDataGrid-columnFixingLeftPosition": "To the left", + "dxDataGrid-columnFixingRightPosition": "To the right", + "dxDataGrid-exportTo": "Export", + "dxDataGrid-exportToExcel": "Export to Excel file", + "dxDataGrid-exporting": "Exporting...", + "dxDataGrid-excelFormat": "Excel file", + "dxDataGrid-selectedRows": "Selected rows", + "dxDataGrid-exportSelectedRows": "Export selected rows", + "dxDataGrid-exportAll": "Export all data", + "dxDataGrid-headerFilterEmptyValue": "(Blanks)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Cancel", + "dxDataGrid-ariaAdaptiveCollapse": "Hide additional data", + "dxDataGrid-ariaAdaptiveExpand": "Display additional data", + "dxDataGrid-ariaColumn": "Column", + "dxDataGrid-ariaValue": "Value", + "dxDataGrid-ariaFilterCell": "Filter cell", + "dxDataGrid-ariaCollapse": "Collapse", + "dxDataGrid-ariaExpand": "Expand", + "dxDataGrid-ariaDataGrid": "Data grid", + "dxDataGrid-ariaSearchInGrid": "Search in the data grid", + "dxDataGrid-ariaSelectAll": "Select all", + "dxDataGrid-ariaSelectRow": "Select row", + "dxDataGrid-ariaToolbar": "Data grid toolbar", + "dxDataGrid-filterBuilderPopupTitle": "Filter Builder", + "dxDataGrid-filterPanelCreateFilter": "Create Filter", + "dxDataGrid-filterPanelClearFilter": "Clear", + "dxDataGrid-filterPanelFilterEnabledHint": "Enable the filter", + + "dxTreeList-ariaTreeList": "Tree list", + "dxTreeList-ariaSearchInGrid": "Search in the tree list", + "dxTreeList-ariaToolbar": "Tree list toolbar", + "dxTreeList-editingAddRowToNode": "Add", + + "dxPager-infoText": "Page {0} of {1} ({2} items)", + "dxPager-pagesCountText": "of", + "dxPager-pageSizesAllText": "All", + + "dxPivotGrid-grandTotal": "Grand Total", + "dxPivotGrid-total": "{0} Total", + "dxPivotGrid-fieldChooserTitle": "Field Chooser", + "dxPivotGrid-showFieldChooser": "Show Field Chooser", + "dxPivotGrid-expandAll": "Expand All", + "dxPivotGrid-collapseAll": "Collapse All", + "dxPivotGrid-sortColumnBySummary": "Sort \"{0}\" by This Column", + "dxPivotGrid-sortRowBySummary": "Sort \"{0}\" by This Row", + "dxPivotGrid-removeAllSorting": "Remove All Sorting", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Row Fields", + "dxPivotGrid-columnFields": "Column Fields", + "dxPivotGrid-dataFields": "Data Fields", + "dxPivotGrid-filterFields": "Filter Fields", + "dxPivotGrid-allFields": "All Fields", + "dxPivotGrid-columnFieldArea": "Drop Column Fields Here", + "dxPivotGrid-dataFieldArea": "Drop Data Fields Here", + "dxPivotGrid-rowFieldArea": "Drop Row Fields Here", + "dxPivotGrid-filterFieldArea": "Drop Filter Fields Here", + + "dxScheduler-editorLabelTitle": "Subject", + "dxScheduler-editorLabelStartDate": "Start Date", + "dxScheduler-editorLabelEndDate": "End Date", + "dxScheduler-editorLabelDescription": "Description", + "dxScheduler-editorLabelRecurrence": "Repeat", + + "dxScheduler-openAppointment": "Open appointment", + + "dxScheduler-recurrenceNever": "Never", + "dxScheduler-recurrenceMinutely": "Every minute", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Daily", + "dxScheduler-recurrenceWeekly": "Weekly", + "dxScheduler-recurrenceMonthly": "Monthly", + "dxScheduler-recurrenceYearly": "Yearly", + + "dxScheduler-recurrenceRepeatEvery": "Repeat Every", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "End repeat", + "dxScheduler-recurrenceAfter": "After", + "dxScheduler-recurrenceOn": "On", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "day(s)", + "dxScheduler-recurrenceRepeatWeekly": "week(s)", + "dxScheduler-recurrenceRepeatMonthly": "month(s)", + "dxScheduler-recurrenceRepeatYearly": "year(s)", + + "dxScheduler-switcherDay": "Day", + "dxScheduler-switcherWeek": "Week", + "dxScheduler-switcherWorkWeek": "Work Week", + "dxScheduler-switcherMonth": "Month", + + "dxScheduler-switcherAgenda": "Agenda", + + "dxScheduler-switcherTimelineDay": "Timeline Day", + "dxScheduler-switcherTimelineWeek": "Timeline Week", + "dxScheduler-switcherTimelineWorkWeek": "Timeline Work Week", + "dxScheduler-switcherTimelineMonth": "Timeline Month", + + "dxScheduler-recurrenceRepeatOnDate": "on date", + "dxScheduler-recurrenceRepeatCount": "occurrence(s)", + "dxScheduler-allDay": "All day", + + "dxScheduler-confirmRecurrenceEditMessage": "Do you want to edit only this appointment or the whole series?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Do you want to delete only this appointment or the whole series?", + + "dxScheduler-confirmRecurrenceEditSeries": "Edit series", + "dxScheduler-confirmRecurrenceDeleteSeries": "Delete series", + "dxScheduler-confirmRecurrenceEditOccurrence": "Edit appointment", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Delete appointment", + + "dxScheduler-noTimezoneTitle": "No timezone", + "dxScheduler-moreAppointments": "{0} more", + + "dxCalendar-todayButtonText": "Today", + "dxCalendar-ariaWidgetName": "Calendar", + + "dxColorView-ariaRed": "Red", + "dxColorView-ariaGreen": "Green", + "dxColorView-ariaBlue": "Blue", + "dxColorView-ariaAlpha": "Transparency", + "dxColorView-ariaHex": "Color code", + + "dxTagBox-selected": "{0} selected", + "dxTagBox-allSelected": "All selected ({0})", + "dxTagBox-moreSelected": "{0} more", + + "vizExport-printingButtonText": "Print", + "vizExport-titleMenuText": "Exporting/Printing", + "vizExport-exportButtonText": "{0} file", + + "dxFilterBuilder-and": "And", + "dxFilterBuilder-or": "Or", + "dxFilterBuilder-notAnd": "Not And", + "dxFilterBuilder-notOr": "Not Or", + "dxFilterBuilder-addCondition": "Add Condition", + "dxFilterBuilder-addGroup": "Add Group", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Equals", + "dxFilterBuilder-filterOperationNotEquals": "Does not equal", + "dxFilterBuilder-filterOperationLess": "Is less than", + "dxFilterBuilder-filterOperationLessOrEquals": "Is less than or equal to", + "dxFilterBuilder-filterOperationGreater": "Is greater than", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Is greater than or equal to", + "dxFilterBuilder-filterOperationStartsWith": "Starts with", + "dxFilterBuilder-filterOperationContains": "Contains", + "dxFilterBuilder-filterOperationNotContains": "Does not contain", + "dxFilterBuilder-filterOperationEndsWith": "Ends with", + "dxFilterBuilder-filterOperationIsBlank": "Is blank", + "dxFilterBuilder-filterOperationIsNotBlank": "Is not blank", + "dxFilterBuilder-filterOperationBetween": "Is between", + "dxFilterBuilder-filterOperationAnyOf": "Is any of", + "dxFilterBuilder-filterOperationNoneOf": "Is none of", + + "dxHtmlEditor-dialogColorCaption": "Change Font Color", + "dxHtmlEditor-dialogBackgroundCaption": "Change Background Color", + "dxHtmlEditor-dialogLinkCaption": "Add Link", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Text", + "dxHtmlEditor-dialogLinkTargetField": "Open link in new window", + "dxHtmlEditor-dialogImageCaption": "Add Image", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Alternate text", + "dxHtmlEditor-dialogImageWidthField": "Width (px)", + "dxHtmlEditor-dialogImageHeightField": "Height (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "Rows", + "dxHtmlEditor-dialogInsertTableColumnsField": "Columns", + "dxHtmlEditor-dialogInsertTableCaption": "Insert Table", + "dxHtmlEditor-heading": "Heading", + "dxHtmlEditor-normalText": "Normal text", + "dxHtmlEditor-background": "Background Color", + "dxHtmlEditor-bold": "Bold", + "dxHtmlEditor-color": "Font Color", + "dxHtmlEditor-font": "Font", + "dxHtmlEditor-italic": "Italic", + "dxHtmlEditor-link": "Add Link", + "dxHtmlEditor-image": "Add Image", + "dxHtmlEditor-size": "Size", + "dxHtmlEditor-strike": "Strikethrough", + "dxHtmlEditor-subscript": "Subscript", + "dxHtmlEditor-superscript": "Superscript", + "dxHtmlEditor-underline": "Underline", + "dxHtmlEditor-blockquote": "Blockquote", + "dxHtmlEditor-header": "Header", + "dxHtmlEditor-increaseIndent": "Increase Indent", + "dxHtmlEditor-decreaseIndent": "Decrease Indent", + "dxHtmlEditor-orderedList": "Ordered List", + "dxHtmlEditor-bulletList": "Bullet List", + "dxHtmlEditor-alignLeft": "Align Left", + "dxHtmlEditor-alignCenter": "Align Center", + "dxHtmlEditor-alignRight": "Align Right", + "dxHtmlEditor-alignJustify": "Align Justify", + "dxHtmlEditor-codeBlock": "Code Block", + "dxHtmlEditor-variable": "Add Variable", + "dxHtmlEditor-undo": "Undo", + "dxHtmlEditor-redo": "Redo", + "dxHtmlEditor-clear": "Clear Formatting", + "dxHtmlEditor-insertTable": "Insert Table", + "dxHtmlEditor-insertHeaderRow": "Insert Header Row", + "dxHtmlEditor-insertRowAbove": "Insert Row Above", + "dxHtmlEditor-insertRowBelow": "Insert Row Below", + "dxHtmlEditor-insertColumnLeft": "Insert Column Left", + "dxHtmlEditor-insertColumnRight": "Insert Column Right", + "dxHtmlEditor-deleteColumn": "Delete Column", + "dxHtmlEditor-deleteRow": "Delete Row", + "dxHtmlEditor-deleteTable": "Delete Table", + "dxHtmlEditor-cellProperties": "Cell Properties", + "dxHtmlEditor-tableProperties": "Table Properties", + "dxHtmlEditor-insert": "Insert", + "dxHtmlEditor-delete": "Delete", + "dxHtmlEditor-border": "Border", + "dxHtmlEditor-style": "Style", + "dxHtmlEditor-width": "Width", + "dxHtmlEditor-height": "Height", + "dxHtmlEditor-borderColor": "Color", + "dxHtmlEditor-tableBackground": "Background", + "dxHtmlEditor-dimensions": "Dimensions", + "dxHtmlEditor-alignment": "Alignment", + "dxHtmlEditor-horizontal": "Horizontal", + "dxHtmlEditor-vertical": "Vertical", + "dxHtmlEditor-paddingVertical": "Vertical Padding", + "dxHtmlEditor-paddingHorizontal": "Horizontal Padding", + "dxHtmlEditor-pixels": "Pixels", + "dxHtmlEditor-list": "List", + "dxHtmlEditor-ordered": "Ordered", + "dxHtmlEditor-bullet": "Bullet", + "dxHtmlEditor-align": "Align", + "dxHtmlEditor-center": "Center", + "dxHtmlEditor-left": "Left", + "dxHtmlEditor-right": "Right", + "dxHtmlEditor-indent": "Indent", + "dxHtmlEditor-justify": "Justify", + + "dxFileManager-newDirectoryName": "Untitled directory", + "dxFileManager-rootDirectoryName": "Files", + "dxFileManager-errorNoAccess": "Access Denied. Operation could not be completed.", + "dxFileManager-errorDirectoryExistsFormat": "Directory '{0}' already exists.", + "dxFileManager-errorFileExistsFormat": "File '{0}' already exists.", + "dxFileManager-errorFileNotFoundFormat": "File '{0}' not found.", + "dxFileManager-errorDirectoryNotFoundFormat": "Directory '{0}' not found.", + "dxFileManager-errorWrongFileExtension": "File extension is not allowed.", + "dxFileManager-errorMaxFileSizeExceeded": "File size exceeds the maximum allowed size.", + "dxFileManager-errorInvalidSymbols": "This name contains invalid characters.", + "dxFileManager-errorDefault": "Unspecified error.", + "dxFileManager-errorDirectoryOpenFailed": "The directory cannot be opened", + + "dxFileManager-commandCreate": "New directory", + "dxFileManager-commandRename": "Rename", + "dxFileManager-commandMove": "Move to", + "dxFileManager-commandCopy": "Copy to", + "dxFileManager-commandDelete": "Delete", + "dxFileManager-commandDownload": "Download", + "dxFileManager-commandUpload": "Upload files", + "dxFileManager-commandRefresh": "Refresh", + "dxFileManager-commandThumbnails": "Thumbnails View", + "dxFileManager-commandDetails": "Details View", + "dxFileManager-commandClearSelection": "Clear selection", + "dxFileManager-commandShowNavPane": "Toggle navigation pane", + + "dxFileManager-dialogDirectoryChooserMoveTitle": "Move to", + "dxFileManager-dialogDirectoryChooserMoveButtonText": "Move", + "dxFileManager-dialogDirectoryChooserCopyTitle": "Copy to", + "dxFileManager-dialogDirectoryChooserCopyButtonText": "Copy", + "dxFileManager-dialogRenameItemTitle": "Rename", + "dxFileManager-dialogRenameItemButtonText": "Save", + "dxFileManager-dialogCreateDirectoryTitle": "New directory", + "dxFileManager-dialogCreateDirectoryButtonText": "Create", + "dxFileManager-dialogDeleteItemTitle": "Delete", + "dxFileManager-dialogDeleteItemButtonText": "Delete", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "Are you sure you want to delete {0}?", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "Are you sure you want to delete {0} items?", + "dxFileManager-dialogButtonCancel": "Cancel", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "Creating a directory inside {0}", + "dxFileManager-editingCreateSingleItemSuccessMessage": "Created a directory inside {0}", + "dxFileManager-editingCreateSingleItemErrorMessage": "Directory was not created", + "dxFileManager-editingCreateCommonErrorMessage": "Directory was not created", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "Renaming an item inside {0}", + "dxFileManager-editingRenameSingleItemSuccessMessage": "Renamed an item inside {0}", + "dxFileManager-editingRenameSingleItemErrorMessage": "Item was not renamed", + "dxFileManager-editingRenameCommonErrorMessage": "Item was not renamed", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "Deleting an item from {0}", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "Deleting {0} items from {1}", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "Deleted an item from {0}", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "Deleted {0} items from {1}", + "dxFileManager-editingDeleteSingleItemErrorMessage": "Item was not deleted", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "{0} items were not deleted", + "dxFileManager-editingDeleteCommonErrorMessage": "Some items were not deleted", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "Moving an item to {0}", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "Moving {0} items to {1}", + "dxFileManager-editingMoveSingleItemSuccessMessage": "Moved an item to {0}", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "Moved {0} items to {1}", + "dxFileManager-editingMoveSingleItemErrorMessage": "Item was not moved", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "{0} items were not moved", + "dxFileManager-editingMoveCommonErrorMessage": "Some items were not moved", + + "dxFileManager-editingCopySingleItemProcessingMessage": "Copying an item to {0}", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "Copying {0} items to {1}", + "dxFileManager-editingCopySingleItemSuccessMessage": "Copied an item to {0}", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "Copied {0} items to {1}", + "dxFileManager-editingCopySingleItemErrorMessage": "Item was not copied", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "{0} items were not copied", + "dxFileManager-editingCopyCommonErrorMessage": "Some items were not copied", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "Uploading an item to {0}", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "Uploading {0} items to {1}", + "dxFileManager-editingUploadSingleItemSuccessMessage": "Uploaded an item to {0}", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "Uploaded {0} items to {1}", + "dxFileManager-editingUploadSingleItemErrorMessage": "Item was not uploaded", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "{0} items were not uploaded", + "dxFileManager-editingUploadCanceledMessage": "Canceled", + + "dxFileManager-listDetailsColumnCaptionName": "Name", + "dxFileManager-listDetailsColumnCaptionDateModified": "Date Modified", + "dxFileManager-listDetailsColumnCaptionFileSize": "File Size", + + "dxFileManager-listThumbnailsTooltipTextSize": "Size", + "dxFileManager-listThumbnailsTooltipTextDateModified": "Date Modified", + + "dxFileManager-notificationProgressPanelTitle": "Progress", + "dxFileManager-notificationProgressPanelEmptyListText": "No operations", + "dxFileManager-notificationProgressPanelOperationCanceled": "Canceled", + + "dxDiagram-categoryGeneral": "General", + "dxDiagram-categoryFlowchart": "Flowchart", + "dxDiagram-categoryOrgChart": "Org Chart", + "dxDiagram-categoryContainers": "Containers", + "dxDiagram-categoryCustom": "Custom", + + "dxDiagram-commandExportToSvg": "Export to SVG", + "dxDiagram-commandExportToPng": "Export to PNG", + "dxDiagram-commandExportToJpg": "Export to JPEG", + "dxDiagram-commandUndo": "Undo", + "dxDiagram-commandRedo": "Redo", + "dxDiagram-commandFontName": "Font Name", + "dxDiagram-commandFontSize": "Font Size", + "dxDiagram-commandBold": "Bold", + "dxDiagram-commandItalic": "Italic", + "dxDiagram-commandUnderline": "Underline", + "dxDiagram-commandTextColor": "Font Color", + "dxDiagram-commandLineColor": "Line Color", + "dxDiagram-commandLineWidth": "Line Width", + "dxDiagram-commandLineStyle": "Line Style", + "dxDiagram-commandLineStyleSolid": "Solid", + "dxDiagram-commandLineStyleDotted": "Dotted", + "dxDiagram-commandLineStyleDashed": "Dashed", + "dxDiagram-commandFillColor": "Fill Color", + "dxDiagram-commandAlignLeft": "Align Left", + "dxDiagram-commandAlignCenter": "Align Center", + "dxDiagram-commandAlignRight": "Align Right", + "dxDiagram-commandConnectorLineType": "Connector Line Type", + "dxDiagram-commandConnectorLineStraight": "Straight", + "dxDiagram-commandConnectorLineOrthogonal": "Orthogonal", + "dxDiagram-commandConnectorLineStart": "Connector Line Start", + "dxDiagram-commandConnectorLineEnd": "Connector Line End", + "dxDiagram-commandConnectorLineNone": "None", + "dxDiagram-commandConnectorLineArrow": "Arrow", + "dxDiagram-commandFullscreen": "Full Screen", + "dxDiagram-commandUnits": "Units", + "dxDiagram-commandPageSize": "Page Size", + "dxDiagram-commandPageOrientation": "Page Orientation", + "dxDiagram-commandPageOrientationLandscape": "Landscape", + "dxDiagram-commandPageOrientationPortrait": "Portrait", + "dxDiagram-commandPageColor": "Page Color", + "dxDiagram-commandShowGrid": "Show Grid", + "dxDiagram-commandSnapToGrid": "Snap to Grid", + "dxDiagram-commandGridSize": "Grid Size", + "dxDiagram-commandZoomLevel": "Zoom Level", + "dxDiagram-commandAutoZoom": "Auto Zoom", + "dxDiagram-commandFitToContent": "Fit to Content", + "dxDiagram-commandFitToWidth": "Fit to Width", + "dxDiagram-commandAutoZoomByContent": "Auto Zoom by Content", + "dxDiagram-commandAutoZoomByWidth": "Auto Zoom by Width", + "dxDiagram-commandSimpleView": "Simple View", + "dxDiagram-commandCut": "Cut", + "dxDiagram-commandCopy": "Copy", + "dxDiagram-commandPaste": "Paste", + "dxDiagram-commandSelectAll": "Select All", + "dxDiagram-commandDelete": "Delete", + "dxDiagram-commandBringToFront": "Bring to Front", + "dxDiagram-commandSendToBack": "Send to Back", + "dxDiagram-commandLock": "Lock", + "dxDiagram-commandUnlock": "Unlock", + "dxDiagram-commandInsertShapeImage": "Insert Image...", + "dxDiagram-commandEditShapeImage": "Change Image...", + "dxDiagram-commandDeleteShapeImage": "Delete Image", + "dxDiagram-commandLayoutLeftToRight": "Left-to-right", + "dxDiagram-commandLayoutRightToLeft": "Right-to-left", + "dxDiagram-commandLayoutTopToBottom": "Top-to-bottom", + "dxDiagram-commandLayoutBottomToTop": "Bottom-to-top", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Cancel", + "dxDiagram-dialogInsertShapeImageTitle": "Insert Image", + "dxDiagram-dialogEditShapeImageTitle": "Change Image", + "dxDiagram-dialogEditShapeImageSelectButton": "Select image", + "dxDiagram-dialogEditShapeImageLabelText": "or drop file here", + + "dxDiagram-uiExport": "Export", + "dxDiagram-uiProperties": "Properties", + "dxDiagram-uiSettings": "Settings", + "dxDiagram-uiShowToolbox": "Show Toolbox", + "dxDiagram-uiSearch": "Search", + "dxDiagram-uiStyle": "Style", + "dxDiagram-uiLayout": "Layout", + "dxDiagram-uiLayoutTree": "Tree", + "dxDiagram-uiLayoutLayered": "Layered", + "dxDiagram-uiDiagram": "Diagram", + "dxDiagram-uiText": "Text", + "dxDiagram-uiObject": "Object", + "dxDiagram-uiConnector": "Connector", + "dxDiagram-uiPage": "Page", + + "dxDiagram-shapeText": "Text", + "dxDiagram-shapeRectangle": "Rectangle", + "dxDiagram-shapeEllipse": "Ellipse", + "dxDiagram-shapeCross": "Cross", + "dxDiagram-shapeTriangle": "Triangle", + "dxDiagram-shapeDiamond": "Diamond", + "dxDiagram-shapeHeart": "Heart", + "dxDiagram-shapePentagon": "Pentagon", + "dxDiagram-shapeHexagon": "Hexagon", + "dxDiagram-shapeOctagon": "Octagon", + "dxDiagram-shapeStar": "Star", + "dxDiagram-shapeArrowLeft": "Left Arrow", + "dxDiagram-shapeArrowUp": "Up Arrow", + "dxDiagram-shapeArrowRight": "Right Arrow", + "dxDiagram-shapeArrowDown": "Down Arrow", + "dxDiagram-shapeArrowUpDown": "Up Down Arrow", + "dxDiagram-shapeArrowLeftRight": "Left Right Arrow", + "dxDiagram-shapeProcess": "Process", + "dxDiagram-shapeDecision": "Decision", + "dxDiagram-shapeTerminator": "Terminator", + "dxDiagram-shapePredefinedProcess": "Predefined Process", + "dxDiagram-shapeDocument": "Document", + "dxDiagram-shapeMultipleDocuments": "Multiple Documents", + "dxDiagram-shapeManualInput": "Manual Input", + "dxDiagram-shapePreparation": "Preparation", + "dxDiagram-shapeData": "Data", + "dxDiagram-shapeDatabase": "Database", + "dxDiagram-shapeHardDisk": "Hard Disk", + "dxDiagram-shapeInternalStorage": "Internal Storage", + "dxDiagram-shapePaperTape": "Paper Tape", + "dxDiagram-shapeManualOperation": "Manual Operation", + "dxDiagram-shapeDelay": "Delay", + "dxDiagram-shapeStoredData": "Stored Data", + "dxDiagram-shapeDisplay": "Display", + "dxDiagram-shapeMerge": "Merge", + "dxDiagram-shapeConnector": "Connector", + "dxDiagram-shapeOr": "Or", + "dxDiagram-shapeSummingJunction": "Summing Junction", + "dxDiagram-shapeContainerDefaultText": "Container", + "dxDiagram-shapeVerticalContainer": "Vertical Container", + "dxDiagram-shapeHorizontalContainer": "Horizontal Container", + "dxDiagram-shapeCardDefaultText": "Person's Name", + "dxDiagram-shapeCardWithImageOnLeft": "Card with Image on the Left", + "dxDiagram-shapeCardWithImageOnTop": "Card with Image on the Top", + "dxDiagram-shapeCardWithImageOnRight": "Card with Image on the Right", + + "dxGantt-dialogTitle": "Title", + "dxGantt-dialogStartTitle": "Start", + "dxGantt-dialogEndTitle": "End", + "dxGantt-dialogProgressTitle": "Progress", + "dxGantt-dialogResourcesTitle": "Resources", + "dxGantt-dialogResourceManagerTitle": "Resource Manager", + "dxGantt-dialogTaskDetailsTitle": "Task Details", + "dxGantt-dialogEditResourceListHint": "Edit Resource List", + "dxGantt-dialogEditNoResources": "No resources", + "dxGantt-dialogButtonAdd": "Add", + "dxGantt-contextMenuNewTask": "New Task", + "dxGantt-contextMenuNewSubtask": "New Subtask", + "dxGantt-contextMenuDeleteTask": "Delete Task", + "dxGantt-contextMenuDeleteDependency": "Delete Dependency", + "dxGantt-dialogTaskDeleteConfirmation": "Deleting a task also deletes all its dependencies and subtasks. Are you sure you want to delete this task?", + "dxGantt-dialogDependencyDeleteConfirmation": "Are you sure you want to delete the dependency from the task?", + "dxGantt-dialogResourcesDeleteConfirmation": "Deleting a resource also deletes it from tasks to which this resource is assigned. Are you sure you want to delete these resources? Resources: {0}", + "dxGantt-dialogConstraintCriticalViolationMessage": "The task you are attempting to move is linked to a second task by a dependency relation. This change would conflict with dependency rules. How would you like to proceed?", + "dxGantt-dialogConstraintViolationMessage": "The task you are attempting to move is linked to a second task by a dependency relation. How would you like to proceed?", + "dxGantt-dialogCancelOperationMessage": "Cancel the operation", + "dxGantt-dialogDeleteDependencyMessage": "Delete the dependency", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "Move the task and keep the dependency", + "dxGantt-undo": "Undo", + "dxGantt-redo": "Redo", + "dxGantt-expandAll": "Expand All", + "dxGantt-collapseAll": "Collapse All", + "dxGantt-addNewTask": "Add New Task", + "dxGantt-deleteSelectedTask": "Delete Selected Task", + "dxGantt-zoomIn": "Zoom In", + "dxGantt-zoomOut": "Zoom Out", + "dxGantt-fullScreen": "Full Screen", + "dxGantt-quarter": "Q{0}", + "dxGantt-sortingAscendingText": "Sort Ascending", + "dxGantt-sortingDescendingText": "Sort Descending", + "dxGantt-sortingClearText": "Clear Sorting", + "dxGantt-showResources": "Show Resources", + "dxGantt-showDependencies": "Show Dependencies", + "dxGantt-dialogStartDateValidation": "Start date must be after {0}", + "dxGantt-dialogEndDateValidation": "End date must be after {0}" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/es.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/es.json new file mode 100644 index 0000000000000000000000000000000000000000..266d1ed01738af54af6e629a84695fe0a2381580 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/es.json @@ -0,0 +1,601 @@ +{ + "es": { + "Yes": "Sí", + "No": "No", + "Cancel": "Cancelar", + "Clear": "Limpiar", + "Done": "Hecho", + "Loading": "Cargando...", + "Select": "Seleccionar...", + "Search": "Buscar", + "Back": "Volver", + "OK": "Aceptar", + "dxCollectionWidget-noDataText": "Sin datos para mostrar", + "dxDropDownEditor-selectLabel": "Seleccionar", + "validation-required": "Obligatorio", + "validation-required-formatted": "{0} es obligatorio", + "validation-numeric": "Valor debe ser un número", + "validation-numeric-formatted": "{0} debe ser un número", + "validation-range": "Valor fuera de rango", + "validation-range-formatted": "{0} fuera de rango", + "validation-stringLength": "El tamaño del valor es incorrecto", + "validation-stringLength-formatted": "El tamaño de {0} es incorrecto", + "validation-custom": "Valor inválido", + "validation-custom-formatted": "{0} inválido", + "validation-async": "Valor inválido", + "validation-async-formatted": "{0} inválido", + "validation-compare": "Valores no coinciden", + "validation-compare-formatted": "{0} no coinciden", + "validation-pattern": "Valor no coincide con el patrón", + "validation-pattern-formatted": "{0} no coincide con el patrón", + "validation-email": "Email inválido", + "validation-email-formatted": "{0} inválido", + "validation-mask": "Valor inválido", + "dxLookup-searchPlaceholder": "Cantidad mínima de caracteres: {0}", + "dxList-pullingDownText": "Desliza hacia abajo para actualizar...", + "dxList-pulledDownText": "Suelta para actualizar...", + "dxList-refreshingText": "Actualizando...", + "dxList-pageLoadingText": "Cargando...", + "dxList-nextButtonText": "Más", + "dxList-selectAll": "Seleccionar Todo", + "dxListEditDecorator-delete": "Eliminar", + "dxListEditDecorator-more": "Más", + "dxScrollView-pullingDownText": "Desliza hacia abajo para actualizar...", + "dxScrollView-pulledDownText": "Suelta para actualizar...", + "dxScrollView-refreshingText": "Actualizando...", + "dxScrollView-reachBottomText": "Cargando...", + "dxDateBox-simulatedDataPickerTitleTime": "Seleccione hora", + "dxDateBox-simulatedDataPickerTitleDate": "Seleccione fecha", + "dxDateBox-simulatedDataPickerTitleDateTime": "Seleccione fecha y hora", + "dxDateBox-validation-datetime": "Valor debe ser una fecha u hora", + "dxFileUploader-selectFile": "Seleccionar archivo", + "dxFileUploader-dropFile": "o arrastre un archivo aquí", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Subir", + "dxFileUploader-uploaded": "Subido", + "dxFileUploader-readyToUpload": "Listo para subir", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Falla ao subir", + "dxFileUploader-invalidFileExtension": "Tipo de archivo no está permitido", + "dxFileUploader-invalidMaxFileSize": "Archivo es muy grande", + "dxFileUploader-invalidMinFileSize": "Archivo es muy pequeño", + "dxRangeSlider-ariaFrom": "Desde", + "dxRangeSlider-ariaTill": "Hasta", + "dxSwitch-switchedOnText": "ENCENDIDO", + "dxSwitch-switchedOffText": "APAGADO", + "dxForm-optionalMark": "opcional", + "dxForm-requiredMessage": "{0} es obligatorio", + "dxNumberBox-invalidValueMessage": "Valor debe ser un número", + "dxNumberBox-noDataText": "Sin datos", + "dxDataGrid-columnChooserTitle": "Selector de Columnas", + "dxDataGrid-columnChooserEmptyText": "Arrastra una columna aquí para ocultarla", + "dxDataGrid-groupContinuesMessage": "Continúa en la página siguiente", + "dxDataGrid-groupContinuedMessage": "Continuación de la página anterior", + "dxDataGrid-groupHeaderText": "Agrupar por esta columna", + "dxDataGrid-ungroupHeaderText": "Desagrupar", + "dxDataGrid-ungroupAllText": "Desagrupar Todo", + "dxDataGrid-editingEditRow": "Modificar", + "dxDataGrid-editingSaveRowChanges": "Guardar", + "dxDataGrid-editingCancelRowChanges": "Cancelar", + "dxDataGrid-editingDeleteRow": "Eliminar", + "dxDataGrid-editingUndeleteRow": "Recuperar", + "dxDataGrid-editingConfirmDeleteMessage": "¿Está seguro que desea eliminar este registro?", + "dxDataGrid-validationCancelChanges": "Cancelar cambios", + "dxDataGrid-groupPanelEmptyText": "Arrastra una columna aquí para agrupar por ella", + "dxDataGrid-noDataText": "Sin datos", + "dxDataGrid-searchPanelPlaceholder": "Buscar...", + "dxDataGrid-filterRowShowAllText": "(Todos)", + "dxDataGrid-filterRowResetOperationText": "Reestablecer", + "dxDataGrid-filterRowOperationEquals": "Igual", + "dxDataGrid-filterRowOperationNotEquals": "No es igual", + "dxDataGrid-filterRowOperationLess": "Menor que", + "dxDataGrid-filterRowOperationLessOrEquals": "Menor o igual a", + "dxDataGrid-filterRowOperationGreater": "Mayor que", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Mayor o igual a", + "dxDataGrid-filterRowOperationStartsWith": "Empieza con", + "dxDataGrid-filterRowOperationContains": "Contiene", + "dxDataGrid-filterRowOperationNotContains": "No contiene", + "dxDataGrid-filterRowOperationEndsWith": "Termina con", + "dxDataGrid-filterRowOperationBetween": "Entre", + "dxDataGrid-filterRowOperationBetweenStartText": "Inicio", + "dxDataGrid-filterRowOperationBetweenEndText": "Fin", + "dxDataGrid-applyFilterText": "Filtrar", + "dxDataGrid-trueText": "verdadero", + "dxDataGrid-falseText": "falso", + "dxDataGrid-sortingAscendingText": "Orden Ascendente", + "dxDataGrid-sortingDescendingText": "Orden Descendente", + "dxDataGrid-sortingClearText": "Limpiar Ordenamiento", + "dxDataGrid-editingSaveAllChanges": "Guardar cambios", + "dxDataGrid-editingCancelAllChanges": "Descartar cambios", + "dxDataGrid-editingAddRow": "Agregar una fila", + "dxDataGrid-summaryMin": "Mín: {0}", + "dxDataGrid-summaryMinOtherColumn": "Mín de {1} es {0}", + "dxDataGrid-summaryMax": "Máx: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Máx de {1} es {0}", + "dxDataGrid-summaryAvg": "Prom: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Prom de {1} es {0}", + "dxDataGrid-summarySum": "Suma: {0}", + "dxDataGrid-summarySumOtherColumn": "Suma de {1} es {0}", + "dxDataGrid-summaryCount": "Cantidad: {0}", + "dxDataGrid-columnFixingFix": "Anclar", + "dxDataGrid-columnFixingUnfix": "Desanclar", + "dxDataGrid-columnFixingLeftPosition": "A la izquierda", + "dxDataGrid-columnFixingRightPosition": "A la derecha", + "dxDataGrid-exportTo": "Exportar", + "dxDataGrid-exportToExcel": "Exportar a archivo Excel", + "dxDataGrid-exporting": "Exportar...", + "dxDataGrid-excelFormat": "Archivo Excel", + "dxDataGrid-selectedRows": "Filas seleccionadas", + "dxDataGrid-exportSelectedRows": "Exportar filas seleccionadas", + "dxDataGrid-exportAll": "Exportar todo", + "dxDataGrid-headerFilterEmptyValue": "(Vacio)", + "dxDataGrid-headerFilterOK": "Aceptar", + "dxDataGrid-headerFilterCancel": "Cancelar", + "dxDataGrid-ariaColumn": "Columna", + "dxDataGrid-ariaValue": "Valor", + "dxDataGrid-ariaFilterCell": "Celda de filtro", + "dxDataGrid-ariaCollapse": "Colapsar", + "dxDataGrid-ariaExpand": "Expandir", + "dxDataGrid-ariaDataGrid": "Tabla de datos", + "dxDataGrid-ariaSearchInGrid": "Buscar en la tabla de datos", + "dxDataGrid-ariaSelectAll": "Seleccionar todo", + "dxDataGrid-ariaSelectRow": "Seleccionar fila", + "dxDataGrid-filterBuilderPopupTitle": "Constructor de filtro", + "dxDataGrid-filterPanelCreateFilter": "Crear filtro", + "dxDataGrid-filterPanelClearFilter": "Limpiar filtro", + "dxDataGrid-filterPanelFilterEnabledHint": "Habilitar filtro", + "dxTreeList-ariaTreeList": "Lista de árbol", + "dxTreeList-editingAddRowToNode": "Añadir", + "dxPager-infoText": "Página {0} de {1} ({2} ítems)", + "dxPager-pagesCountText": "de", + "dxPager-pageSizesAllText": "Todos", + "dxPivotGrid-grandTotal": "Gran Total", + "dxPivotGrid-total": "{0} Total", + "dxPivotGrid-fieldChooserTitle": "Selector de Campos", + "dxPivotGrid-showFieldChooser": "Mostrar Selector de Campos", + "dxPivotGrid-expandAll": "Expandir Todo", + "dxPivotGrid-collapseAll": "Colapsar Todo", + "dxPivotGrid-sortColumnBySummary": "Ordenar \"{0}\" por esta columna", + "dxPivotGrid-sortRowBySummary": "Ordenar \"{0}\" por esta fila", + "dxPivotGrid-removeAllSorting": "Remover ordenamiento", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Campos de fila", + "dxPivotGrid-columnFields": "Campos de columna", + "dxPivotGrid-dataFields": "Campos de dato", + "dxPivotGrid-filterFields": "Campos de filtro", + "dxPivotGrid-allFields": "Todos los campos", + "dxPivotGrid-columnFieldArea": "Arrastra campos de columna aquí", + "dxPivotGrid-dataFieldArea": "Arrastra campos de dato aquí", + "dxPivotGrid-rowFieldArea": "Arrastra campos de fila aquí", + "dxPivotGrid-filterFieldArea": "Arrastra campos de filtro aquí", + "dxScheduler-editorLabelTitle": "Asunto", + "dxScheduler-editorLabelStartDate": "Fecha inicial", + "dxScheduler-editorLabelEndDate": "Fecha final", + "dxScheduler-editorLabelDescription": "Descripción", + "dxScheduler-editorLabelRecurrence": "Repetir", + "dxScheduler-openAppointment": "Abrir cita", + "dxScheduler-recurrenceNever": "Nunca", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Diario", + "dxScheduler-recurrenceWeekly": "Semanal", + "dxScheduler-recurrenceMonthly": "Mensual", + "dxScheduler-recurrenceYearly": "Anual", + "dxScheduler-recurrenceRepeatEvery": "Cada", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Terminar repetición", + "dxScheduler-recurrenceAfter": "Después", + "dxScheduler-recurrenceOn": "En", + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "día(s)", + "dxScheduler-recurrenceRepeatWeekly": "semana(s)", + "dxScheduler-recurrenceRepeatMonthly": "mes(es)", + "dxScheduler-recurrenceRepeatYearly": "año(s)", + "dxScheduler-switcherDay": "Día", + "dxScheduler-switcherWeek": "Semana", + "dxScheduler-switcherWorkWeek": "Semana Laboral", + "dxScheduler-switcherMonth": "Mes", + "dxScheduler-switcherAgenda": "Agenda", + "dxScheduler-switcherTimelineDay": "Línea de tiempo Día", + "dxScheduler-switcherTimelineWeek": "Línea de tiempo Semana", + "dxScheduler-switcherTimelineWorkWeek": "Línea de tiempo Semana Laboral", + "dxScheduler-switcherTimelineMonth": "Línea de tiempo Mes", + "dxScheduler-recurrenceRepeatOnDate": "en la fecha", + "dxScheduler-recurrenceRepeatCount": "ocurrencia(s)", + "dxScheduler-allDay": "Todo el día", + "dxScheduler-confirmRecurrenceEditMessage": "¿Quiere modificar solo esta cita o toda la serie?", + "dxScheduler-confirmRecurrenceDeleteMessage": "¿Quiere eliminar solo esta cita o toda la serie?", + "dxScheduler-confirmRecurrenceEditSeries": "Modificar serie", + "dxScheduler-confirmRecurrenceDeleteSeries": "Eliminar serie", + "dxScheduler-confirmRecurrenceEditOccurrence": "Modificar cita", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Eliminar cita", + "dxScheduler-noTimezoneTitle": "Sin zona horaria", + "dxScheduler-moreAppointments": "{0} más", + "dxCalendar-todayButtonText": "Hoy", + "dxCalendar-ariaWidgetName": "Calendario", + "dxColorView-ariaRed": "Rojo", + "dxColorView-ariaGreen": "Verde", + "dxColorView-ariaBlue": "Azul", + "dxColorView-ariaAlpha": "Transparencia", + "dxColorView-ariaHex": "Código del color", + "dxTagBox-selected": "{0} seleccionado", + "dxTagBox-allSelected": "Todos seleccionados ({0})", + "dxTagBox-moreSelected": "{0} más", + "vizExport-printingButtonText": "Imprimir", + "vizExport-titleMenuText": "Exportar/Imprimir", + "vizExport-exportButtonText": "Archivo {0}", + "dxFilterBuilder-and": "Y", + "dxFilterBuilder-or": "O", + "dxFilterBuilder-notAnd": "NO Y", + "dxFilterBuilder-notOr": "NO O", + "dxFilterBuilder-addCondition": "Añadir condición", + "dxFilterBuilder-addGroup": "Añadir Grupo", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Igual", + "dxFilterBuilder-filterOperationNotEquals": "Diferente", + "dxFilterBuilder-filterOperationLess": "Menos que", + "dxFilterBuilder-filterOperationLessOrEquals": "Menor o igual que", + "dxFilterBuilder-filterOperationGreater": "Más grande que", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Mayor o igual que", + "dxFilterBuilder-filterOperationStartsWith": "Comienza con", + "dxFilterBuilder-filterOperationContains": "Contiene", + "dxFilterBuilder-filterOperationNotContains": "No contiene", + "dxFilterBuilder-filterOperationEndsWith": "Termina con", + "dxFilterBuilder-filterOperationIsBlank": "Vacío", + "dxFilterBuilder-filterOperationIsNotBlank": "No vacío", + "dxFilterBuilder-filterOperationBetween": "Entre", + "dxFilterBuilder-filterOperationAnyOf": "Alguno de", + "dxFilterBuilder-filterOperationNoneOf": "Ningún de", + "dxHtmlEditor-dialogColorCaption": "Cambiar el color de la fuente", + "dxHtmlEditor-dialogBackgroundCaption": "Cambiar el color de fondo", + "dxHtmlEditor-dialogLinkCaption": "Añadir enlace", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Texto", + "dxHtmlEditor-dialogLinkTargetField": "Abrir enlace en nueva ventana", + "dxHtmlEditor-dialogImageCaption": "Añadir imagen", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Texto alternativo", + "dxHtmlEditor-dialogImageWidthField": "Anchura (px)", + "dxHtmlEditor-dialogImageHeightField": "Altura (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Encabezamiento", + "dxHtmlEditor-normalText": "Texto normal", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + "dxFileManager-newDirectoryName": "Sin título", + "dxFileManager-rootDirectoryName": "Archivos", + "dxFileManager-errorNoAccess": "Acceso denegado. La operación no se puede completar.", + "dxFileManager-errorDirectoryExistsFormat": "Carpeta {0} ya existe.", + "dxFileManager-errorFileExistsFormat": "Archivo {0} ya existe.", + "dxFileManager-errorFileNotFoundFormat": "Archivo {0} no encontrado.", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "Error no especificado", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxFileManager-commandCreate": "TODO", + "dxFileManager-commandRename": "TODO", + "dxFileManager-commandMove": "TODO", + "dxFileManager-commandCopy": "TODO", + "dxFileManager-commandDelete": "TODO", + "dxFileManager-commandDownload": "TODO", + "dxFileManager-commandUpload": "TODO", + "dxFileManager-commandRefresh": "TODO", + "dxFileManager-commandThumbnails": "TODO", + "dxFileManager-commandDetails": "TODO", + "dxFileManager-commandClearSelection": "TODO", + "dxFileManager-commandShowNavPane": "TODO", + + "dxFileManager-dialogDirectoryChooserTitle": "TODO", + "dxFileManager-dialogDirectoryChooserButtonText": "TODO", + "dxFileManager-dialogRenameItemTitle": "TODO", + "dxFileManager-dialogRenameItemButtonText": "TODO", + "dxFileManager-dialogCreateDirectoryTitle": "TODO", + "dxFileManager-dialogCreateDirectoryButtonText": "TODO", + "dxFileManager-dialogDeleteItemTitle": "TODO", + "dxFileManager-dialogDeleteItemButtonText": "TODO", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "TODO", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "TODO", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "TODO", + "dxFileManager-editingCreateSingleItemSuccessMessage": "TODO", + "dxFileManager-editingCreateSingleItemErrorMessage": "TODO", + "dxFileManager-editingCreateCommonErrorMessage": "TODO", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "TODO", + "dxFileManager-editingRenameSingleItemSuccessMessage": "TODO", + "dxFileManager-editingRenameSingleItemErrorMessage": "TODO", + "dxFileManager-editingRenameCommonErrorMessage": "TODO", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "TODO", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "TODO", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "TODO", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "TODO", + "dxFileManager-editingDeleteSingleItemErrorMessage": "TODO", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "TODO", + "dxFileManager-editingDeleteCommonErrorMessage": "TODO", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "TODO", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "TODO", + "dxFileManager-editingMoveSingleItemSuccessMessage": "TODO", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "TODO", + "dxFileManager-editingMoveSingleItemErrorMessage": "TODO", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "TODO", + "dxFileManager-editingMoveCommonErrorMessage": "TODO", + + "dxFileManager-editingCopySingleItemProcessingMessage": "TODO", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "TODO", + "dxFileManager-editingCopySingleItemSuccessMessage": "TODO", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "TODO", + "dxFileManager-editingCopySingleItemErrorMessage": "TODO", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "TODO", + "dxFileManager-editingCopyCommonErrorMessage": "TODO", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "TODO", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "TODO", + "dxFileManager-editingUploadSingleItemSuccessMessage": "TODO", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "TODO", + "dxFileManager-editingUploadSingleItemErrorMessage": "TODO", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "TODO", + "dxFileManager-editingUploadCanceledMessage": "TODO", + + "dxFileManager-listDetailsColumnCaptionName": "TODO", + "dxFileManager-listDetailsColumnCaptionDateModified": "TODO", + "dxFileManager-listDetailsColumnCaptionFileSize": "TODO", + + "dxFileManager-listThumbnailsTooltipTextSize": "TODO", + "dxFileManager-listThumbnailsTooltipTextDateModified": "TODO", + + "dxFileManager-notificationProgressPanelTitle": "TODO", + "dxFileManager-notificationProgressPanelEmptyListText": "TODO", + "dxFileManager-notificationProgressPanelOperationCanceled": "TODO", + + "dxDiagram-categoryGeneral": "General", + "dxDiagram-categoryFlowchart": "Diagrama de flujo", + "dxDiagram-categoryOrgChart": "Organigrama", + "dxDiagram-categoryContainers": "Contenedores", + "dxDiagram-categoryCustom": "Personalizado", + + "dxDiagram-commandExportToSvg": "Exportar a SVG", + "dxDiagram-commandExportToPng": "Exportar a PNG", + "dxDiagram-commandExportToJpg": "Exportar a JPG", + "dxDiagram-commandUndo": "Deshacer", + "dxDiagram-commandRedo": "Rehacer", + "dxDiagram-commandFontName": "Nombre de fuente", + "dxDiagram-commandFontSize": "Tamaño de fuente", + "dxDiagram-commandBold": "Negrita", + "dxDiagram-commandItalic": "Cursiva", + "dxDiagram-commandUnderline": "Subrayado", + "dxDiagram-commandTextColor": "Color de fuente", + "dxDiagram-commandLineColor": "Color de línea", + "dxDiagram-commandLineWidth": "Ancho de línea", + "dxDiagram-commandLineStyle": "Estilo de línea", + "dxDiagram-commandLineStyleSolid": "Sólido", + "dxDiagram-commandLineStyleDotted": "De puntos", + "dxDiagram-commandLineStyleDashed": "De guiones", + "dxDiagram-commandFillColor": "Color de relleno", + "dxDiagram-commandAlignLeft": "Alinear a la izquierda", + "dxDiagram-commandAlignCenter": "Alinear al centro", + "dxDiagram-commandAlignRight": "Alinear a la derecha", + "dxDiagram-commandConnectorLineType": "Tipo de línea de conector", + "dxDiagram-commandConnectorLineStraight": "Recto", + "dxDiagram-commandConnectorLineOrthogonal": "Ortogonal", + "dxDiagram-commandConnectorLineStart": "Conector de inicio de línea", + "dxDiagram-commandConnectorLineEnd": "Conector de final de línea", + "dxDiagram-commandConnectorLineNone": "Ninguno", + "dxDiagram-commandConnectorLineArrow": "Flecha", + "dxDiagram-commandFullscreen": "Pantalla completa", + "dxDiagram-commandUnits": "Unidades", + "dxDiagram-commandPageSize": "Tamaño de página", + "dxDiagram-commandPageOrientation": "Orientación de página", + "dxDiagram-commandPageOrientationLandscape": "Horizontal", + "dxDiagram-commandPageOrientationPortrait": "Vertical", + "dxDiagram-commandPageColor": "Color de página", + "dxDiagram-commandShowGrid": "Mostrar cuadrícula", + "dxDiagram-commandSnapToGrid": "Ajustar a la cuadrícula", + "dxDiagram-commandGridSize": "Tamaño de cuadrícula", + "dxDiagram-commandZoomLevel": "Nivel de zoom", + "dxDiagram-commandAutoZoom": "Zoom automático", + "dxDiagram-commandFitToContent": "Ajustar al contenido", + "dxDiagram-commandFitToWidth": "Ajustar al ancho", + "dxDiagram-commandAutoZoomByContent": "Zoom automático por contenido", + "dxDiagram-commandAutoZoomByWidth": "Zoom automático por ancho", + "dxDiagram-commandSimpleView": "Vista Simple", + "dxDiagram-commandCut": "Cortar", + "dxDiagram-commandCopy": "Copiar", + "dxDiagram-commandPaste": "Pegar", + "dxDiagram-commandSelectAll": "Seleccionar todo", + "dxDiagram-commandDelete": "Eliminar", + "dxDiagram-commandBringToFront": "Traer al frente", + "dxDiagram-commandSendToBack": "Enviar al fondo", + "dxDiagram-commandLock": "Bloquear", + "dxDiagram-commandUnlock": "Desbloquear", + "dxDiagram-commandInsertShapeImage": "Insertar imagen...", + "dxDiagram-commandEditShapeImage": "Cambiar imagen...", + "dxDiagram-commandDeleteShapeImage": "Eliminar imagen", + "dxDiagram-commandLayoutLeftToRight": "De izquierda a derecha", + "dxDiagram-commandLayoutRightToLeft": "De derecha a izquierda", + "dxDiagram-commandLayoutTopToBottom": "De arriba a abajo", + "dxDiagram-commandLayoutBottomToTop": "De abajo a arriba", + + "dxDiagram-unitIn": "pulg.", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "Aceptar", + "dxDiagram-dialogButtonCancel": "Cancelar", + "dxDiagram-dialogInsertShapeImageTitle": "Insertar Imagen", + "dxDiagram-dialogEditShapeImageTitle": "Cambiar Imagen", + "dxDiagram-dialogEditShapeImageSelectButton": "Seleccionar imagen", + "dxDiagram-dialogEditShapeImageLabelText": "o colocar el archivo aquí", + + "dxDiagram-uiExport": "Exportar", + "dxDiagram-uiProperties": "Propiedades", + "dxDiagram-uiSettings": "Configuración", + "dxDiagram-uiShowToolbox": "Cuadro de herramientas", + "dxDiagram-uiSearch": "Buscar", + "dxDiagram-uiStyle": "Estilo", + "dxDiagram-uiLayout": "Diseño", + "dxDiagram-uiLayoutTree": "Árbol", + "dxDiagram-uiLayoutLayered": "Capas", + "dxDiagram-uiDiagram": "Diagrama", + "dxDiagram-uiText": "Texto", + "dxDiagram-uiObject": "Objeto", + "dxDiagram-uiConnector": "Conector", + "dxDiagram-uiPage": "Página", + + "dxDiagram-shapeText": "Texto", + "dxDiagram-shapeRectangle": "Rectángulo", + "dxDiagram-shapeEllipse": "Elipse", + "dxDiagram-shapeCross": "Cruz", + "dxDiagram-shapeTriangle": "Triángulo", + "dxDiagram-shapeDiamond": "Rombo", + "dxDiagram-shapeHeart": "Corazón", + "dxDiagram-shapePentagon": "Pentágono", + "dxDiagram-shapeHexagon": "Hexágono", + "dxDiagram-shapeOctagon": "Octágono", + "dxDiagram-shapeStar": "Estrella", + "dxDiagram-shapeArrowLeft": "Flecha izquierda", + "dxDiagram-shapeArrowUp": "Flecha arriba", + "dxDiagram-shapeArrowRight": "Flecha derecha", + "dxDiagram-shapeArrowDown": "Flecha abajo", + "dxDiagram-shapeArrowUpDown": "Flecha arriba/abajo", + "dxDiagram-shapeArrowLeftRight": "Flecha izquierda/derecha", + "dxDiagram-shapeProcess": "Proceso", + "dxDiagram-shapeDecision": "Decisión", + "dxDiagram-shapeTerminator": "Terminador", + "dxDiagram-shapePredefinedProcess": "Proceso predefinido", + "dxDiagram-shapeDocument": "Documento", + "dxDiagram-shapeMultipleDocuments": "Varios documentos", + "dxDiagram-shapeManualInput": "Entrada manual", + "dxDiagram-shapePreparation": "Preparación", + "dxDiagram-shapeData": "Datos", + "dxDiagram-shapeDatabase": "Base de datos", + "dxDiagram-shapeHardDisk": "Disco duro", + "dxDiagram-shapeInternalStorage": "Almacenamiento interno", + "dxDiagram-shapePaperTape": "Cinta de papel", + "dxDiagram-shapeManualOperation": "Operación manual", + "dxDiagram-shapeDelay": "Retraso", + "dxDiagram-shapeStoredData": "Datos almacenados", + "dxDiagram-shapeDisplay": "Pantalla", + "dxDiagram-shapeMerge": "Combinar", + "dxDiagram-shapeConnector": "Conector", + "dxDiagram-shapeOr": "O", + "dxDiagram-shapeSummingJunction": "Unión en Y", + "dxDiagram-shapeContainerDefaultText": "Contenedor", + "dxDiagram-shapeVerticalContainer": "Contenedor vertical", + "dxDiagram-shapeHorizontalContainer": "Contenedor horizontal", + "dxDiagram-shapeCardDefaultText": "Nombre de persona", + "dxDiagram-shapeCardWithImageOnLeft": "Tarjeta con imagen a la izquierda", + "dxDiagram-shapeCardWithImageOnTop": "Tarjeta con imagen en la parte superior", + "dxDiagram-shapeCardWithImageOnRight": "Tarjeta con imagen a la derecha", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Orden Ascendente", + "dxGantt-sortingDescendingText": "Orden Descendente", + "dxGantt-sortingClearText": "Limpiar Ordenamiento", + "dxGantt-showResources": "Mostrar Recursos", + "dxGantt-showDependencies": "Mostrar Dependencias", + "dxGantt-dialogStartDateValidation": "La fecha de inicio debe ser anterior {0}", + "dxGantt-dialogEndDateValidation": "La fecha de finalización debe ser posterior {0}" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fi.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fi.json new file mode 100644 index 0000000000000000000000000000000000000000..9cf6bef1f19666d2de6f060a069fb685d61c60eb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fi.json @@ -0,0 +1,558 @@ +{ + "fi": { + "Yes": "Kyllä", + "No": "Ei", + "Cancel": "Peruuta", + "Clear": "Tyhjennä", + "Done": "Valmis", + "Loading": "Ladataan...", + "Select": "Valitse...", + "Search": "Haku", + "Back": "Takaisin", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Ei näytettäviä tietoja", + + "dxDropDownEditor-selectLabel": "Valitse", + + "validation-required": "Pakollinen", + "validation-required-formatted": "{0} on pakollinen", + "validation-numeric": "Arvon on oltava luku", + "validation-numeric-formatted": "{0} on oltava luku", + "validation-range": "Arvo on alueen ulkopuolella", + "validation-range-formatted": "{0} on alueen ulkopuolella", + "validation-stringLength": "Arvon pituus ei ole oikein", + "validation-stringLength-formatted": "Arvolla {0} on väärä pituus", + "validation-custom": "Arvo on virheellinen", + "validation-custom-formatted": "{0} on virheellinen", + "validation-async": "Arvo on virheellinen", + "validation-async-formatted": "{0} on virheellinen", + "validation-compare": "Arvot eivät täsmää", + "validation-compare-formatted": "{0} eivät täsmää", + "validation-pattern": "Arvo ei vastaa mallia", + "validation-pattern-formatted": "{0} ei vastaa mallia", + "validation-email": "Sähköpostiosoite on virheellinen", + "validation-email-formatted": "{0} on virheellinen", + "validation-mask": "Arvo on virheellinen", + + "dxLookup-searchPlaceholder": "Merkkien vähimmäismäärä: {0}", + + "dxList-pullingDownText": "Päivitä vetämällä alas...", + "dxList-pulledDownText": "Päivitä vapauttamalla...", + "dxList-refreshingText": "Päivitetään...", + "dxList-pageLoadingText": "Ladataan...", + "dxList-nextButtonText": "Lisää", + "dxList-selectAll": "Valitse kaikki", + "dxListEditDecorator-delete": "Poista", + "dxListEditDecorator-more": "Lisää", + + "dxScrollView-pullingDownText": "Päivitä vetämällä alas...", + "dxScrollView-pulledDownText": "Päivitä vapauttamalla...", + "dxScrollView-refreshingText": "Päivitetään...", + "dxScrollView-reachBottomText": "Ladataan...", + + "dxDateBox-simulatedDataPickerTitleTime": "Valitse kellonaika", + "dxDateBox-simulatedDataPickerTitleDate": "Valitse päivämäärä", + "dxDateBox-simulatedDataPickerTitleDateTime": "Valitse päivämäärä ja kellonaika", + "dxDateBox-validation-datetime": "Arvon on oltava päiväys tai aika", + + "dxFileUploader-selectFile": "Valitse tiedosto", + "dxFileUploader-dropFile": "tai vedä ja pudota tiedosto tähän", + "dxFileUploader-bytes": "tavua", + "dxFileUploader-kb": "kt", + "dxFileUploader-Mb": "Mt", + "dxFileUploader-Gb": "Gt", + "dxFileUploader-upload": "Lähetä", + "dxFileUploader-uploaded": "Lähetetty", + "dxFileUploader-readyToUpload": "Valmis lähetettäväksi", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Lähetys epäonnistui", + "dxFileUploader-invalidFileExtension": "", + "dxFileUploader-invalidMaxFileSize": "", + "dxFileUploader-invalidMinFileSize": "", + + "dxRangeSlider-ariaFrom": "Alkaen", + "dxRangeSlider-ariaTill": "Asti", + "dxSwitch-switchedOnText": "PÄÄLLE", + "dxSwitch-switchedOffText": "POIS", + + "dxForm-optionalMark": "valinnainen", + "dxForm-requiredMessage": "{0} on pakollinen", + + "dxNumberBox-invalidValueMessage": "Arvon on oltava numero", + "dxNumberBox-noDataText": "Ei dataa", + + "dxDataGrid-columnChooserTitle": "Sarakkeenvalitsin", + "dxDataGrid-columnChooserEmptyText": "Vedä sarake täällä piilottaa sen", + "dxDataGrid-groupContinuesMessage": "Jatkuu seuraavalla sivulla", + "dxDataGrid-groupContinuedMessage": "Jatkoa edelliseltä sivulta", + "dxDataGrid-groupHeaderText": "Ryhmittele tämän sarakkeen mukaan", + "dxDataGrid-ungroupHeaderText": "Poista ryhmittely", + "dxDataGrid-ungroupAllText": "Poista kaikki ryhmittymät", + "dxDataGrid-editingEditRow": "Muokkaa", + "dxDataGrid-editingSaveRowChanges": "Tallenna", + "dxDataGrid-editingCancelRowChanges": "Peruuta", + "dxDataGrid-editingDeleteRow": "Poista", + "dxDataGrid-editingUndeleteRow": "Palauta", + "dxDataGrid-editingConfirmDeleteMessage": "Oletko varma, että haluat poistaa tämän tietueen?", + "dxDataGrid-validationCancelChanges": "Peruuta muutokset", + "dxDataGrid-groupPanelEmptyText": "Vedä sarakeotsikko tähän, jos haluat ryhmitellä kyseisen sarakkeen mukaan", + "dxDataGrid-noDataText": "Ei dataa", + "dxDataGrid-searchPanelPlaceholder": "Haku...", + "dxDataGrid-filterRowShowAllText": "(Kaikki)", + "dxDataGrid-filterRowResetOperationText": "Palauta", + "dxDataGrid-filterRowOperationEquals": "Yhtä suuri kuin", + "dxDataGrid-filterRowOperationNotEquals": "Eri suuri kuin", + "dxDataGrid-filterRowOperationLess": "Pienempi kuin", + "dxDataGrid-filterRowOperationLessOrEquals": "Pienempi tai yhtä suuri kuin", + "dxDataGrid-filterRowOperationGreater": "Suurempi kuin", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Suurempi tai yhtä suuri kuin", + "dxDataGrid-filterRowOperationStartsWith": "Alkaa merkeillä", + "dxDataGrid-filterRowOperationContains": "Sisältää", + "dxDataGrid-filterRowOperationNotContains": "Ei sisällä", + "dxDataGrid-filterRowOperationEndsWith": "Loppuu merkeillä", + "dxDataGrid-filterRowOperationBetween": "Välillä", + "dxDataGrid-filterRowOperationBetweenStartText": "Alkaa", + "dxDataGrid-filterRowOperationBetweenEndText": "Loppu", + "dxDataGrid-applyFilterText": "Käytä suodatinta", + "dxDataGrid-trueText": "tosi", + "dxDataGrid-falseText": "epätosi", + "dxDataGrid-sortingAscendingText": "Lajittele nouseva", + "dxDataGrid-sortingDescendingText": "Lajittele laskeva", + "dxDataGrid-sortingClearText": "Tyhjennä lajittelu", + "dxDataGrid-editingSaveAllChanges": "Tallenna muutokset", + "dxDataGrid-editingCancelAllChanges": "Hylkää muutokset", + "dxDataGrid-editingAddRow": "Lisää rivi", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min {1} on {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max {1} on {0}", + "dxDataGrid-summaryAvg": "Keskiarvo: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Keskiarvo {1} on {0}", + "dxDataGrid-summarySum": "Summa: {0}", + "dxDataGrid-summarySumOtherColumn": "Summa {1} on {0}", + "dxDataGrid-summaryCount": "Määrä: {0}", + "dxDataGrid-columnFixingFix": "Kiinteät sarakkeet", + "dxDataGrid-columnFixingUnfix": "Poista kiinteät sarakkeet", + "dxDataGrid-columnFixingLeftPosition": "Vasemmalle", + "dxDataGrid-columnFixingRightPosition": "Oikealle", + "dxDataGrid-exportTo": "Vie", + "dxDataGrid-exportToExcel": "Vie Exceliin", + "dxDataGrid-exporting": "Vienti...", + "dxDataGrid-excelFormat": "Excel-tiedostot", + "dxDataGrid-selectedRows": "Valitut tietueet", + "dxDataGrid-exportSelectedRows": "Vie valitut tietueet", + "dxDataGrid-exportAll": "Vie kaikki tiedot", + "dxDataGrid-headerFilterEmptyValue": "(Tyhjät)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Peruuta", + "dxDataGrid-ariaColumn": "Sarake", + "dxDataGrid-ariaValue": "Arvo", + "dxDataGrid-ariaFilterCell": "Suodatinsolu", + "dxDataGrid-ariaCollapse": "Tiivistä", + "dxDataGrid-ariaExpand": "Laajenna", + "dxDataGrid-ariaDataGrid": "Tietoruudukko", + "dxDataGrid-ariaSearchInGrid": "Hae tietoriviltä", + "dxDataGrid-ariaSelectAll": "Valitse kaikki", + "dxDataGrid-ariaSelectRow": "Valitse rivi", + "dxDataGrid-filterBuilderPopupTitle": "Suodattimen muodostin", + "dxDataGrid-filterPanelCreateFilter": "Luo suodatin", + "dxDataGrid-filterPanelClearFilter": "Tyhjennä", + "dxDataGrid-filterPanelFilterEnabledHint": "Ota suodatin käyttöön", + + "dxTreeList-ariaTreeList": "Puu", + "dxTreeList-editingAddRowToNode": "Lisää", + + "dxPager-infoText": "Sivu {0}/{1} ({2} kohdetta)", + "dxPager-pagesCountText": "/", + "dxPager-pageSizesAllText": "Kaikki", + + "dxPivotGrid-grandTotal": "Loppusumma", + "dxPivotGrid-total": "{0} Summa", + "dxPivotGrid-fieldChooserTitle": "Kentän valitseminen", + "dxPivotGrid-showFieldChooser": "Avaa kentän valitsemistoiminto", + "dxPivotGrid-expandAll": "Laajenna kaikki", + "dxPivotGrid-collapseAll": "Tiivistä kaikki", + "dxPivotGrid-sortColumnBySummary": "Lajittele \"{0}\" tähän sarakkeeseen", + "dxPivotGrid-sortRowBySummary": "Lajittele \"{0}\" tämän rivin mukaan", + "dxPivotGrid-removeAllSorting": "Poista kaikki lajittelu", + "dxPivotGrid-dataNotAvailable": "Puuttuu", + "dxPivotGrid-rowFields": "Rivikentät", + "dxPivotGrid-columnFields": "Sarakekentät", + "dxPivotGrid-dataFields": "Tietokentät", + "dxPivotGrid-filterFields": "Suodatinkentät", + "dxPivotGrid-allFields": "Kaikki kentät", + "dxPivotGrid-columnFieldArea": "Pudota sarakekentät tähän", + "dxPivotGrid-dataFieldArea": "Pudota tietokentät tähän", + "dxPivotGrid-rowFieldArea": "Pudota rivikentät tähän", + "dxPivotGrid-filterFieldArea": "Pudota suodatinkentät tähän", + + "dxScheduler-editorLabelTitle": "Aihe", + "dxScheduler-editorLabelStartDate": "Alkamispäivä", + "dxScheduler-editorLabelEndDate": "Päättymispäivä", + "dxScheduler-editorLabelDescription": "Kuvaus", + "dxScheduler-editorLabelRecurrence": "Toista", + + "dxScheduler-openAppointment": "Avaa tapaaminen", + + "dxScheduler-recurrenceNever": "Ei koskaan", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Päivittäin", + "dxScheduler-recurrenceWeekly": "Viikoittain", + "dxScheduler-recurrenceMonthly": "Kuukausittain", + "dxScheduler-recurrenceYearly": "Vuosittain", + + "dxScheduler-recurrenceRepeatEvery": "Joka", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Loppu", + "dxScheduler-recurrenceAfter": "Jälkeen", + "dxScheduler-recurrenceOn": "Aika", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "päivittäin", + "dxScheduler-recurrenceRepeatWeekly": "viikon välein", + "dxScheduler-recurrenceRepeatMonthly": "kuukauden välein", + "dxScheduler-recurrenceRepeatYearly": "vuosittain", + + "dxScheduler-switcherDay": "Päivä", + "dxScheduler-switcherWeek": "Viikko", + "dxScheduler-switcherWorkWeek": "Työviikko", + "dxScheduler-switcherMonth": "Kuukausi", + + "dxScheduler-switcherAgenda": "Esityslista", + + "dxScheduler-switcherTimelineDay": "Aikajana päivä", + "dxScheduler-switcherTimelineWeek": "Aikajana viikko", + "dxScheduler-switcherTimelineWorkWeek": "Aikajana työviikko", + "dxScheduler-switcherTimelineMonth": "Aikajana kuukausi", + + "dxScheduler-recurrenceRepeatOnDate": "päivämäärällä", + "dxScheduler-recurrenceRepeatCount": "esiintymiä", + "dxScheduler-allDay": "Koko päivä", + + "dxScheduler-confirmRecurrenceEditMessage": "Haluatko muokata vain tämän tapaamisen tai koko sarja?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Haluatko poistaa vain tämän tapaamisen tai koko sarja?", + + "dxScheduler-confirmRecurrenceEditSeries": "Muokkaa sarjaa", + "dxScheduler-confirmRecurrenceDeleteSeries": "Poista sarja", + "dxScheduler-confirmRecurrenceEditOccurrence": "Muokkaa tapaaminen", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Poista tapaaminen", + + "dxScheduler-noTimezoneTitle": "Ei aikavyöhyke", + "dxScheduler-moreAppointments": "{0} lisää", + + "dxCalendar-todayButtonText": "Tänään", + "dxCalendar-ariaWidgetName": "Kalenteri", + + "dxColorView-ariaRed": "Punainen", + "dxColorView-ariaGreen": "Vihreä", + "dxColorView-ariaBlue": "Sininen", + "dxColorView-ariaAlpha": "Läpinäkyvyys", + "dxColorView-ariaHex": "Värikoodi", + + "dxTagBox-selected": "{0} valittu", + "dxTagBox-allSelected": "Kaikki valitut ({0})", + "dxTagBox-moreSelected": "{0} lisää", + + "vizExport-printingButtonText": "Tulosta", + "vizExport-titleMenuText": "Vienti/Tulostus", + "vizExport-exportButtonText": "{0} tiedosto", + + "dxFilterBuilder-and": "Ja", + "dxFilterBuilder-or": "Tai", + "dxFilterBuilder-notAnd": "Ei ja", + "dxFilterBuilder-notOr": "Ei tai", + "dxFilterBuilder-addCondition": "Lisää ehto", + "dxFilterBuilder-addGroup": "Lisää ryhmä", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "On sama kuin", + "dxFilterBuilder-filterOperationNotEquals": "Ei ole sama kuin", + "dxFilterBuilder-filterOperationLess": "Pienempi kuin", + "dxFilterBuilder-filterOperationLessOrEquals": "Pienempi tai yhtä suuri kuin", + "dxFilterBuilder-filterOperationGreater": "Suurempi kuin", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Suurempi tai yhtä suuri kuin", + "dxFilterBuilder-filterOperationStartsWith": "Alkaa merkillä", + "dxFilterBuilder-filterOperationContains": "Sisältää", + "dxFilterBuilder-filterOperationNotContains": "Ei sisällä", + "dxFilterBuilder-filterOperationEndsWith": "Loppuu merkillä", + "dxFilterBuilder-filterOperationIsBlank": "On tyhjä", + "dxFilterBuilder-filterOperationIsNotBlank": "Ei ole tyhjä", + "dxFilterBuilder-filterOperationBetween": "Välillä", + "dxFilterBuilder-filterOperationAnyOf": "Joku näistä", + "dxFilterBuilder-filterOperationNoneOf": "Ei mikään näistä", + + "dxHtmlEditor-dialogColorCaption": "!TODO!", + "dxHtmlEditor-dialogBackgroundCaption": "!TODO!", + "dxHtmlEditor-dialogLinkCaption": "!TODO!", + "dxHtmlEditor-dialogLinkUrlField": "!TODO!", + "dxHtmlEditor-dialogLinkTextField": "!TODO!", + "dxHtmlEditor-dialogLinkTargetField": "!TODO!", + "dxHtmlEditor-dialogImageCaption": "!TODO!", + "dxHtmlEditor-dialogImageUrlField": "!TODO!", + "dxHtmlEditor-dialogImageAltField": "!TODO!", + "dxHtmlEditor-dialogImageWidthField": "!TODO!", + "dxHtmlEditor-dialogImageHeightField": "!TODO!", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "!TODO!", + "dxHtmlEditor-normalText": "!TODO!", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Lajittele nouseva", + "dxGantt-sortingDescendingText": "Lajittele laskeva", + "dxGantt-sortingClearText": "Tyhjennä lajittelu", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fr.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fr.json new file mode 100644 index 0000000000000000000000000000000000000000..8dc38dbaa545220a66c709333d607fd4774e4481 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/fr.json @@ -0,0 +1,635 @@ +{ + "fr": { + "Yes": "Oui", + "No": "Non", + "Cancel": "Annuler", + "Clear": "Vider", + "Done": "Terminé", + "Loading": "Chargement...", + "Select": "Sélection...", + "Search": "Recherche", + "Back": "Retour", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Pas de données", + + "dxDropDownEditor-selectLabel": "Sélection", + + "validation-required": "Obligatoire", + "validation-required-formatted": "{0} est obligatoire", + "validation-numeric": "La valeur doit être un nombre", + "validation-numeric-formatted": "{0} doit être un nombre", + "validation-range": "La valeur ne se trouve pas dans la plage valide", + "validation-range-formatted": "{0} ne se trouve pas dans la plage valide", + "validation-stringLength": "La longueur de la valeur est incorrecte", + "validation-stringLength-formatted": "La longueur de {0} est incorrecte", + "validation-custom": "La valeur est invalide", + "validation-custom-formatted": "{0} est invalide", + "validation-async": "La valeur est invalide", + "validation-async-formatted": "{0} est invalide", + "validation-compare": "La valeur est inappropriée", + "validation-compare-formatted": "{0} est inappropriée", + "validation-pattern": "La valeur ne correspond pas au modèle", + "validation-pattern-formatted": "{0} ne correspond pas au modèle", + "validation-email": "L'adresse email est invalide", + "validation-email-formatted": "{0} est invalide", + "validation-mask": "La valeur est invalide", + + "dxLookup-searchPlaceholder": "Nombre minimum de caractères: {0}", + + "dxList-pullingDownText": "Tirez vers le bas pour actualiser...", + "dxList-pulledDownText": "Relacher pour actualiser...", + "dxList-refreshingText": "Actualisation...", + "dxList-pageLoadingText": "Chargement...", + "dxList-nextButtonText": "Suivant", + "dxList-selectAll": "Sélectionner tout", + "dxListEditDecorator-delete": "Supprimer", + "dxListEditDecorator-more": "Plus", + + "dxScrollView-pullingDownText": "Tirez vers le bas pour actualiser...", + "dxScrollView-pulledDownText": "Relacher pour actualiser...", + "dxScrollView-refreshingText": "Mise à jour...", + "dxScrollView-reachBottomText": "Chargement...", + + "dxDateBox-simulatedDataPickerTitleTime": "Choisissez l'heure", + "dxDateBox-simulatedDataPickerTitleDate": "Choisissez la date", + "dxDateBox-simulatedDataPickerTitleDateTime": "Choisissez la date et l'heure", + "dxDateBox-validation-datetime": "La valeur doit être une date ou une heure.", + + "dxFileUploader-selectFile": "Choisissez un fichier", + "dxFileUploader-dropFile": "Enlever fichier", + "dxFileUploader-bytes": "Bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Télécharger", + "dxFileUploader-uploaded": "Téléchargé", + "dxFileUploader-readyToUpload": "Prêt à télécharger", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Échec du téléchargement", + "dxFileUploader-invalidFileExtension": "Type de fichier non autorisé", + "dxFileUploader-invalidMaxFileSize": "Fichier trop volumineux", + "dxFileUploader-invalidMinFileSize": "Fichier trop petit", + + "dxRangeSlider-ariaFrom": "De {0}", + "dxRangeSlider-ariaTill": "à {0}", + "dxSwitch-switchedOnText": "ON", + "dxSwitch-switchedOffText": "OFF", + + "dxForm-optionalMark": "optionnel", + "dxForm-requiredMessage": "{0} est obligatoire", + + "dxNumberBox-invalidValueMessage": "La valeur doit être un nombre", + "dxNumberBox-noDataText": "Pas de données", + + "dxDataGrid-columnChooserTitle": "Choisir les colonnes", + "dxDataGrid-columnChooserEmptyText": "Faites glisser une colonne ici pour la cacher", + "dxDataGrid-groupContinuesMessage": "Suite à la page suivante", + "dxDataGrid-groupContinuedMessage": "Suite de la page précédente", + "dxDataGrid-groupHeaderText": "Grouper avec cette colonne", + "dxDataGrid-ungroupHeaderText": "Dégrouper", + "dxDataGrid-ungroupAllText": "Dégrouper tout", + "dxDataGrid-editingEditRow": "Editer", + "dxDataGrid-editingSaveRowChanges": "Sauvegarder", + "dxDataGrid-editingCancelRowChanges": "Annuler", + "dxDataGrid-editingDeleteRow": "Supprimer", + "dxDataGrid-editingUndeleteRow": "Restaurer", + "dxDataGrid-editingConfirmDeleteMessage": "Êtes-vous sûr de vouloir supprimer cet élément ?", + "dxDataGrid-validationCancelChanges": "Annuler les changements", + "dxDataGrid-groupPanelEmptyText": "Faites glisser une colonne ICI pour grouper par celle-ci", + "dxDataGrid-noDataText": "Pas de données", + "dxDataGrid-searchPanelPlaceholder": "Recherche...", + "dxDataGrid-filterRowShowAllText": "(tous)", + "dxDataGrid-filterRowResetOperationText": "Réinitialiser", + "dxDataGrid-filterRowOperationEquals": "Egale", + "dxDataGrid-filterRowOperationNotEquals": "Différent de", + "dxDataGrid-filterRowOperationLess": "Plus petit", + "dxDataGrid-filterRowOperationLessOrEquals": "Plus petit ou égal", + "dxDataGrid-filterRowOperationGreater": "Plus grand", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Plus grand ou égal", + "dxDataGrid-filterRowOperationStartsWith": "Commence par", + "dxDataGrid-filterRowOperationContains": "Contient", + "dxDataGrid-filterRowOperationNotContains": "Ne contient pas", + "dxDataGrid-filterRowOperationEndsWith": "Termine par", + "dxDataGrid-filterRowOperationBetween": "Entre", + "dxDataGrid-filterRowOperationBetweenStartText": "Début", + "dxDataGrid-filterRowOperationBetweenEndText": "Fin", + "dxDataGrid-applyFilterText": "Filtrer le texte", + "dxDataGrid-trueText": "Vrai", + "dxDataGrid-falseText": "Faux", + "dxDataGrid-sortingAscendingText": "Tri croissant", + "dxDataGrid-sortingDescendingText": "Tri décroissant", + "dxDataGrid-sortingClearText": "Supprimer le tri", + "dxDataGrid-editingSaveAllChanges": "Sauvegarder les changements", + "dxDataGrid-editingCancelAllChanges": "Ignorer les changements", + "dxDataGrid-editingAddRow": "Ajouter ligne", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Minimum de {1} est {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Maximum de {1} est {0}", + "dxDataGrid-summaryAvg": "Moy: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Moyenne de {1} est {0}", + "dxDataGrid-summarySum": "Somme: {0}", + "dxDataGrid-summarySumOtherColumn": "Somme de {1} est {0}", + "dxDataGrid-summaryCount": "Total: {0}", + "dxDataGrid-columnFixingFix": "Fixer", + "dxDataGrid-columnFixingUnfix": "Détacher", + "dxDataGrid-columnFixingLeftPosition": "A gauche", + "dxDataGrid-columnFixingRightPosition": "A droite", + "dxDataGrid-exportTo": "Exporter", + "dxDataGrid-exportToExcel": "Exporter sous Excel", + "dxDataGrid-exporting": "Exporter...", + "dxDataGrid-excelFormat": "Fichier Excel", + "dxDataGrid-selectedRows": "Lignes sélectionnées", + "dxDataGrid-exportSelectedRows": "Exporter les lignes sélectionnées", + "dxDataGrid-exportAll": "Exporter tout", + "dxDataGrid-headerFilterEmptyValue": "(aucune valeur)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Annuler", + "dxDataGrid-ariaColumn": "Colonne", + "dxDataGrid-ariaValue": "Valeur", + "dxDataGrid-ariaFilterCell": "Filtre de cellule", + "dxDataGrid-ariaCollapse": "Réduire", + "dxDataGrid-ariaExpand": "Etendre", + "dxDataGrid-ariaDataGrid": "Grille", + "dxDataGrid-ariaSearchInGrid": "Rechercher dans la grille", + "dxDataGrid-ariaSelectAll": "Sélectionner tout", + "dxDataGrid-ariaSelectRow": "Sélectionner ligne", + "dxDataGrid-filterBuilderPopupTitle": "Création de filtre", + "dxDataGrid-filterPanelCreateFilter": "Créer un filtre", + "dxDataGrid-filterPanelClearFilter": "Supprimer", + "dxDataGrid-filterPanelFilterEnabledHint": "Activer le filtre", + + "dxTreeList-ariaTreeList": "Liste arborescente", + "dxTreeList-editingAddRowToNode": "Ajouter", + + "dxPager-infoText": "Page {0} sur {1} ({2} élements)", + "dxPager-pagesCountText": "sur", + "dxPager-pageSizesAllText": "Tous", + + "dxPivotGrid-grandTotal": "Total général", + "dxPivotGrid-total": "Total {0}", + "dxPivotGrid-fieldChooserTitle": "Liste des champs", + "dxPivotGrid-showFieldChooser": "Afficher la liste des champs", + "dxPivotGrid-expandAll": "Etendre tout", + "dxPivotGrid-collapseAll": "Réduire tout", + "dxPivotGrid-sortColumnBySummary": "Trier par colonne \"{0}\"", + "dxPivotGrid-sortRowBySummary": "Trier par ligne \"{0}\"", + "dxPivotGrid-removeAllSorting": "Supprimer les tris", + "dxPivotGrid-dataNotAvailable": "ND", + "dxPivotGrid-rowFields": "Lignes", + "dxPivotGrid-columnFields": "Colonnes", + "dxPivotGrid-dataFields": "Valeurs", + "dxPivotGrid-filterFields": "Filtres", + "dxPivotGrid-allFields": "Tous les champs", + "dxPivotGrid-columnFieldArea": "Déposer les champs de colonne ici", + "dxPivotGrid-dataFieldArea": "Déposer les champs de données ici", + "dxPivotGrid-rowFieldArea": "Déposer les champs de ligne ici", + "dxPivotGrid-filterFieldArea": "Déposer les champs de filtre ici", + + "dxScheduler-editorLabelTitle": "Titre", + "dxScheduler-editorLabelStartDate": "Date de début", + "dxScheduler-editorLabelEndDate": "Date de fin", + "dxScheduler-editorLabelDescription": "Description", + "dxScheduler-editorLabelRecurrence": "Récurrence", + + "dxScheduler-openAppointment": "Définir un évenement", + + "dxScheduler-recurrenceNever": "Jamais", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Quotidien", + "dxScheduler-recurrenceWeekly": "Hebdomadaire", + "dxScheduler-recurrenceMonthly": "Mensuel", + "dxScheduler-recurrenceYearly": "Annuel", + + "dxScheduler-recurrenceRepeatEvery": "Chaque", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Jusqu'à", + "dxScheduler-recurrenceAfter": "Après", + "dxScheduler-recurrenceOn": "Le", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "Jour(s)", + "dxScheduler-recurrenceRepeatWeekly": "Semaine(s)", + "dxScheduler-recurrenceRepeatMonthly": "Mois(s)", + "dxScheduler-recurrenceRepeatYearly": "Année(s)", + + "dxScheduler-switcherDay": "Jour", + "dxScheduler-switcherWeek": "Semaine", + "dxScheduler-switcherWorkWeek": "Semaine de travail", + "dxScheduler-switcherMonth": "Mois", + + "dxScheduler-switcherAgenda": "Agenda", + + "dxScheduler-switcherTimelineDay": "Timeline Jour", + "dxScheduler-switcherTimelineWeek": "Timeline Semaine", + "dxScheduler-switcherTimelineWorkWeek": "Timeline Semaine de travail", + "dxScheduler-switcherTimelineMonth": "Timeline Mois", + + "dxScheduler-recurrenceRepeatOnDate": "le", + "dxScheduler-recurrenceRepeatCount": "occurence(s)", + "dxScheduler-allDay": "Temps plein", + + "dxScheduler-confirmRecurrenceEditMessage": "Voulez-vous éditer cet évenement ou la série entière ?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Voulez-vous supprimer cet évenement ou la série entière ?", + + "dxScheduler-confirmRecurrenceEditSeries": "Editer serie", + "dxScheduler-confirmRecurrenceDeleteSeries": "Supprimer serie", + "dxScheduler-confirmRecurrenceEditOccurrence": "Editer évenement", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Supprimer évenement", + + "dxScheduler-noTimezoneTitle": "Pas de fuseau horaire", + "dxScheduler-moreAppointments": "{0} en plus", + + "dxCalendar-todayButtonText": "Aujourd'hui", + "dxCalendar-ariaWidgetName": "Calendrier", + + "dxColorView-ariaRed": "Rouge", + "dxColorView-ariaGreen": "Vert", + "dxColorView-ariaBlue": "Bleu", + "dxColorView-ariaAlpha": "Transparence", + "dxColorView-ariaHex": "Code couleur", + + "dxTagBox-selected": "{0} selectionnés", + "dxTagBox-allSelected": "Tous sélectionnés ({0})", + "dxTagBox-moreSelected": "{0} en plus", + + "vizExport-printingButtonText": "Imprimer", + "vizExport-titleMenuText": "Exporter/Imprimer", + "vizExport-exportButtonText": "{0} fichier", + + "dxFilterBuilder-and": "Et", + "dxFilterBuilder-or": "Ou", + "dxFilterBuilder-notAnd": "Non Et", + "dxFilterBuilder-notOr": "Non Ou", + "dxFilterBuilder-addCondition": "Ajouter une condition", + "dxFilterBuilder-addGroup": "Ajouter un groupe", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Est égal à", + "dxFilterBuilder-filterOperationNotEquals": "Est différent de", + "dxFilterBuilder-filterOperationLess": "Est plus petit que", + "dxFilterBuilder-filterOperationLessOrEquals": "Est plus petit ou égal à", + "dxFilterBuilder-filterOperationGreater": "Est plus grand que", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Est plus grand ou égal à", + "dxFilterBuilder-filterOperationStartsWith": "Commence par", + "dxFilterBuilder-filterOperationContains": "Contient", + "dxFilterBuilder-filterOperationNotContains": "Ne contient pas", + "dxFilterBuilder-filterOperationEndsWith": "Finit par", + "dxFilterBuilder-filterOperationIsBlank": "Est vide", + "dxFilterBuilder-filterOperationIsNotBlank": "N'est pas vide", + "dxFilterBuilder-filterOperationBetween": "Entre", + "dxFilterBuilder-filterOperationAnyOf": "Est parmi", + "dxFilterBuilder-filterOperationNoneOf": "N'est pas parmi", + + "dxHtmlEditor-dialogColorCaption": "Changer couleur police", + "dxHtmlEditor-dialogBackgroundCaption": "Changer couleur fond", + "dxHtmlEditor-dialogLinkCaption": "Ajouter un hyperlien", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Texte", + "dxHtmlEditor-dialogLinkTargetField": "Ouvrir le lien dans une nouvelle fenêtre", + "dxHtmlEditor-dialogImageCaption": "Ajouter image", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Texte alternatif", + "dxHtmlEditor-dialogImageWidthField": "Largeur (px)", + "dxHtmlEditor-dialogImageHeightField": "Hauteur (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Titre", + "dxHtmlEditor-normalText": "Texte normal", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "Répertoire sans titre", + "dxFileManager-rootDirectoryName": "Fichiers", + "dxFileManager-errorNoAccess": "Accès interdit. L'opération ne peut se terminer.", + "dxFileManager-errorDirectoryExistsFormat": "Répertoire '{0}' existe déjà.", + "dxFileManager-errorFileExistsFormat": "Fichier '{0}' existe déjà.", + "dxFileManager-errorFileNotFoundFormat": "Impossible de trouver le fichier '{0}.'", + "dxFileManager-errorDirectoryNotFoundFormat": "Impossible de trouver le répertoire '{0}.'", + "dxFileManager-errorWrongFileExtension": "Extension de fichier non permise.", + "dxFileManager-errorMaxFileSizeExceeded": "Taille du fichier dépasse la limite maximum permise.", + "dxFileManager-errorInvalidSymbols": "Ce nom contient des caractères invalides.", + "dxFileManager-errorDefault": "Erreur non spécifié.", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxFileManager-commandCreate": "Nouveau répertoire", + "dxFileManager-commandRename": "Renommer", + "dxFileManager-commandMove": "Déplacer", + "dxFileManager-commandCopy": "Copier", + "dxFileManager-commandDelete": "Supprimer", + "dxFileManager-commandDownload": "Télécharger", + "dxFileManager-commandUpload": "Téléverser des fichiers", + "dxFileManager-commandRefresh": "Rafraîchir", + "dxFileManager-commandThumbnails": "Mode vignette", + "dxFileManager-commandDetails": "Mode détails", + "dxFileManager-commandClearSelection": "Vider sélection", + "dxFileManager-commandShowNavPane": "TODO", + + "dxFileManager-dialogDirectoryChooserTitle": "Sélectionner répertoire de destination", + "dxFileManager-dialogDirectoryChooserButtonText": "Sélectionner", + "dxFileManager-dialogRenameItemTitle": "Renommer", + "dxFileManager-dialogRenameItemButtonText": "Sauvegarder", + "dxFileManager-dialogCreateDirectoryTitle": "Nouveau répertoire", + "dxFileManager-dialogCreateDirectoryButtonText": "Créer", + "dxFileManager-dialogDeleteItemTitle": "TODO", + "dxFileManager-dialogDeleteItemButtonText": "TODO", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "TODO", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "TODO", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "Créer un répertoire dans {0}", + "dxFileManager-editingCreateSingleItemSuccessMessage": "Répertoire créé dans {0}", + "dxFileManager-editingCreateSingleItemErrorMessage": "Répertoire n'est pas créé", + "dxFileManager-editingCreateCommonErrorMessage": "Répertoire n'est pas créé", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "Renommer un item dans {0}", + "dxFileManager-editingRenameSingleItemSuccessMessage": "Item renommé dans {0}", + "dxFileManager-editingRenameSingleItemErrorMessage": "Item non renommé", + "dxFileManager-editingRenameCommonErrorMessage": "Item non renommé", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "Supprimer un item de {0}", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "Supprimer {0} items de {1}", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "Item supprimé de {0}", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "{0} items supprimés de {1}", + "dxFileManager-editingDeleteSingleItemErrorMessage": "Item non suprimé", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "{0} items non supprimés", + "dxFileManager-editingDeleteCommonErrorMessage": "Des items ne sont pas supprimés", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "En train de déplacer un item vers {0}", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "En train de déplacer {0} items vers {1}", + "dxFileManager-editingMoveSingleItemSuccessMessage": "Item déplacé vers {0}", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "{0} items déplacés vers {1}", + "dxFileManager-editingMoveSingleItemErrorMessage": "Item non déplacé", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "{0} items non déplacés", + "dxFileManager-editingMoveCommonErrorMessage": "Des items ne sont pas déplacés", + + "dxFileManager-editingCopySingleItemProcessingMessage": "En train de copier un item vers {0}", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "En train de copier {0} items vers {1}", + "dxFileManager-editingCopySingleItemSuccessMessage": "Item copié vers {0}", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "{0} items copiés vers {1}", + "dxFileManager-editingCopySingleItemErrorMessage": "Item non copié", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "{0} items non copiés", + "dxFileManager-editingCopyCommonErrorMessage": "Des items ne sont pas copiés", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "En train de téléverser un item vers {0}", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "En train de téléverser {0} items vers {1}", + "dxFileManager-editingUploadSingleItemSuccessMessage": "Item téléversé vers {0}", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "{0} items téléversés vers {1}", + "dxFileManager-editingUploadSingleItemErrorMessage": "Item non téléversé", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "{0} items non téléversés", + "dxFileManager-editingUploadCanceledMessage": "Annulé", + + "dxFileManager-listDetailsColumnCaptionName": "Nom", + "dxFileManager-listDetailsColumnCaptionDateModified": "Date modifié", + "dxFileManager-listDetailsColumnCaptionFileSize": "Taille de fichier", + + "dxFileManager-listThumbnailsTooltipTextSize": "Taille", + "dxFileManager-listThumbnailsTooltipTextDateModified": "Date modifié", + + "dxFileManager-notificationProgressPanelTitle": "En cours", + "dxFileManager-notificationProgressPanelEmptyListText": "Aucune opération", + "dxFileManager-notificationProgressPanelOperationCanceled": "Annulé", + + "dxDiagram-categoryGeneral": "Général", + "dxDiagram-categoryFlowchart": "Organigramme", + "dxDiagram-categoryOrgChart": "Structure organisationnelle", + "dxDiagram-categoryContainers": "Conteneurs", + "dxDiagram-categoryCustom": "Personnalisé", + + "dxDiagram-commandExportToSvg": "Exporter en SVG", + "dxDiagram-commandExportToPng": "Exporter en PNG", + "dxDiagram-commandExportToJpg": "Exporter en JPEG", + "dxDiagram-commandUndo": "Annuler", + "dxDiagram-commandRedo": "Refaire", + "dxDiagram-commandFontName": "Nom de la police", + "dxDiagram-commandFontSize": "Taille de la police", + "dxDiagram-commandBold": "Gras", + "dxDiagram-commandItalic": "Italique", + "dxDiagram-commandUnderline": "Souligner", + "dxDiagram-commandTextColor": "Couleur texte", + "dxDiagram-commandLineColor": "Couleur ligne", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "Couleur remplissage", + "dxDiagram-commandAlignLeft": "Aligner à gauche", + "dxDiagram-commandAlignCenter": "Centrer", + "dxDiagram-commandAlignRight": "Aligner à droite", + "dxDiagram-commandConnectorLineType": "Type de ligne de connexion", + "dxDiagram-commandConnectorLineStraight": "Droit", + "dxDiagram-commandConnectorLineOrthogonal": "Orthogonal", + "dxDiagram-commandConnectorLineStart": "Début de la ligne de connexion", + "dxDiagram-commandConnectorLineEnd": "Fin de la ligne de connexion", + "dxDiagram-commandConnectorLineNone": "Aucun", + "dxDiagram-commandConnectorLineArrow": "Flèche", + "dxDiagram-commandFullscreen": "Plein écran", + "dxDiagram-commandUnits": "Unités", + "dxDiagram-commandPageSize": "Taille de la page", + "dxDiagram-commandPageOrientation": "Orientation de la page", + "dxDiagram-commandPageOrientationLandscape": "Paysage", + "dxDiagram-commandPageOrientationPortrait": "Portrait", + "dxDiagram-commandPageColor": "Couleur de la page", + "dxDiagram-commandShowGrid": "Afficher la grille", + "dxDiagram-commandSnapToGrid": "Aligner sur la grille", + "dxDiagram-commandGridSize": "Taille de la grille", + "dxDiagram-commandZoomLevel": "Niveau de zoom", + "dxDiagram-commandAutoZoom": "Zoom automatique", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "Vue simple", + "dxDiagram-commandCut": "Couper", + "dxDiagram-commandCopy": "Copier", + "dxDiagram-commandPaste": "Coller", + "dxDiagram-commandSelectAll": "Tout sélectionner", + "dxDiagram-commandDelete": "Supprimer", + "dxDiagram-commandBringToFront": "Amener au premier plan", + "dxDiagram-commandSendToBack": "Envoyer à l'arrière", + "dxDiagram-commandLock": "Verrouiller", + "dxDiagram-commandUnlock": "Déverrouiller", + "dxDiagram-commandInsertShapeImage": "Insérer une image...", + "dxDiagram-commandEditShapeImage": "Changer image...", + "dxDiagram-commandDeleteShapeImage": "Supprimer image", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "po", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Annuler", + "dxDiagram-dialogInsertShapeImageTitle": "Insérer une image", + "dxDiagram-dialogEditShapeImageTitle": "Changer image", + "dxDiagram-dialogEditShapeImageSelectButton": "Sélectionner une image", + "dxDiagram-dialogEditShapeImageLabelText": "ou déposer le fichier ici", + + "dxDiagram-uiExport": "Exporter", + "dxDiagram-uiProperties": "Propriétés", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "Arbre", + "dxDiagram-uiLayoutLayered": "Par couches", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "Texte", + "dxDiagram-shapeRectangle": "Rectangle", + "dxDiagram-shapeEllipse": "Ellipse", + "dxDiagram-shapeCross": "Croix", + "dxDiagram-shapeTriangle": "Triangle", + "dxDiagram-shapeDiamond": "Diamant", + "dxDiagram-shapeHeart": "Cœur", + "dxDiagram-shapePentagon": "Pentagone", + "dxDiagram-shapeHexagon": "Hexagone", + "dxDiagram-shapeOctagon": "Octogone", + "dxDiagram-shapeStar": "Étoile", + "dxDiagram-shapeArrowLeft": "Flèche gauche", + "dxDiagram-shapeArrowUp": "Flèche vers le haut", + "dxDiagram-shapeArrowRight": "Flèche droite", + "dxDiagram-shapeArrowDown": "Flèche vers le bas", + "dxDiagram-shapeArrowUpDown": "Flèche haut bas", + "dxDiagram-shapeArrowLeftRight": "Flèche gauche droite", + "dxDiagram-shapeProcess": "Processus", + "dxDiagram-shapeDecision": "Décision", + "dxDiagram-shapeTerminator": "Terminator", + "dxDiagram-shapePredefinedProcess": "Processus prédéfini", + "dxDiagram-shapeDocument": "Document", + "dxDiagram-shapeMultipleDocuments": "Documents multiples", + "dxDiagram-shapeManualInput": "Entrée manuelle", + "dxDiagram-shapePreparation": "Préparation", + "dxDiagram-shapeData": "Données", + "dxDiagram-shapeDatabase": "Base de données", + "dxDiagram-shapeHardDisk": "Disque dur", + "dxDiagram-shapeInternalStorage": "Stockage interne", + "dxDiagram-shapePaperTape": "Bande de papier", + "dxDiagram-shapeManualOperation": "Opération manuelle", + "dxDiagram-shapeDelay": "Retard", + "dxDiagram-shapeStoredData": "Les données stockées", + "dxDiagram-shapeDisplay": "Afficher", + "dxDiagram-shapeMerge": "Fusionner", + "dxDiagram-shapeConnector": "Connecteur", + "dxDiagram-shapeOr": "Ou", + "dxDiagram-shapeSummingJunction": "Jonction de sommation", + "dxDiagram-shapeContainerDefaultText": "Récipient", + "dxDiagram-shapeVerticalContainer": "Conteneur vertical", + "dxDiagram-shapeHorizontalContainer": "Conteneur horizontal", + "dxDiagram-shapeCardDefaultText": "Nom de la personne", + "dxDiagram-shapeCardWithImageOnLeft": "Carte avec image à gauche", + "dxDiagram-shapeCardWithImageOnTop": "Carte avec image sur le dessus", + "dxDiagram-shapeCardWithImageOnRight": "Carte avec image à droite", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Tri croissant", + "dxGantt-sortingDescendingText": "Tri décroissant", + "dxGantt-sortingClearText": "Supprimer le tri", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/hu.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/hu.json new file mode 100644 index 0000000000000000000000000000000000000000..b34cf23ca92d5fbb93f14efe30f094f6c4d35fa1 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/hu.json @@ -0,0 +1,557 @@ +{ + "hu": { + "Yes": "Igen", + "No": "Nem", + "Cancel": "Mégse", + "Clear": "Törlés", + "Done": "Kész", + "Loading": "Betöltés...", + "Select": "Választás...", + "Search": "Keresés", + "Back": "Vissza", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Nincs megjeleníthető adat", + + "dxDropDownEditor-selectLabel": "Választás", + + "validation-required": "Kötelező", + "validation-required-formatted": "{0} kötelező", + "validation-numeric": "Az érték szám kell legyen", + "validation-numeric-formatted": "{0} szám kell legyen", + "validation-range": "Az érték tartományon kívülre esik", + "validation-range-formatted": "{0} tartományon kívülre esik", + "validation-stringLength": "Az érték hossza helytelen", + "validation-stringLength-formatted": "{0} hossza helytelen", + "validation-custom": "Érvénytelen érték", + "validation-custom-formatted": "{0} érvénytelen", + "validation-async": "Érvénytelen érték", + "validation-async-formatted": "{0} érvénytelen", + "validation-compare": "Az értékek nem egyeznek", + "validation-compare-formatted": "{0} nem egyezik", + "validation-pattern": "Az érték nem illeszthető a mintára", + "validation-pattern-formatted": "{0} nem illeszthető a mintára", + "validation-email": "Érvénytelen email", + "validation-email-formatted": "{0} érvénytelen email", + "validation-mask": "Érvénytelen érték", + + "dxLookup-searchPlaceholder": "Minimum karakterszám: {0}", + + "dxList-pullingDownText": "Húzza le a frissítéshez...", + "dxList-pulledDownText": "Engedje el a frissítéshez...", + "dxList-refreshingText": "Frissítés...", + "dxList-pageLoadingText": "Betöltés...", + "dxList-nextButtonText": "Tovább", + "dxList-selectAll": "Összes kiválasztása", + "dxListEditDecorator-delete": "Törlés", + "dxListEditDecorator-more": "Több", + + "dxScrollView-pullingDownText": "Húzza le a frissítéshez...", + "dxScrollView-pulledDownText": "Engedje el a frissítéshez...", + "dxScrollView-refreshingText": "Frissítés...", + "dxScrollView-reachBottomText": "Betöltés...", + + "dxDateBox-simulatedDataPickerTitleTime": "Válasszon időt", + "dxDateBox-simulatedDataPickerTitleDate": "Válasszon dátumot", + "dxDateBox-simulatedDataPickerTitleDateTime": "Válasszon dátumot és időt", + "dxDateBox-validation-datetime": "Az érték dátum vagy idő kell legyen", + + "dxFileUploader-selectFile": "Válasszon fájlt", + "dxFileUploader-dropFile": "vagy húzza a fájlt ide", + "dxFileUploader-bytes": "bájt", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Feltöltés", + "dxFileUploader-uploaded": "Feltöltve", + "dxFileUploader-readyToUpload": "Feltöltésre kész", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "A feltöltés sikertelen", + "dxFileUploader-invalidFileExtension": "Nem engedélyezett fájltípus", + "dxFileUploader-invalidMaxFileSize": "Túl nagy fájl", + "dxFileUploader-invalidMinFileSize": "Túl kicsi fájl", + + "dxRangeSlider-ariaFrom": "-tól", + "dxRangeSlider-ariaTill": "-ig", + "dxSwitch-switchedOnText": "BE", + "dxSwitch-switchedOffText": "KI", + + "dxForm-optionalMark": "választható", + "dxForm-requiredMessage": "{0} kötelező", + + "dxNumberBox-invalidValueMessage": "Az érték szám kell legyen", + "dxNumberBox-noDataText": "Nincs adat", + + "dxDataGrid-columnChooserTitle": "Oszlopválasztó", + "dxDataGrid-columnChooserEmptyText": "Húzza ide az oszlopot az elrejtéshez", + "dxDataGrid-groupContinuesMessage": "A következő oldalon folytatódik", + "dxDataGrid-groupContinuedMessage": "Folytatás az előző oldalról", + "dxDataGrid-groupHeaderText": "Csoportosítás ezen oszlop szerint", + "dxDataGrid-ungroupHeaderText": "Csoportbontás", + "dxDataGrid-ungroupAllText": "Összes csoportbontása", + "dxDataGrid-editingEditRow": "Szerkesztés", + "dxDataGrid-editingSaveRowChanges": "Mentés", + "dxDataGrid-editingCancelRowChanges": "Mégse", + "dxDataGrid-editingDeleteRow": "Törlés", + "dxDataGrid-editingUndeleteRow": "Visszaállítás", + "dxDataGrid-editingConfirmDeleteMessage": "Biztosan törli ezt a rekordot?", + "dxDataGrid-validationCancelChanges": "Módosítások elvetése", + "dxDataGrid-groupPanelEmptyText": "Húzzon ide egy oszlopfejlécet a csoportosításhoz", + "dxDataGrid-noDataText": "Nincs adat", + "dxDataGrid-searchPanelPlaceholder": "Keresés...", + "dxDataGrid-filterRowShowAllText": "(Mind)", + "dxDataGrid-filterRowResetOperationText": "Visszaállítás", + "dxDataGrid-filterRowOperationEquals": "Egyenlő", + "dxDataGrid-filterRowOperationNotEquals": "Nem egyenlő", + "dxDataGrid-filterRowOperationLess": "Kisebb", + "dxDataGrid-filterRowOperationLessOrEquals": "Kisebb vagy egyenlő", + "dxDataGrid-filterRowOperationGreater": "Nagyobb", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Nagyobb vagy egyenlő", + "dxDataGrid-filterRowOperationStartsWith": "Kezdődik", + "dxDataGrid-filterRowOperationContains": "Tartalmazza", + "dxDataGrid-filterRowOperationNotContains": "Nem tartalmazza", + "dxDataGrid-filterRowOperationEndsWith": "Végződik", + "dxDataGrid-filterRowOperationBetween": "Között", + "dxDataGrid-filterRowOperationBetweenStartText": "Kezdete", + "dxDataGrid-filterRowOperationBetweenEndText": "Vége", + "dxDataGrid-applyFilterText": "Szűrő alkalmazása", + "dxDataGrid-trueText": "igaz", + "dxDataGrid-falseText": "hamis", + "dxDataGrid-sortingAscendingText": "Növekvő", + "dxDataGrid-sortingDescendingText": "Csökkenő", + "dxDataGrid-sortingClearText": "Rendezés törlése", + "dxDataGrid-editingSaveAllChanges": "Módosítások mentése", + "dxDataGrid-editingCancelAllChanges": "Módosítások elvetése", + "dxDataGrid-editingAddRow": "Sor hozzáadása", + "dxDataGrid-summaryMin": "Minimum: {0}", + "dxDataGrid-summaryMinOtherColumn": "{1} minimuma: {0}", + "dxDataGrid-summaryMax": "Maximum: {0}", + "dxDataGrid-summaryMaxOtherColumn": "{1} maximuma: {0}", + "dxDataGrid-summaryAvg": "Átlag: {0}", + "dxDataGrid-summaryAvgOtherColumn": "{1} átlaga: {0}", + "dxDataGrid-summarySum": "Összeg: {0}", + "dxDataGrid-summarySumOtherColumn": "{1} összege: {0}", + "dxDataGrid-summaryCount": "Darabszám: {0}", + "dxDataGrid-columnFixingFix": "Rögzítés", + "dxDataGrid-columnFixingUnfix": "Feloldás", + "dxDataGrid-columnFixingLeftPosition": "Balra", + "dxDataGrid-columnFixingRightPosition": "Jobbra", + "dxDataGrid-exportTo": "Exportálás", + "dxDataGrid-exportToExcel": "Exportálás Excel fájlba", + "dxDataGrid-exporting": "Exportálás...", + "dxDataGrid-excelFormat": "Excel fájl", + "dxDataGrid-selectedRows": "Kiválasztott sorok", + "dxDataGrid-exportSelectedRows": "Kiválasztott sorok exportálása", + "dxDataGrid-exportAll": "Az összes adat exportálása", + "dxDataGrid-headerFilterEmptyValue": "(Üresek)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Mégse", + "dxDataGrid-ariaColumn": "Oszlop", + "dxDataGrid-ariaValue": "Érték", + "dxDataGrid-ariaFilterCell": "Szűrő cella", + "dxDataGrid-ariaCollapse": "Összecsukás", + "dxDataGrid-ariaExpand": "Kibontás", + "dxDataGrid-ariaDataGrid": "Adatrács", + "dxDataGrid-ariaSearchInGrid": "Keresés az adatrácsban", + "dxDataGrid-ariaSelectAll": "Összes kiválasztása", + "dxDataGrid-ariaSelectRow": "Sor kiválasztása", + "dxDataGrid-filterBuilderPopupTitle": "Szűrőkészítő", + "dxDataGrid-filterPanelCreateFilter": "Szűrő létrehozása", + "dxDataGrid-filterPanelClearFilter": "Törlés", + "dxDataGrid-filterPanelFilterEnabledHint": "Szűrő engedélyezése", + + "dxTreeList-ariaTreeList": "Fa lista", + "dxTreeList-editingAddRowToNode": "Hozzáadás", + + "dxPager-infoText": "Oldal: {0}/{1} ({2} elem)", + "dxPager-pagesCountText": "/", + "dxPager-pageSizesAllText": "Mind", + + "dxPivotGrid-grandTotal": "Teljes összeg", + "dxPivotGrid-total": "{0} Összeg", + "dxPivotGrid-fieldChooserTitle": "Mezőválasztó", + "dxPivotGrid-showFieldChooser": "Mezőválasztó megjelenítése", + "dxPivotGrid-expandAll": "Összes kibontása", + "dxPivotGrid-collapseAll": "Összes összecsukása", + "dxPivotGrid-sortColumnBySummary": "Rendezés \"{0}\" ezen oszlop alapján", + "dxPivotGrid-sortRowBySummary": "Rendezés \"{0}\" ezen sor alapján", + "dxPivotGrid-removeAllSorting": "Összes rendezés törlése", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Sormező", + "dxPivotGrid-columnFields": "Oszlopmező", + "dxPivotGrid-dataFields": "Adatmező", + "dxPivotGrid-filterFields": "Szűrőmező", + "dxPivotGrid-allFields": "Összes mező", + "dxPivotGrid-columnFieldArea": "Húzza az oszlopmezőket ide", + "dxPivotGrid-dataFieldArea": "Húzza az adatmezőket ide", + "dxPivotGrid-rowFieldArea": "Húzza a sormezőket ide", + "dxPivotGrid-filterFieldArea": "Húzza a szűrőmezőket ide", + + "dxScheduler-editorLabelTitle": "Tárgy", + "dxScheduler-editorLabelStartDate": "Kezdés dátuma", + "dxScheduler-editorLabelEndDate": "Befejezés dátuma", + "dxScheduler-editorLabelDescription": "Leírás", + "dxScheduler-editorLabelRecurrence": "Ismétlődés", + + "dxScheduler-openAppointment": "Találkozó megnyitása", + + "dxScheduler-recurrenceNever": "Soha", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Naponta", + "dxScheduler-recurrenceWeekly": "Hetente", + "dxScheduler-recurrenceMonthly": "Havonta", + "dxScheduler-recurrenceYearly": "Évente", + + "dxScheduler-recurrenceRepeatEvery": "Ismétlődés minden", + "dxScheduler-recurrenceRepeatOn": "Ismétlődés", + "dxScheduler-recurrenceEnd": "Ismétlődés vége", + "dxScheduler-recurrenceAfter": "Után", + "dxScheduler-recurrenceOn": "Ekkor", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "nap(ok)", + "dxScheduler-recurrenceRepeatWeekly": "hét(ek)", + "dxScheduler-recurrenceRepeatMonthly": "hónap(ok)", + "dxScheduler-recurrenceRepeatYearly": "év(ek)", + + "dxScheduler-switcherDay": "Nap", + "dxScheduler-switcherWeek": "Hét", + "dxScheduler-switcherWorkWeek": "Munkahét", + "dxScheduler-switcherMonth": "Hónap", + + "dxScheduler-switcherAgenda": "Naptár", + + "dxScheduler-switcherTimelineDay": "Idővonal nap", + "dxScheduler-switcherTimelineWeek": "Idővonal hét", + "dxScheduler-switcherTimelineWorkWeek": "Idővonal munkahét", + "dxScheduler-switcherTimelineMonth": "Idővonal hónap", + + "dxScheduler-recurrenceRepeatOnDate": "dátumon", + "dxScheduler-recurrenceRepeatCount": "előfordulás(ok)", + "dxScheduler-allDay": "Egész nap", + + "dxScheduler-confirmRecurrenceEditMessage": "Csak ezt az alkalmat szeretné szerkeszteni, vagy az összes ismétlődést?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Csak ezt az alkalmat szeretné törölni, vagy az összes ismétlődést?", + + "dxScheduler-confirmRecurrenceEditSeries": "Ismétlődés szerkesztése", + "dxScheduler-confirmRecurrenceDeleteSeries": "Ismétlődés törlése", + "dxScheduler-confirmRecurrenceEditOccurrence": "Alkalom szerkesztése", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Alkalom törlése", + + "dxScheduler-noTimezoneTitle": "Nincs időzóna", + "dxScheduler-moreAppointments": "{0} több", + + "dxCalendar-todayButtonText": "Ma", + "dxCalendar-ariaWidgetName": "Naptár", + + "dxColorView-ariaRed": "Piros", + "dxColorView-ariaGreen": "Zöld", + "dxColorView-ariaBlue": "Kék", + "dxColorView-ariaAlpha": "Átlátszóság", + "dxColorView-ariaHex": "Színkód", + + "dxTagBox-selected": "{0} kiválasztva", + "dxTagBox-allSelected": "Összes kiválasztva ({0})", + "dxTagBox-moreSelected": "{0} több", + + "vizExport-printingButtonText": "Nyomtatás", + "vizExport-titleMenuText": "Exportálás/Nyomtatás", + "vizExport-exportButtonText": "{0} fájl", + + "dxFilterBuilder-and": "És", + "dxFilterBuilder-or": "Vagy", + "dxFilterBuilder-notAnd": "Nem És", + "dxFilterBuilder-notOr": "Nem Vagy", + "dxFilterBuilder-addCondition": "Feltétel hozzáadása", + "dxFilterBuilder-addGroup": "Csoport hozzáadása", + "dxFilterBuilder-enterValueText": "<írjon be egy értéket>", + "dxFilterBuilder-filterOperationEquals": "Egyenlő", + "dxFilterBuilder-filterOperationNotEquals": "Nem egyenlő", + "dxFilterBuilder-filterOperationLess": "Kisebb", + "dxFilterBuilder-filterOperationLessOrEquals": "Kisebb vagy egyenlő", + "dxFilterBuilder-filterOperationGreater": "Nagyobb", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Nagyobb vagy egyenlő", + "dxFilterBuilder-filterOperationStartsWith": "Kezdődik", + "dxFilterBuilder-filterOperationContains": "Tartalmazza", + "dxFilterBuilder-filterOperationNotContains": "Nem tartalmazza", + "dxFilterBuilder-filterOperationEndsWith": "Végződik", + "dxFilterBuilder-filterOperationIsBlank": "Üres", + "dxFilterBuilder-filterOperationIsNotBlank": "Nem üres", + "dxFilterBuilder-filterOperationBetween": "Között", + "dxFilterBuilder-filterOperationAnyOf": "Valamelyik", + "dxFilterBuilder-filterOperationNoneOf": "Egyik sem", + + "dxHtmlEditor-dialogColorCaption": "Betűszín választás", + "dxHtmlEditor-dialogBackgroundCaption": "Háttérszín választás", + "dxHtmlEditor-dialogLinkCaption": "Link hozzáadása", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Szöveg", + "dxHtmlEditor-dialogLinkTargetField": "Link megnyitása új ablakban", + "dxHtmlEditor-dialogImageCaption": "Kép hozzáadása", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Alternatív szöveg", + "dxHtmlEditor-dialogImageWidthField": "Szélesség (px)", + "dxHtmlEditor-dialogImageHeightField": "Magasság (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Fejléc", + "dxHtmlEditor-normalText": "Normál szöveg", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "Névtelen könyvtár", + "dxFileManager-rootDirectoryName": "Fájlok", + "dxFileManager-errorNoAccess": "Hozzáférés megtagadva. A műveletet nem lehet befejezni.", + "dxFileManager-errorDirectoryExistsFormat": "'{0}' nevű könyvtár már létezik.", + "dxFileManager-errorFileExistsFormat": "'{0}' nevű fájl már létezik.", + "dxFileManager-errorFileNotFoundFormat": "'{0}' nevű fájl nem található", + "dxFileManager-errorDirectoryNotFoundFormat": "'{0}' nevű könyvtár nem található", + "dxFileManager-errorWrongFileExtension": "Nem engedélyezett fájltípus", + "dxFileManager-errorMaxFileSizeExceeded": "A fájlméret meghaladja a megengedett legnagyobb méretet", + "dxFileManager-errorDefault": "Ismeretlen hiba.", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "Általános", + "dxDiagram-categoryFlowchart": "Folyamatábra", + "dxDiagram-categoryOrgChart": "Szervezeti ábra", + "dxDiagram-categoryContainers": "Tárolók", + "dxDiagram-categoryCustom": "Egyedi", + + "dxDiagram-commandExportToSvg": "Exportálás SVG-be", + "dxDiagram-commandExportToPng": "Exportálás PNG-be", + "dxDiagram-commandExportToJpg": "Exportálás JPEG-be", + "dxDiagram-commandUndo": "Visszavonás", + "dxDiagram-commandRedo": "Újra", + "dxDiagram-commandFontName": "Betűtípus", + "dxDiagram-commandFontSize": "Betűméret", + "dxDiagram-commandBold": "Félkövér", + "dxDiagram-commandItalic": "Dőlt", + "dxDiagram-commandUnderline": "Aláhúzott", + "dxDiagram-commandTextColor": "Betűszín", + "dxDiagram-commandLineColor": "Sor színe", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "Kitöltő szín", + "dxDiagram-commandAlignLeft": "Balra igazítás", + "dxDiagram-commandAlignCenter": "Középre igazítás", + "dxDiagram-commandAlignRight": "Jobbra igazítás", + "dxDiagram-commandConnectorLineType": "Összekötő vonal típusa", + "dxDiagram-commandConnectorLineStraight": "Egyenes", + "dxDiagram-commandConnectorLineOrthogonal": "Merőleges", + "dxDiagram-commandConnectorLineStart": "Összekötő vonal kezdete", + "dxDiagram-commandConnectorLineEnd": "Összekötő vonal vége", + "dxDiagram-commandConnectorLineNone": "Egyik sem", + "dxDiagram-commandConnectorLineArrow": "Nyíl", + "dxDiagram-commandFullscreen": "Teljes képernyő", + "dxDiagram-commandUnits": "Egységek", + "dxDiagram-commandPageSize": "Lapméret", + "dxDiagram-commandPageOrientation": "Tájolás", + "dxDiagram-commandPageOrientationLandscape": "Fekvő", + "dxDiagram-commandPageOrientationPortrait": "Álló", + "dxDiagram-commandPageColor": "Oldal színe", + "dxDiagram-commandShowGrid": "Rács megjelenítése", + "dxDiagram-commandSnapToGrid": "Rácshoz igazítás", + "dxDiagram-commandGridSize": "Rács mérete", + "dxDiagram-commandZoomLevel": "Nagyítás", + "dxDiagram-commandAutoZoom": "Automatikus nagyítás", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "Egyszerűsített nézet", + "dxDiagram-commandCut": "Kivágás", + "dxDiagram-commandCopy": "Másolás", + "dxDiagram-commandPaste": "Beillesztés", + "dxDiagram-commandSelectAll": "Összes kiválasztása", + "dxDiagram-commandDelete": "Törlés", + "dxDiagram-commandBringToFront": "Előre hoz", + "dxDiagram-commandSendToBack": "Hátra küld", + "dxDiagram-commandLock": "Rögzít", + "dxDiagram-commandUnlock": "Felold", + "dxDiagram-commandInsertShapeImage": "Kép beszúrása...", + "dxDiagram-commandEditShapeImage": "Kép cseréje...", + "dxDiagram-commandDeleteShapeImage": "Kép törlése", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Mégse", + "dxDiagram-dialogInsertShapeImageTitle": "Kép beszúrása", + "dxDiagram-dialogEditShapeImageTitle": "Kép cseréje", + "dxDiagram-dialogEditShapeImageSelectButton": "Kép kiválasztása", + "dxDiagram-dialogEditShapeImageLabelText": "vagy húzza a fájlt ide", + + "dxDiagram-uiExport": "Exportálás", + "dxDiagram-uiProperties": "Tulajdonságok", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "Fa", + "dxDiagram-uiLayoutLayered": "Réteges", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Növekvő", + "dxGantt-sortingDescendingText": "Csökkenő", + "dxGantt-sortingClearText": "Rendezés törlése", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" +} +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/it.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/it.json new file mode 100644 index 0000000000000000000000000000000000000000..3ecbfeaa964962ff3556677f05f51550d2f9bcf5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/it.json @@ -0,0 +1,558 @@ +{ + "it": { + "Yes": "Sì", + "No": "No", + "Cancel": "Annulla", + "Clear": "Cancella", + "Done": "Fatto", + "Loading": "Caricamento...", + "Select": "Seleziona...", + "Search": "Cerca", + "Back": "Indietro", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Nessun dato da mostrare", + + "dxDropDownEditor-selectLabel": "Seleziona", + + "validation-required": "Richiesto", + "validation-required-formatted": "{0} è richiesto", + "validation-numeric": "Il valore deve essere numerico", + "validation-numeric-formatted": "{0} deve essere numerico", + "validation-range": "Il valore non è compreso nell'intervallo", + "validation-range-formatted": "{0} non è compreso nell'intervallo", + "validation-stringLength": "Lunghezza del valore errata", + "validation-stringLength-formatted": "La lunghezza di {0} è errata", + "validation-custom": "Il valore non è corretto", + "validation-custom-formatted": "{0} non è corretto", + "validation-async": "Il valore non è corretto", + "validation-async-formatted": "{0} non è corretto", + "validation-compare": "I valori non corrispondono", + "validation-compare-formatted": "{0} non corrisponde", + "validation-pattern": "Il valore non è corretto", + "validation-pattern-formatted": "{0} non è corretto", + "validation-email": "L'Email non è corretta", + "validation-email-formatted": "{0} non è una email corretta", + "validation-mask": "Il valore non è corretto", + + "dxLookup-searchPlaceholder": "Lunghezza minima: {0}", + + "dxList-pullingDownText": "Trascina in basso per aggiornare...", + "dxList-pulledDownText": "Rilascia per aggiornare...", + "dxList-refreshingText": "Aggiornamento...", + "dxList-pageLoadingText": "Caricamento...", + "dxList-nextButtonText": "Carica altri risultati", + "dxList-selectAll": "Seleziona tutti", + "dxListEditDecorator-delete": "Elimina", + "dxListEditDecorator-more": "Ancora", + + "dxScrollView-pullingDownText": "Trascina in basso per aggiornare...", + "dxScrollView-pulledDownText": "Rilascia per aggiornare...", + "dxScrollView-refreshingText": "Aggiornamento...", + "dxScrollView-reachBottomText": "Caricamento...", + + "dxDateBox-simulatedDataPickerTitleTime": "Seleziona orario", + "dxDateBox-simulatedDataPickerTitleDate": "Seleziona data", + "dxDateBox-simulatedDataPickerTitleDateTime": "Seleziona data e ora", + "dxDateBox-validation-datetime": "Il valore deve essere una data o un orario", + + "dxFileUploader-selectFile": "Seleziona file", + "dxFileUploader-dropFile": "o trascina il file qui", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Carica", + "dxFileUploader-uploaded": "Caricato", + "dxFileUploader-readyToUpload": "Pronto per caricare", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Caricamento fallito", + "dxFileUploader-invalidFileExtension": "", + "dxFileUploader-invalidMaxFileSize": "", + "dxFileUploader-invalidMinFileSize": "", + + "dxRangeSlider-ariaFrom": "Da", + "dxRangeSlider-ariaTill": "fino a", + "dxSwitch-switchedOnText": "ON", + "dxSwitch-switchedOffText": "OFF", + + "dxForm-optionalMark": "opzionale", + "dxForm-requiredMessage": "{0} è richiesto", + + "dxNumberBox-invalidValueMessage": "Il valore deve essere numerico", + "dxNumberBox-noDataText": "Nessun dato", + + "dxDataGrid-columnChooserTitle": "Selezione colonne", + "dxDataGrid-columnChooserEmptyText": "Trascina qui una colonna per nasconderla", + "dxDataGrid-groupContinuesMessage": "Pagina successiva", + "dxDataGrid-groupContinuedMessage": "Continua da pagina precedente", + "dxDataGrid-groupHeaderText": "Raggruppa per questa colonna", + "dxDataGrid-ungroupHeaderText": "Separa", + "dxDataGrid-ungroupAllText": "Separa tutti", + "dxDataGrid-editingEditRow": "Modifica", + "dxDataGrid-editingSaveRowChanges": "Salva", + "dxDataGrid-editingCancelRowChanges": "Annulla", + "dxDataGrid-editingDeleteRow": "Elimina", + "dxDataGrid-editingUndeleteRow": "Ripristina", + "dxDataGrid-editingConfirmDeleteMessage": "Sei certo di voler eliminare questo record?", + "dxDataGrid-validationCancelChanges": "Annulla le modifiche", + "dxDataGrid-groupPanelEmptyText": "Trascina qui l'intestazione di una colonna per raggrupparla", + "dxDataGrid-noDataText": "Nessun dato", + "dxDataGrid-searchPanelPlaceholder": "Cerca...", + "dxDataGrid-filterRowShowAllText": "(Tutti)", + "dxDataGrid-filterRowResetOperationText": "Annulla", + "dxDataGrid-filterRowOperationEquals": "Uguale", + "dxDataGrid-filterRowOperationNotEquals": "Diverso", + "dxDataGrid-filterRowOperationLess": "Minore di", + "dxDataGrid-filterRowOperationLessOrEquals": "Minore o uguale a", + "dxDataGrid-filterRowOperationGreater": "Maggiore di", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Maggiore o uguale a", + "dxDataGrid-filterRowOperationStartsWith": "Inizia con", + "dxDataGrid-filterRowOperationContains": "Contiene", + "dxDataGrid-filterRowOperationNotContains": "Non contiene", + "dxDataGrid-filterRowOperationEndsWith": "Termina con", + "dxDataGrid-filterRowOperationBetween": "Compreso", + "dxDataGrid-filterRowOperationBetweenStartText": "Inizio", + "dxDataGrid-filterRowOperationBetweenEndText": "Fine", + "dxDataGrid-applyFilterText": "Applica filtro", + "dxDataGrid-trueText": "vero", + "dxDataGrid-falseText": "falso", + "dxDataGrid-sortingAscendingText": "Ordinamento ascendente", + "dxDataGrid-sortingDescendingText": "Ordinamento discendente", + "dxDataGrid-sortingClearText": "Annulla ordinamento", + "dxDataGrid-editingSaveAllChanges": "Salva le modifiche", + "dxDataGrid-editingCancelAllChanges": "Annulla le modifiche", + "dxDataGrid-editingAddRow": "Aggiungi una riga", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min di {1} è {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max di {1} è {0}", + "dxDataGrid-summaryAvg": "Media: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Media di {1} è {0}", + "dxDataGrid-summarySum": "Somma: {0}", + "dxDataGrid-summarySumOtherColumn": "Somma di {1} è {0}", + "dxDataGrid-summaryCount": "Elementi: {0}", + "dxDataGrid-columnFixingFix": "Blocca", + "dxDataGrid-columnFixingUnfix": "Sblocca", + "dxDataGrid-columnFixingLeftPosition": "Alla sinistra", + "dxDataGrid-columnFixingRightPosition": "Alla destra", + "dxDataGrid-exportTo": "Esporta", + "dxDataGrid-exportToExcel": "Esporta in Excel", + "dxDataGrid-exporting": "Esportare...", + "dxDataGrid-excelFormat": "File Excel", + "dxDataGrid-selectedRows": "Righe selezionate", + "dxDataGrid-exportSelectedRows": "Esporta le righe selezionate", + "dxDataGrid-exportAll": "Esporta tutti i dati", + "dxDataGrid-headerFilterEmptyValue": "(vuoto)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Annulla", + "dxDataGrid-ariaColumn": "Colonna", + "dxDataGrid-ariaValue": "Valore", + "dxDataGrid-ariaFilterCell": "Filtra cella", + "dxDataGrid-ariaCollapse": "Chiudi", + "dxDataGrid-ariaExpand": "Espandi", + "dxDataGrid-ariaDataGrid": "Griglia dati", + "dxDataGrid-ariaSearchInGrid": "Cerca nella griglia", + "dxDataGrid-ariaSelectAll": "Seleziona tutti", + "dxDataGrid-ariaSelectRow": "Seleziona riga", + "dxDataGrid-filterBuilderPopupTitle": "Composizione filtro", + "dxDataGrid-filterPanelCreateFilter": "Nuovo filtro", + "dxDataGrid-filterPanelClearFilter": "Cancella", + "dxDataGrid-filterPanelFilterEnabledHint": "Attiva il filtro", + + "dxTreeList-ariaTreeList": "Albero", + "dxTreeList-editingAddRowToNode": "Aggiungi", + + "dxPager-infoText": "Pagina {0} di {1} ({2} elementi)", + "dxPager-pagesCountText": "di", + "dxPager-pageSizesAllText": "Tutti", + + "dxPivotGrid-grandTotal": "Totale", + "dxPivotGrid-total": "{0} Totale", + "dxPivotGrid-fieldChooserTitle": "Selezione campi", + "dxPivotGrid-showFieldChooser": "Mostra selezione campi", + "dxPivotGrid-expandAll": "Espandi tutto", + "dxPivotGrid-collapseAll": "Comprimi tutto", + "dxPivotGrid-sortColumnBySummary": "Ordina \"{0}\" per questa colonna", + "dxPivotGrid-sortRowBySummary": "Ordina \"{0}\" per questa riga", + "dxPivotGrid-removeAllSorting": "Rimuovi ordinamenti", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Campi riga", + "dxPivotGrid-columnFields": "Campi colonna", + "dxPivotGrid-dataFields": "Campi dati", + "dxPivotGrid-filterFields": "Campi filtro", + "dxPivotGrid-allFields": "Tutti i campi", + "dxPivotGrid-columnFieldArea": "Trascina qui i campi colonna", + "dxPivotGrid-dataFieldArea": "Trascina qui i campi dati", + "dxPivotGrid-rowFieldArea": "Trascina qui i campi riga", + "dxPivotGrid-filterFieldArea": "Trascina qui i campi filtro", + + "dxScheduler-editorLabelTitle": "Oggetto", + "dxScheduler-editorLabelStartDate": "Data inizio", + "dxScheduler-editorLabelEndDate": "Data fine", + "dxScheduler-editorLabelDescription": "Descrizione", + "dxScheduler-editorLabelRecurrence": "Ripeti", + + "dxScheduler-openAppointment": "Apri appuntamento", + + "dxScheduler-recurrenceNever": "Mai", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Giornaliero", + "dxScheduler-recurrenceWeekly": "Settimanale", + "dxScheduler-recurrenceMonthly": "Mensile", + "dxScheduler-recurrenceYearly": "Annuale", + + "dxScheduler-recurrenceRepeatEvery": "Ogni", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Termina ripetizione", + "dxScheduler-recurrenceAfter": "Dopo", + "dxScheduler-recurrenceOn": "Di", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "giorno(i)", + "dxScheduler-recurrenceRepeatWeekly": "settimana(e)", + "dxScheduler-recurrenceRepeatMonthly": "mese(i)", + "dxScheduler-recurrenceRepeatYearly": "anno(i)", + + "dxScheduler-switcherDay": "Giorno", + "dxScheduler-switcherWeek": "Settimana", + "dxScheduler-switcherWorkWeek": "Settimana lavorativa", + "dxScheduler-switcherMonth": "Mese", + + "dxScheduler-switcherAgenda": "Agenda", + + "dxScheduler-switcherTimelineDay": "Cronologia giornaliera", + "dxScheduler-switcherTimelineWeek": "Cronologia settimanale", + "dxScheduler-switcherTimelineWorkWeek": "Cronologia settimana lavorativa", + "dxScheduler-switcherTimelineMonth": "Cronologia mensile", + + "dxScheduler-recurrenceRepeatOnDate": "alla data", + "dxScheduler-recurrenceRepeatCount": "occorrenza(e)", + "dxScheduler-allDay": "Tutto il giorno", + + "dxScheduler-confirmRecurrenceEditMessage": "Vuoi modificare solo questo appuntamento o tutte le sue ricorrenze?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Vuoi eliminare solo questo appuntamento o tutte le sue ricorrenze?", + + "dxScheduler-confirmRecurrenceEditSeries": "Modifica serie", + "dxScheduler-confirmRecurrenceDeleteSeries": "Elimina serie", + "dxScheduler-confirmRecurrenceEditOccurrence": "Modifica appuntamento", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Elimina appuntamento", + + "dxScheduler-noTimezoneTitle": "Nessun fuso orario", + "dxScheduler-moreAppointments": "{0} ancora", + + "dxCalendar-todayButtonText": "Oggi", + "dxCalendar-ariaWidgetName": "Calendario", + + "dxColorView-ariaRed": "Rosso", + "dxColorView-ariaGreen": "Verde", + "dxColorView-ariaBlue": "Blu", + "dxColorView-ariaAlpha": "Trasparenza", + "dxColorView-ariaHex": "Colore", + + "dxTagBox-selected": "{0} selezionati", + "dxTagBox-allSelected": "Tutti selezionati ({0})", + "dxTagBox-moreSelected": "{0} ancora", + + "vizExport-printingButtonText": "Stampa", + "vizExport-titleMenuText": "Esportazione/Stampa", + "vizExport-exportButtonText": "{0} file", + + "dxFilterBuilder-and": "E", + "dxFilterBuilder-or": "O", + "dxFilterBuilder-notAnd": "E non", + "dxFilterBuilder-notOr": "O non", + "dxFilterBuilder-addCondition": "Aggiungi condizione", + "dxFilterBuilder-addGroup": "Aggiungi gruppo", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Uguale a", + "dxFilterBuilder-filterOperationNotEquals": "Diverso da", + "dxFilterBuilder-filterOperationLess": "Minore di", + "dxFilterBuilder-filterOperationLessOrEquals": "Minore o uguale a", + "dxFilterBuilder-filterOperationGreater": "Maggiore di", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Maggiore o uguale a", + "dxFilterBuilder-filterOperationStartsWith": "Inizia con", + "dxFilterBuilder-filterOperationContains": "Contiene", + "dxFilterBuilder-filterOperationNotContains": "Non contiene", + "dxFilterBuilder-filterOperationEndsWith": "Termina con", + "dxFilterBuilder-filterOperationIsBlank": "È vuoto", + "dxFilterBuilder-filterOperationIsNotBlank": "Non è vuoto", + "dxFilterBuilder-filterOperationBetween": "Compreso", + "dxFilterBuilder-filterOperationAnyOf": "Include", + "dxFilterBuilder-filterOperationNoneOf": "Non include", + + "dxHtmlEditor-dialogColorCaption": "Cambia il colore del testo", + "dxHtmlEditor-dialogBackgroundCaption": "Cambia il colore di sfondo", + "dxHtmlEditor-dialogLinkCaption": "Aggiungi link", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Testo", + "dxHtmlEditor-dialogLinkTargetField": "Apri link in una nuova finestra", + "dxHtmlEditor-dialogImageCaption": "Agguingi Immagine", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Testo alternativo", + "dxHtmlEditor-dialogImageWidthField": "Larghezza (px)", + "dxHtmlEditor-dialogImageHeightField": "Altezza (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Intestazione", + "dxHtmlEditor-normalText": "Testo Normale", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Ordinamento ascendente", + "dxGantt-sortingDescendingText": "Ordinamento discendente", + "dxGantt-sortingClearText": "Annulla ordinamento", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ja.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ja.json new file mode 100644 index 0000000000000000000000000000000000000000..0cb8bc5a1f84dea400547b4eedd14e113c8af95d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ja.json @@ -0,0 +1,611 @@ +{ + "ja": { + "Yes": "はい", + "No": "いいえ", + "Cancel": "キャンセル", + "Clear": "クリア", + "Done": "完了", + "Loading": "読み込み中…", + "Select": "選択…", + "Search": "検索", + "Back": "戻る", + "OK": "OK", + "dxCollectionWidget-noDataText": "表示するデータがありません。", + "dxDropDownEditor-selectLabel": "選択", + "validation-required": "必須", + "validation-required-formatted": "{0} は必須です。", + "validation-numeric": "数値を指定してください。", + "validation-numeric-formatted": "{0} は数値でなければいけません。", + "validation-range": "値が範囲外です", + "validation-range-formatted": "{0} の長さが正しくありません。", + "validation-stringLength": "値の長さが正しくありません。", + "validation-stringLength-formatted": "{0} の長さが正しくありません", + "validation-custom": "値が無効です。", + "validation-custom-formatted": "{0} が無効です。", + "validation-async": "値が無効です。", + "validation-async-formatted": "{0} が無効です。", + "validation-compare": "値が一致しません。", + "validation-compare-formatted": " {0} が一致しません。", + "validation-pattern": "値がパターンと一致しません", + "validation-pattern-formatted": "{0} がパターンと一致しません", + "validation-email": "電子メール アドレスが無効です。", + "validation-email-formatted": "{0} が無効です。", + "validation-mask": "値が無効です。", + "dxLookup-searchPlaceholder": "最低文字数: {0}", + "dxList-pullingDownText": "引っ張って更新…", + "dxList-pulledDownText": "指を離して更新…", + "dxList-refreshingText": "更新中…", + "dxList-pageLoadingText": "読み込み中…", + "dxList-nextButtonText": "もっと表示する", + "dxList-selectAll": "すべてを選択", + "dxListEditDecorator-delete": "削除", + "dxListEditDecorator-more": "もっと", + "dxScrollView-pullingDownText": "引っ張って更新…", + "dxScrollView-pulledDownText": "指を離して更新…", + "dxScrollView-refreshingText": "更新中…", + "dxScrollView-reachBottomText": "読み込み中", + "dxDateBox-simulatedDataPickerTitleTime": "時刻を選択してください。", + "dxDateBox-simulatedDataPickerTitleDate": "日付を選択してください。", + "dxDateBox-simulatedDataPickerTitleDateTime": "日付と時刻を選択してください。", + "dxDateBox-validation-datetime": "日付または時刻を指定してください。", + "dxFileUploader-selectFile": "ファイルを選択", + "dxFileUploader-dropFile": "またはファイルをこちらにドロップしてください。", + "dxFileUploader-bytes": "バイト", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "アップロード", + "dxFileUploader-uploaded": "アップロード済み", + "dxFileUploader-readyToUpload": "アップロードの準備中", + "dxFileUploader-uploadAbortedMessage": "アップロードがキャンセルされました", + "dxFileUploader-uploadFailedMessage": "アップロードに失敗しました", + "dxFileUploader-invalidFileExtension": "このファイルの種類を使用できません", + "dxFileUploader-invalidMaxFileSize": "ファイルが大きすぎます", + "dxFileUploader-invalidMinFileSize": "ファイルが小さすぎます", + "dxRangeSlider-ariaFrom": "から", + "dxRangeSlider-ariaTill": "まで", + "dxSwitch-switchedOnText": "オン", + "dxSwitch-switchedOffText": "オフ", + "dxForm-optionalMark": "任意", + "dxForm-requiredMessage": "{0} は必須フィールドです", + "dxNumberBox-invalidValueMessage": "数値を指定してください。", + "dxNumberBox-noDataText": "データがありません", + "dxDataGrid-columnChooserTitle": "列の選択", + "dxDataGrid-columnChooserEmptyText": "隠したい列のヘッダーをここにドラッグしてください。", + "dxDataGrid-groupContinuesMessage": "次ページに続く", + "dxDataGrid-groupContinuedMessage": "前ページから続く", + "dxDataGrid-groupHeaderText": "この列でグループ化", + "dxDataGrid-ungroupHeaderText": "グループ解除", + "dxDataGrid-ungroupAllText": "すべてのグループを解除", + "dxDataGrid-editingEditRow": "編集", + "dxDataGrid-editingSaveRowChanges": "保存", + "dxDataGrid-editingCancelRowChanges": "キャンセル", + "dxDataGrid-editingDeleteRow": "削除", + "dxDataGrid-editingUndeleteRow": "復元", + "dxDataGrid-editingConfirmDeleteMessage": "このレコードを削 除してもよろしいですか?", + "dxDataGrid-validationCancelChanges": "変更をキャンセル", + "dxDataGrid-groupPanelEmptyText": "グループ化したい列のヘッダーをここにドラッグしてください。", + "dxDataGrid-noDataText": "データがありません", + "dxDataGrid-searchPanelPlaceholder": "検索", + "dxDataGrid-filterRowShowAllText": "(すべて)", + "dxDataGrid-filterRowResetOperationText": "リセット", + "dxDataGrid-filterRowOperationEquals": "指定の値に等しい", + "dxDataGrid-filterRowOperationNotEquals": "指定の値に等しくない", + "dxDataGrid-filterRowOperationLess": "指定の値より小さい", + "dxDataGrid-filterRowOperationLessOrEquals": "指定の値以下", + "dxDataGrid-filterRowOperationGreater": "指定の値より大きい", + "dxDataGrid-filterRowOperationGreaterOrEquals": "指定の値以上", + "dxDataGrid-filterRowOperationStartsWith": "指定の値で始まる", + "dxDataGrid-filterRowOperationContains": "指定の値を含む", + "dxDataGrid-filterRowOperationNotContains": "指定の値を含まない", + "dxDataGrid-filterRowOperationEndsWith": "指定の値で終わる", + "dxDataGrid-filterRowOperationBetween": "~から~の間", + "dxDataGrid-filterRowOperationBetweenStartText": "開始値", + "dxDataGrid-filterRowOperationBetweenEndText": "終了値", + "dxDataGrid-applyFilterText": "フィルターを適用", + "dxDataGrid-trueText": "true", + "dxDataGrid-falseText": "false", + "dxDataGrid-sortingAscendingText": "昇順に並べ替え", + "dxDataGrid-sortingDescendingText": "降順に並べ替え", + "dxDataGrid-sortingClearText": "並べ替えをクリア", + "dxDataGrid-editingSaveAllChanges": "変更を保存", + "dxDataGrid-editingCancelAllChanges": "変更を破棄", + "dxDataGrid-editingAddRow": "行を追加", + "dxDataGrid-summaryMin": "最小: {0}", + "dxDataGrid-summaryMinOtherColumn": "{1} の最小は {0}", + "dxDataGrid-summaryMax": "最大: {0}", + "dxDataGrid-summaryMaxOtherColumn": "{1} の最小は {0}", + "dxDataGrid-summaryAvg": "平均: {0}", + "dxDataGrid-summaryAvgOtherColumn": "{1} の平均は {0}", + "dxDataGrid-summarySum": "合計: {0}", + "dxDataGrid-summarySumOtherColumn": "{1} の合計は {0}", + "dxDataGrid-summaryCount": "総数: {0}", + "dxDataGrid-columnFixingFix": "固定", + "dxDataGrid-columnFixingUnfix": "固定の解除", + "dxDataGrid-columnFixingLeftPosition": "左に固定", + "dxDataGrid-columnFixingRightPosition": "右に固定", + "dxDataGrid-exportTo": "エクスポート", + "dxDataGrid-exportToExcel": "Excel ファイルにエクスポート", + "dxDataGrid-exporting": "エクスポート...", + "dxDataGrid-excelFormat": "Excel ファイル", + "dxDataGrid-selectedRows": "選択された行", + "dxDataGrid-exportAll": "すべてのデータをエクスポート", + "dxDataGrid-exportSelectedRows": "選択された行をエクスポート", + "dxDataGrid-headerFilterEmptyValue": "(空白)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "キャンセル", + "dxDataGrid-ariaAdaptiveCollapse": "追加データを非表示にする", + "dxDataGrid-ariaAdaptiveExpand": "追加データを表示する", + "dxDataGrid-ariaColumn": "列", + "dxDataGrid-ariaValue": "値", + "dxDataGrid-ariaFilterCell": "フィルター セル", + "dxDataGrid-ariaCollapse": "折りたたむ", + "dxDataGrid-ariaExpand": "展開", + "dxDataGrid-ariaDataGrid": "データ グリッド", + "dxDataGrid-ariaSearchInGrid": "データ グリッド内で検索", + "dxDataGrid-ariaSelectAll": "すべてを選択", + "dxDataGrid-ariaSelectRow": "行の選択", + "dxDataGrid-ariaToolbar": "データ グリッドのツール バー", + "dxDataGrid-filterBuilderPopupTitle": "フィルター ビルダー", + "dxDataGrid-filterPanelCreateFilter": "フィルターの作成", + "dxDataGrid-filterPanelClearFilter": "クリア", + "dxDataGrid-filterPanelFilterEnabledHint": "フィルターの有効化", + "dxTreeList-ariaTreeList": "ツリー リスト", + "dxTreeList-ariaSearchInGrid": "ツリー リスト内を検索する", + "dxTreeList-ariaToolbar": "ツリー リストのツール バー", + "dxTreeList-editingAddRowToNode": "追加", + "dxPager-infoText": "ページ {0} / {1} ({2} アイテム)", + "dxPager-pagesCountText": "/", + "dxPager-pageSizesAllText": "すべて", + "dxPivotGrid-grandTotal": "総計", + "dxPivotGrid-total": "{0} 合計", + "dxPivotGrid-fieldChooserTitle": "フィールドの選択", + "dxPivotGrid-showFieldChooser": "フィールドの選択を表示", + "dxPivotGrid-expandAll": "すべて展開", + "dxPivotGrid-collapseAll": "すべて折りたたむ", + "dxPivotGrid-sortColumnBySummary": "この列で \"{0}\" を並べ替え", + "dxPivotGrid-sortRowBySummary": "この行で {0} を並べ替え", + "dxPivotGrid-removeAllSorting": "すべての並べ替えを削除", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "行のフィールド", + "dxPivotGrid-columnFields": "列のフィールド", + "dxPivotGrid-dataFields": "データ  フィールド", + "dxPivotGrid-filterFields": "フィルター フィールド", + "dxPivotGrid-allFields": "すべてのフィールド", + "dxPivotGrid-columnFieldArea": "列フィールドをこちらへドラッグ&ドロップ", + "dxPivotGrid-dataFieldArea": "データ フィールドをこちらへドラッグ&ドロップ", + "dxPivotGrid-rowFieldArea": "行フィールドをこちらへドラッグ&ドロップ", + "dxPivotGrid-filterFieldArea": "フィルター フィールドをこちらへドラッグ&ドロップ", + "dxScheduler-editorLabelTitle": "件名", + "dxScheduler-editorLabelStartDate": "開始時刻", + "dxScheduler-editorLabelEndDate": "終了時刻", + "dxScheduler-editorLabelDescription": "説明", + "dxScheduler-editorLabelRecurrence": "繰り返し", + "dxScheduler-openAppointment": "オープンの予定", + "dxScheduler-recurrenceNever": "無効", + "dxScheduler-recurrenceMinutely": "分ごと", + "dxScheduler-recurrenceHourly": "1時間ごと", + "dxScheduler-recurrenceDaily": "日間毎日", + "dxScheduler-recurrenceWeekly": "毎週", + "dxScheduler-recurrenceMonthly": "毎月", + "dxScheduler-recurrenceYearly": "毎年", + "dxScheduler-recurrenceRepeatEvery": "繰り返し間隔", + "dxScheduler-recurrenceRepeatOn": "この日に繰り返す", + "dxScheduler-recurrenceEnd": "リピートの終了日", + "dxScheduler-recurrenceAfter": "次の発生回数後に終了", + "dxScheduler-recurrenceOn": "リピート解除の日付", + "dxScheduler-recurrenceRepeatMinutely": "分ごと", + "dxScheduler-recurrenceRepeatHourly": "時間ごと", + "dxScheduler-recurrenceRepeatDaily": "日後", + "dxScheduler-recurrenceRepeatWeekly": "週間後", + "dxScheduler-recurrenceRepeatMonthly": "カ月後", + "dxScheduler-recurrenceRepeatYearly": "年後", + "dxScheduler-switcherDay": "日ビュー", + "dxScheduler-switcherWeek": "週ビュー", + "dxScheduler-switcherWorkWeek": "稼働週ビュー", + "dxScheduler-switcherMonth": "月ビュー", + "dxScheduler-switcherTimelineDay": "タイムライン 日ビュー", + "dxScheduler-switcherTimelineWeek": "タイムライン 週ビュー", + "dxScheduler-switcherTimelineWorkWeek": "タイムライン 稼働週ビュー", + "dxScheduler-switcherTimelineMonth": "タイムライン 月ビュー", + "dxScheduler-switcherAgenda": "予定一覧", + "dxScheduler-recurrenceRepeatOnDate": "次の日付に終了", + "dxScheduler-recurrenceRepeatCount": "出現", + "dxScheduler-allDay": "終日イベント", + "dxScheduler-confirmRecurrenceEditMessage": "この予定のみを編集しますか、または定期的な予定を編集しますか?", + "dxScheduler-confirmRecurrenceDeleteMessage": "この予定のみを削除しますか、または定期的な予定を削除しますか?", + "dxScheduler-confirmRecurrenceEditSeries": "定期的なアイテムを編集", + "dxScheduler-confirmRecurrenceDeleteSeries": "定期的なアイテムを削除", + "dxScheduler-confirmRecurrenceEditOccurrence": "予定を編集", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "予定を削除", + "dxScheduler-noTimezoneTitle": "時間帯なし", + "dxScheduler-moreAppointments": "その他 {0} つ選択", + "dxCalendar-todayButtonText": "今日", + "dxCalendar-ariaWidgetName": "カレンダー", + "dxColorView-ariaRed": "赤", + "dxColorView-ariaGreen": "緑", + "dxColorView-ariaBlue": "青", + "dxColorView-ariaAlpha": "透明度", + "dxColorView-ariaHex": "色コード", + "dxTagBox-selected": "{0} つ選択済み", + "dxTagBox-allSelected": "すべて選択済み ({0})", + "dxTagBox-moreSelected": "その他 {0} つ選択", + "vizExport-printingButtonText": "印刷", + "vizExport-titleMenuText": "エクスポート / 印刷", + "vizExport-exportButtonText": "{0} ファイル", + "dxFilterBuilder-and": "And", + "dxFilterBuilder-or": "Or", + "dxFilterBuilder-notAnd": "Not And", + "dxFilterBuilder-notOr": "Not Or", + "dxFilterBuilder-addCondition": "条件の追加", + "dxFilterBuilder-addGroup": "グループの追加", + "dxFilterBuilder-enterValueText": "値を入力", + "dxFilterBuilder-filterOperationEquals": "指定の値に等しい", + "dxFilterBuilder-filterOperationNotEquals": "指定の値に等しくない", + "dxFilterBuilder-filterOperationLess": "指定の値より小さい", + "dxFilterBuilder-filterOperationLessOrEquals": "指定の値以下", + "dxFilterBuilder-filterOperationGreater": "指定の値より大きい", + "dxFilterBuilder-filterOperationGreaterOrEquals": "指定の値以上", + "dxFilterBuilder-filterOperationStartsWith": "指定の値で始まる", + "dxFilterBuilder-filterOperationContains": "指定の値を含む", + "dxFilterBuilder-filterOperationNotContains": "指定の値を含まない", + "dxFilterBuilder-filterOperationEndsWith": "指定の値で終わる", + "dxFilterBuilder-filterOperationIsBlank": "空白である", + "dxFilterBuilder-filterOperationIsNotBlank": "空白ではない", + "dxFilterBuilder-filterOperationBetween": "~から~の間", + "dxFilterBuilder-filterOperationAnyOf": "どちらかを含む", + "dxFilterBuilder-filterOperationNoneOf": "すべて含まない", + + "dxHtmlEditor-dialogColorCaption": "フォントの色を変更", + "dxHtmlEditor-dialogBackgroundCaption": "背景色を変更", + "dxHtmlEditor-dialogLinkCaption": "リンクの追加", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "テキスト", + "dxHtmlEditor-dialogLinkTargetField": "リンクを新しいウィンドウで開く", + "dxHtmlEditor-dialogImageCaption": "画像の追加", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "代替テキスト", + "dxHtmlEditor-dialogImageWidthField": "幅 (px)", + "dxHtmlEditor-dialogImageHeightField": "高さ (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "行", + "dxHtmlEditor-dialogInsertTableColumnsField": "列", + "dxHtmlEditor-dialogInsertTableCaption": "テーブルの挿入", + "dxHtmlEditor-heading": "見出し", + "dxHtmlEditor-normalText": "標準テキスト", + "dxHtmlEditor-background": "背景色", + "dxHtmlEditor-bold": "太字", + "dxHtmlEditor-color": "フォントの色", + "dxHtmlEditor-font": "フォント", + "dxHtmlEditor-italic": "斜体", + "dxHtmlEditor-link": "リンクの追加", + "dxHtmlEditor-image": "画像の追加", + "dxHtmlEditor-size": "フォント サイズ", + "dxHtmlEditor-strike": "取り消し線", + "dxHtmlEditor-subscript": "下付き文字", + "dxHtmlEditor-superscript": "上付き文字", + "dxHtmlEditor-underline": "下線", + "dxHtmlEditor-blockquote": "ブロック引用", + "dxHtmlEditor-header": "ヘッダー", + "dxHtmlEditor-increaseIndent": "インデントを増やす", + "dxHtmlEditor-decreaseIndent": "インデントを減らす", + "dxHtmlEditor-orderedList": "番号付きリスト", + "dxHtmlEditor-bulletList": "箇条書きリスト", + "dxHtmlEditor-alignLeft": "左揃え", + "dxHtmlEditor-alignCenter": "中央揃え", + "dxHtmlEditor-alignRight": "右揃え", + "dxHtmlEditor-alignJustify": "両端揃え", + "dxHtmlEditor-codeBlock": "コード ブロック", + "dxHtmlEditor-variable": "変数の追加", + "dxHtmlEditor-undo": "元に戻す", + "dxHtmlEditor-redo": "やり直す", + "dxHtmlEditor-clear": "書式のクリア", + "dxHtmlEditor-insertTable": "テーブルの挿入", + "dxHtmlEditor-insertHeaderRow": "見出し行の挿入", + "dxHtmlEditor-insertRowAbove": "上に行を挿入", + "dxHtmlEditor-insertRowBelow": "下に行を挿入", + "dxHtmlEditor-insertColumnLeft": "左に列を挿入", + "dxHtmlEditor-insertColumnRight": "右に列を挿入", + "dxHtmlEditor-deleteColumn": "列の削除", + "dxHtmlEditor-deleteRow": "行の削除", + "dxHtmlEditor-deleteTable": "テーブルの削除", + "dxHtmlEditor-cellProperties": "セルのプロパティ", + "dxHtmlEditor-tableProperties": "表のプロパティ", + "dxHtmlEditor-insert": "挿入", + "dxHtmlEditor-delete": "削除", + "dxHtmlEditor-border": "罫線", + "dxHtmlEditor-style": "スタイル", + "dxHtmlEditor-width": "幅", + "dxHtmlEditor-height": "高さ", + "dxHtmlEditor-borderColor": "色", + "dxHtmlEditor-tableBackground": "背景", + "dxHtmlEditor-dimensions": "寸法", + "dxHtmlEditor-alignment": "配置", + "dxHtmlEditor-horizontal": "水平方向", + "dxHtmlEditor-vertical": "垂直方向", + "dxHtmlEditor-paddingVertical": "垂直方向のスペース", + "dxHtmlEditor-paddingHorizontal": "水平方向のスペース", + "dxHtmlEditor-pixels": "ピクセル", + "dxHtmlEditor-list": "リスト", + "dxHtmlEditor-ordered": "番号付き", + "dxHtmlEditor-bullet": "箇条書き", + "dxHtmlEditor-align": "配置", + "dxHtmlEditor-center": "中央", + "dxHtmlEditor-left": "左", + "dxHtmlEditor-right": "右", + "dxHtmlEditor-indent": "インデント", + "dxHtmlEditor-justify": "両端揃え", + + "dxFileManager-newDirectoryName": "無題のフォルダ", + "dxFileManager-rootDirectoryName": "ファイル", + "dxFileManager-errorNoAccess": "アクセスが拒否されました。操作を完了できません。", + "dxFileManager-errorDirectoryExistsFormat": "ディレクトリ {0} は既に存在します。", + "dxFileManager-errorFileExistsFormat": "ファイル {0} は既に存在します。", + "dxFileManager-errorFileNotFoundFormat": "ファイル {0} が見つかりません。", + "dxFileManager-errorDirectoryNotFoundFormat": "ディレクトリ '{0}' が見つかりません。", + "dxFileManager-errorWrongFileExtension": "拡張子が許可されていません。", + "dxFileManager-errorMaxFileSizeExceeded": "ファイルのサイズが最大許容サイズを超えています。", + "dxFileManager-errorInvalidSymbols": "名前に無効な文字が含まれています。", + "dxFileManager-errorDefault": "特定できないエラー", + "dxFileManager-errorDirectoryOpenFailed": "ディレクトリを開けません", + + "dxFileManager-commandCreate": "新しいディレクトリ", + "dxFileManager-commandRename": "名前の変更", + "dxFileManager-commandMove": "移動先", + "dxFileManager-commandCopy": "コピー先", + "dxFileManager-commandDelete": "削除", + "dxFileManager-commandDownload": "ダウンロード", + "dxFileManager-commandUpload": "ファイルのアップロード", + "dxFileManager-commandRefresh": "更新", + "dxFileManager-commandThumbnails": "縮小表示", + "dxFileManager-commandDetails": "詳細表示", + "dxFileManager-commandClearSelection": "選択のクリア", + "dxFileManager-commandShowNavPane": "ナビゲーション ウィンドウの切り替え", + + "dxFileManager-dialogDirectoryChooserMoveTitle": "移動先", + "dxFileManager-dialogDirectoryChooserMoveButtonText": "移動", + "dxFileManager-dialogDirectoryChooserCopyTitle": "コピー先", + "dxFileManager-dialogDirectoryChooserCopyButtonText": "コピー", + "dxFileManager-dialogRenameItemTitle": "名前の変更", + "dxFileManager-dialogRenameItemButtonText": "保存", + "dxFileManager-dialogCreateDirectoryTitle": "新しいディレクトリ", + "dxFileManager-dialogCreateDirectoryButtonText": "作成", + "dxFileManager-dialogDeleteItemTitle": "削除", + "dxFileManager-dialogDeleteItemButtonText": "削除", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "{0} を削除しますか?", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "{0} アイテムを削除しますか?", + "dxFileManager-dialogButtonCancel": "キャンセル", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "{0} 内にディレクトリを作成中", + "dxFileManager-editingCreateSingleItemSuccessMessage": "{0} 内にディレクトリを作成しました", + "dxFileManager-editingCreateSingleItemErrorMessage": "ディレクトリが作成されませんでした", + "dxFileManager-editingCreateCommonErrorMessage": "ディレクトリが作成されませんでした", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "{0} 内に項目の名前を変更中", + "dxFileManager-editingRenameSingleItemSuccessMessage": "{0} 内に項目の名前を変更しました", + "dxFileManager-editingRenameSingleItemErrorMessage": "項目の名前が変更されませんでした", + "dxFileManager-editingRenameCommonErrorMessage": "項目の名前が変更されませんでした", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "{0} から項目を削除中", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "{1} から {0} 項目を削除中", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "{0} から項目を削除しました", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "{1} から {0} 項目を削除しました", + "dxFileManager-editingDeleteSingleItemErrorMessage": "項目が削除されませんでした", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "{0} 項目が削除されませんでした", + "dxFileManager-editingDeleteCommonErrorMessage": "一部の項目が削除されませんでした", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "項目を {0} に移動中", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "{0} 項目を {1} に移動中", + "dxFileManager-editingMoveSingleItemSuccessMessage": "項目を {0} に移動しました", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "{0} 項目を {1} に移動しました", + "dxFileManager-editingMoveSingleItemErrorMessage": "項目が移動されませんでした", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "{0} 項目が移動されませんでした", + "dxFileManager-editingMoveCommonErrorMessage": "一部の項目が移動されませんでした", + + "dxFileManager-editingCopySingleItemProcessingMessage": "項目を {0} にコピー中", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "{0} 項目を {1} にコピー中", + "dxFileManager-editingCopySingleItemSuccessMessage": "項目を {0} にコピーしました", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "{0} 項目を {1} にコピーしました", + "dxFileManager-editingCopySingleItemErrorMessage": "項目がコピーされませんでした", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "{0} 項目がコピーされませんでした", + "dxFileManager-editingCopyCommonErrorMessage": "一部の項目がコピーされませんでした", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "項目を {0} にアップロード中", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "{0} 項目を {1} にアップロード中", + "dxFileManager-editingUploadSingleItemSuccessMessage": "項目を {0} にアップロードしました", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "{0} 項目を {1} にアップロードしました", + "dxFileManager-editingUploadSingleItemErrorMessage": "項目がアップロードされませんでした", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "{0} 項目がアップロードされませんでした", + "dxFileManager-editingUploadCanceledMessage": "キャンセルしました", + + "dxFileManager-listDetailsColumnCaptionName": "ファイル名", + "dxFileManager-listDetailsColumnCaptionDateModified": "更新日", + "dxFileManager-listDetailsColumnCaptionFileSize": "ファイル サイズ", + + "dxFileManager-listThumbnailsTooltipTextSize": "サイズ", + "dxFileManager-listThumbnailsTooltipTextDateModified": "更新日", + + "dxFileManager-notificationProgressPanelTitle": "進行状況", + "dxFileManager-notificationProgressPanelEmptyListText": "操作がありません", + "dxFileManager-notificationProgressPanelOperationCanceled": "キャンセルしました", + + "dxDiagram-categoryGeneral": "一般", + "dxDiagram-categoryFlowchart": "フローチャート", + "dxDiagram-categoryOrgChart": "組織のフロー・チャート", + "dxDiagram-categoryContainers": "コンテナー", + "dxDiagram-categoryCustom": "カスタム", + + "dxDiagram-commandExportToSvg": "SVG にエクスポート", + "dxDiagram-commandExportToPng": "PNG にエクスポート", + "dxDiagram-commandExportToJpg": " JPEG にエクスポート", + "dxDiagram-commandUndo": "元に戻す", + "dxDiagram-commandRedo": "やり直す", + "dxDiagram-commandFontName": "フォント名", + "dxDiagram-commandFontSize": "フォント サイズ", + "dxDiagram-commandBold": "太字", + "dxDiagram-commandItalic": "斜体", + "dxDiagram-commandUnderline": "下線", + "dxDiagram-commandTextColor": "文字の色", + "dxDiagram-commandLineColor": "線の色", + "dxDiagram-commandLineWidth": "線の幅", + "dxDiagram-commandLineStyle": "線のスタイル", + "dxDiagram-commandLineStyleSolid": "実線", + "dxDiagram-commandLineStyleDotted": "点線", + "dxDiagram-commandLineStyleDashed": "破線", + "dxDiagram-commandFillColor": "塗りつぶしの色", + "dxDiagram-commandAlignLeft": "左揃え", + "dxDiagram-commandAlignCenter": "中央揃え", + "dxDiagram-commandAlignRight": "右揃え", + "dxDiagram-commandConnectorLineType": "コネクタ ラインのタイプ", + "dxDiagram-commandConnectorLineStraight": "直線", + "dxDiagram-commandConnectorLineOrthogonal": "直交", + "dxDiagram-commandConnectorLineStart": "コネクタ ラインの開始", + "dxDiagram-commandConnectorLineEnd": "コネクタ ラインの終了", + "dxDiagram-commandConnectorLineNone": "なし", + "dxDiagram-commandConnectorLineArrow": "矢印", + "dxDiagram-commandFullscreen": "全画面表示", + "dxDiagram-commandUnits": "単位", + "dxDiagram-commandPageSize": "ページ サイズ", + "dxDiagram-commandPageOrientation": "ページの向き", + "dxDiagram-commandPageOrientationLandscape": "横", + "dxDiagram-commandPageOrientationPortrait": "縦", + "dxDiagram-commandPageColor": "ページの色", + "dxDiagram-commandShowGrid": "グリッドの表示", + "dxDiagram-commandSnapToGrid": "グリッドに合わせる", + "dxDiagram-commandGridSize": "グリッド サイズ", + "dxDiagram-commandZoomLevel": "ズームのレベル", + "dxDiagram-commandAutoZoom": "自動ズーム", + "dxDiagram-commandFitToContent": "コンテンツに合わせる", + "dxDiagram-commandFitToWidth": "幅に合わせる", + "dxDiagram-commandAutoZoomByContent": "コンテンツによる自動ズーム", + "dxDiagram-commandAutoZoomByWidth": "幅による自動ズーム", + "dxDiagram-commandSimpleView": "簡易ビュー", + "dxDiagram-commandCut": "切り取り", + "dxDiagram-commandCopy": "コピー", + "dxDiagram-commandPaste": "貼り付け", + "dxDiagram-commandSelectAll": "すべて選択", + "dxDiagram-commandDelete": "削除", + "dxDiagram-commandBringToFront": "最前面へ移動", + "dxDiagram-commandSendToBack": "最背面へ移動", + "dxDiagram-commandLock": "ロック", + "dxDiagram-commandUnlock": "ロック解除", + "dxDiagram-commandInsertShapeImage": "画像の挿入...", + "dxDiagram-commandEditShapeImage": "画像の変更...", + "dxDiagram-commandDeleteShapeImage": "画像の削除", + "dxDiagram-commandLayoutLeftToRight": "左から右へ", + "dxDiagram-commandLayoutRightToLeft": "右から左へ", + "dxDiagram-commandLayoutTopToBottom": "上から下へ", + "dxDiagram-commandLayoutBottomToTop": "下から上へ", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "キャンセル", + "dxDiagram-dialogInsertShapeImageTitle": "画像の挿入", + "dxDiagram-dialogEditShapeImageTitle": "画像の変更", + "dxDiagram-dialogEditShapeImageSelectButton": "画像の選択", + "dxDiagram-dialogEditShapeImageLabelText": "またはファイルをここにドロップしてください", + + "dxDiagram-uiExport": "エクスポート", + "dxDiagram-uiProperties": "プロパティ", + "dxDiagram-uiSettings": "設定", + "dxDiagram-uiShowToolbox": "ツールボックス​​の表示", + "dxDiagram-uiSearch": "検索", + "dxDiagram-uiStyle": "スタイル", + "dxDiagram-uiLayout": "レイアウト", + "dxDiagram-uiLayoutTree": "ツリー", + "dxDiagram-uiLayoutLayered": "階層", + "dxDiagram-uiDiagram": "図", + "dxDiagram-uiText": "テキスト", + "dxDiagram-uiObject": "オブジェクト", + "dxDiagram-uiConnector": "コネクタ", + "dxDiagram-uiPage": "ページ", + + "dxDiagram-shapeText": "テキスト", + "dxDiagram-shapeRectangle": "長方形", + "dxDiagram-shapeEllipse": "楕円", + "dxDiagram-shapeCross": "十字形", + "dxDiagram-shapeTriangle": "三角形", + "dxDiagram-shapeDiamond": "ひし形", + "dxDiagram-shapeHeart": "ハート", + "dxDiagram-shapePentagon": "五角形", + "dxDiagram-shapeHexagon": "六角形", + "dxDiagram-shapeOctagon": "八角形", + "dxDiagram-shapeStar": "星", + "dxDiagram-shapeArrowLeft": "左矢印", + "dxDiagram-shapeArrowUp": "上矢印", + "dxDiagram-shapeArrowRight": "右矢印", + "dxDiagram-shapeArrowDown": "下矢印", + "dxDiagram-shapeArrowUpDown": "上下矢印", + "dxDiagram-shapeArrowLeftRight": "左右矢印", + "dxDiagram-shapeProcess": "処理", + "dxDiagram-shapeDecision": "判断", + "dxDiagram-shapeTerminator": "端子", + "dxDiagram-shapePredefinedProcess": "定義済みの処理", + "dxDiagram-shapeDocument": "ドキュメント", + "dxDiagram-shapeMultipleDocuments": "複数のドキュメント", + "dxDiagram-shapeManualInput": "手操作入力", + "dxDiagram-shapePreparation": "準備", + "dxDiagram-shapeData": "データ", + "dxDiagram-shapeDatabase": "データベース", + "dxDiagram-shapeHardDisk": "ハード ディスク", + "dxDiagram-shapeInternalStorage": "内部記憶", + "dxDiagram-shapePaperTape": "紙テープ", + "dxDiagram-shapeManualOperation": "手作業", + "dxDiagram-shapeDelay": "遅延", + "dxDiagram-shapeStoredData": "記憶データ", + "dxDiagram-shapeDisplay": "表示", + "dxDiagram-shapeMerge": "結合", + "dxDiagram-shapeConnector": "コネクタ", + "dxDiagram-shapeOr": "Or", + "dxDiagram-shapeSummingJunction": "和接合", + "dxDiagram-shapeContainerDefaultText": "コンテナー", + "dxDiagram-shapeVerticalContainer": "縦コンテナー", + "dxDiagram-shapeHorizontalContainer": "横コンテナー", + "dxDiagram-shapeCardDefaultText": "人の名前", + "dxDiagram-shapeCardWithImageOnLeft": "左側に画像を表示するカード", + "dxDiagram-shapeCardWithImageOnTop": "上部に画像を表示するカード", + "dxDiagram-shapeCardWithImageOnRight": "右側に画像を表示するカード", + + "dxGantt-dialogTitle": "タイトル", + "dxGantt-dialogStartTitle": "開始日時", + "dxGantt-dialogEndTitle": "終了日時", + "dxGantt-dialogProgressTitle": "進行状況", + "dxGantt-dialogResourcesTitle": "リソース", + "dxGantt-dialogResourceManagerTitle": "リソース マネージャー", + "dxGantt-dialogTaskDetailsTitle": "タスクの詳細", + "dxGantt-dialogEditResourceListHint": "リソース リストの編集", + "dxGantt-dialogEditNoResources": "リソースがありません", + "dxGantt-dialogButtonAdd": "追加", + "dxGantt-contextMenuNewTask": "新しいタスク", + "dxGantt-contextMenuNewSubtask": "新しいサブタスク", + "dxGantt-contextMenuDeleteTask": "タスクを削除", + "dxGantt-contextMenuDeleteDependency": "依存関係を削除", + "dxGantt-dialogTaskDeleteConfirmation": "タスクを削除すると、すべての依存関係とサブタスクが削除されます。このタスクを削除してもよろしいですか?", + "dxGantt-dialogDependencyDeleteConfirmation": "タスクの依存関係を削除してもよろしいですか?", + "dxGantt-dialogResourcesDeleteConfirmation": "リソースを削除すると、リソースが割り当てられているタスクからも削除されます。このリソースを削除してもよろしいですか?リソース: {0}", + "dxGantt-dialogConstraintCriticalViolationMessage": "移動しようとしているタスクは、依存関係により2つ目のタスクとリンクされています。この変更は依存関係ルールと競合するため、どのように続行しますか?", + "dxGantt-dialogConstraintViolationMessage": "移動しようとしているタスクは、依存関係により2つ目のタスクとリンクされています。どのように続行しますか?", + "dxGantt-dialogCancelOperationMessage": "操作をキャンセルする", + "dxGantt-dialogDeleteDependencyMessage": "依存関係を削除する", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "タスクを移動して、依存関係を保持する", + "dxGantt-undo": "元に戻す", + "dxGantt-redo": "やり直し", + "dxGantt-expandAll": "すべて展開", + "dxGantt-collapseAll": "すべて折りたたむ", + "dxGantt-addNewTask": "新しいタスクの追加", + "dxGantt-deleteSelectedTask": "選択したタスクを削除", + "dxGantt-zoomIn": "拡大", + "dxGantt-zoomOut": "縮小", + "dxGantt-fullScreen": "全画面表示", + "dxGantt-quarter": "Q{0}", + "dxGantt-sortingAscendingText": "昇順に並べ替え", + "dxGantt-sortingDescendingText": "降順に並べ替え", + "dxGantt-sortingClearText": "並べ替えをクリア", + "dxGantt-showResources": "リソースを表示", + "dxGantt-showDependencies": "依存関係を表示", + "dxGantt-dialogStartDateValidation": "開始日を {0} 以降にする必要があります", + "dxGantt-dialogEndDateValidation": "終了日は {0} より後にする必要があります" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/nl.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/nl.json new file mode 100644 index 0000000000000000000000000000000000000000..e6f98a3d7b23112090f084debfeb034f0da058d2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/nl.json @@ -0,0 +1,558 @@ +{ + "nl": { + "Yes": "Ja", + "No": "Nee", + "Cancel": "Annuleren", + "Clear": "Wissen", + "Done": "Klaar", + "Loading": "Laden...", + "Select": "Kiezen...", + "Search": "Zoeken", + "Back": "Terug", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Geen gegevens om te tonen", + + "dxDropDownEditor-selectLabel": "Kiezen", + + "validation-required": "Verplicht", + "validation-required-formatted": "{0} is verplicht", + "validation-numeric": "Waarde moet numeriek zijn", + "validation-numeric-formatted": "{0} moet numeriek zijn", + "validation-range": "Waarde is niet binnen het bereik", + "validation-range-formatted": "{0} is niet binnen het bereik", + "validation-stringLength": "De lengte van de waarde is niet correct", + "validation-stringLength-formatted": "De lengte van {0} is niet correct", + "validation-custom": "Waarde is ongeldig", + "validation-custom-formatted": "{0} is ongeldig", + "validation-async": "Waarde is ongeldig", + "validation-async-formatted": "{0} is ongeldig", + "validation-compare": "Waardes komen niet overeen", + "validation-compare-formatted": "{0} komen niet overeen", + "validation-pattern": "Waarde komt niet overeen met het patroon", + "validation-pattern-formatted": "{0} komt niet overeen met het patroon", + "validation-email": "Email is niet geldig", + "validation-email-formatted": "{0} is niet geldig", + "validation-mask": "Waarde is niet geldig", + + "dxLookup-searchPlaceholder": "Minimum aantal karakters: {0}", + + "dxList-pullingDownText": "Trek naar beneden om te vernieuwen...", + "dxList-pulledDownText": "Laat los om te vernieuwen...", + "dxList-refreshingText": "Vernieuwen...", + "dxList-pageLoadingText": "Laden...", + "dxList-nextButtonText": "Meer", + "dxList-selectAll": "Selecteer Alles", + "dxListEditDecorator-delete": "Verwijderen", + "dxListEditDecorator-more": "Meer", + + "dxScrollView-pullingDownText": "Trek naar beneden om te vernieuwen...", + "dxScrollView-pulledDownText": "Laat los om te vernieuwen...", + "dxScrollView-refreshingText": "Vernieuwen...", + "dxScrollView-reachBottomText": "Laden...", + + "dxDateBox-simulatedDataPickerTitleTime": "Selecteer tijd", + "dxDateBox-simulatedDataPickerTitleDate": "Selecteer datum", + "dxDateBox-simulatedDataPickerTitleDateTime": "Selecteer datum and tijd", + "dxDateBox-validation-datetime": "Waarde moet een datum of tijd zijn", + + "dxFileUploader-selectFile": "Selecteer bestand", + "dxFileUploader-dropFile": "of sleep bestand hier", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Uploaden", + "dxFileUploader-uploaded": "Geüpload", + "dxFileUploader-readyToUpload": "Klaar om te uploaden", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Uploaden is mislukt", + "dxFileUploader-invalidFileExtension": "Dit bestandstype is niet toegestaan", + "dxFileUploader-invalidMaxFileSize": "Het bestand is te groot", + "dxFileUploader-invalidMinFileSize": "Het bestand is te klein", + + "dxRangeSlider-ariaFrom": "Van", + "dxRangeSlider-ariaTill": "Tot", + "dxSwitch-switchedOnText": "AAN", + "dxSwitch-switchedOffText": "UIT", + + "dxForm-optionalMark": "optioneel", + "dxForm-requiredMessage": "{0} is verplicht", + + "dxNumberBox-invalidValueMessage": "Waarde moet een nummer zijn", + "dxNumberBox-noDataText": "Geen gegevens", + + "dxDataGrid-columnChooserTitle": "Kolom Kiezer", + "dxDataGrid-columnChooserEmptyText": "Sleep hier een kolomkop om hem te verbergen", + "dxDataGrid-groupContinuesMessage": "Gaat verder op de volgende pagina", + "dxDataGrid-groupContinuedMessage": "Vervolg van de vorige pagina", + "dxDataGrid-groupHeaderText": "Groepeer op deze kolom", + "dxDataGrid-ungroupHeaderText": "Degroeperen", + "dxDataGrid-ungroupAllText": "Alle Degroeperen", + "dxDataGrid-editingEditRow": "Wijzigen", + "dxDataGrid-editingSaveRowChanges": "Opslaan", + "dxDataGrid-editingCancelRowChanges": "Annuleren", + "dxDataGrid-editingDeleteRow": "Verwijderen", + "dxDataGrid-editingUndeleteRow": "Ongedaan maken", + "dxDataGrid-editingConfirmDeleteMessage": "Moet dit record verwijderd worden?", + "dxDataGrid-validationCancelChanges": "Wijzigingen annuleren", + "dxDataGrid-groupPanelEmptyText": "Sleep hier een kolomkop om er op te groeperen", + "dxDataGrid-noDataText": "Geen gegevens", + "dxDataGrid-searchPanelPlaceholder": "Zoeken...", + "dxDataGrid-filterRowShowAllText": "(Alle)", + "dxDataGrid-filterRowResetOperationText": "Reset", + "dxDataGrid-filterRowOperationEquals": "Gelijk aan", + "dxDataGrid-filterRowOperationNotEquals": "Niet gelijk aan", + "dxDataGrid-filterRowOperationLess": "Kleiner dan", + "dxDataGrid-filterRowOperationLessOrEquals": "Kleiner dan of gelijk aan", + "dxDataGrid-filterRowOperationGreater": "Groter dan", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Groter dan of gelijk aan", + "dxDataGrid-filterRowOperationStartsWith": "Begint met", + "dxDataGrid-filterRowOperationContains": "Bevat", + "dxDataGrid-filterRowOperationNotContains": "Bevat niet", + "dxDataGrid-filterRowOperationEndsWith": "Eindigt met", + "dxDataGrid-filterRowOperationBetween": "Tussen", + "dxDataGrid-filterRowOperationBetweenStartText": "Begin", + "dxDataGrid-filterRowOperationBetweenEndText": "Einde", + "dxDataGrid-applyFilterText": "Filter toepassen", + "dxDataGrid-trueText": "waar", + "dxDataGrid-falseText": "niet waar", + "dxDataGrid-sortingAscendingText": "Sorteer Oplopend", + "dxDataGrid-sortingDescendingText": "Sorteer Aflopend", + "dxDataGrid-sortingClearText": "Sortering wissen", + "dxDataGrid-editingSaveAllChanges": "Wijzigingen opslaan", + "dxDataGrid-editingCancelAllChanges": "Wijzigingen annuleren", + "dxDataGrid-editingAddRow": "Rij toevoegen", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min van {1} is {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Max van {1} is {0}", + "dxDataGrid-summaryAvg": "Gem: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Gem van {1} is {0}", + "dxDataGrid-summarySum": "Som: {0}", + "dxDataGrid-summarySumOtherColumn": "Som van {1} is {0}", + "dxDataGrid-summaryCount": "Aantal: {0}", + "dxDataGrid-columnFixingFix": "Blokkeren", + "dxDataGrid-columnFixingUnfix": "Blokkering opheffen", + "dxDataGrid-columnFixingLeftPosition": "Naar links", + "dxDataGrid-columnFixingRightPosition": "Naar rechts", + "dxDataGrid-exportTo": "Exporteren", + "dxDataGrid-exportToExcel": "Exporteer naar Excel bestand", + "dxDataGrid-exporting": "Exporteren...", + "dxDataGrid-excelFormat": "Excel bestand", + "dxDataGrid-selectedRows": "Geselecteerde rijen", + "dxDataGrid-exportSelectedRows": "Exporteer geselecteerde rijen", + "dxDataGrid-exportAll": "Exporteer alle gegevens", + "dxDataGrid-headerFilterEmptyValue": "(Leeg)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Annuleren", + "dxDataGrid-ariaColumn": "Kolom", + "dxDataGrid-ariaValue": "Waarde", + "dxDataGrid-ariaFilterCell": "Filter cel", + "dxDataGrid-ariaCollapse": "Inklappen", + "dxDataGrid-ariaExpand": "Uitklappen", + "dxDataGrid-ariaDataGrid": "Gegevenstabel", + "dxDataGrid-ariaSearchInGrid": "Zoeken in gegevenstabel", + "dxDataGrid-ariaSelectAll": "Selecteer alle", + "dxDataGrid-ariaSelectRow": "Selecteer rij", + "dxDataGrid-filterBuilderPopupTitle": "Filterbouwer", + "dxDataGrid-filterPanelCreateFilter": "Maak Filter", + "dxDataGrid-filterPanelClearFilter": "Wissen", + "dxDataGrid-filterPanelFilterEnabledHint": "Filter activeren", + + "dxTreeList-ariaTreeList": "Boomstructuur", + "dxTreeList-editingAddRowToNode": "Toevoegen", + + "dxPager-infoText": "Pagina {0} van {1} ({2} items)", + "dxPager-pagesCountText": "van", + "dxPager-pageSizesAllText": "Alle", + + "dxPivotGrid-grandTotal": "Eindtotaal", + "dxPivotGrid-total": "{0} Totaal", + "dxPivotGrid-fieldChooserTitle": "Veldenkiezer", + "dxPivotGrid-showFieldChooser": "Toon Veldenkiezer", + "dxPivotGrid-expandAll": "Alle Uitklappen", + "dxPivotGrid-collapseAll": "Alle Inklappen", + "dxPivotGrid-sortColumnBySummary": "Sorteer \"{0}\" op Deze Kolom", + "dxPivotGrid-sortRowBySummary": "Sorteer \"{0}\" op Deze Rij", + "dxPivotGrid-removeAllSorting": "Verwijderen Alle Sorteringen", + "dxPivotGrid-dataNotAvailable": "N/B", + "dxPivotGrid-rowFields": "Rijvelden", + "dxPivotGrid-columnFields": "Kolomvelden", + "dxPivotGrid-dataFields": "Gegevensvelden", + "dxPivotGrid-filterFields": "Filtervelden", + "dxPivotGrid-allFields": "Alle Velden", + "dxPivotGrid-columnFieldArea": "Sleep Kolomvelden Hier", + "dxPivotGrid-dataFieldArea": "Sleep Gegevensvelden Hier", + "dxPivotGrid-rowFieldArea": "Sleep Rijvelden Hier", + "dxPivotGrid-filterFieldArea": "Sleep Filtervelden Hier", + + "dxScheduler-editorLabelTitle": "Onderwerp", + "dxScheduler-editorLabelStartDate": "Startdatum", + "dxScheduler-editorLabelEndDate": "Einddatum", + "dxScheduler-editorLabelDescription": "Omschrijving", + "dxScheduler-editorLabelRecurrence": "Herhalen", + + "dxScheduler-openAppointment": "Afspraak openen", + + "dxScheduler-recurrenceNever": "Nooit", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Dagelijks", + "dxScheduler-recurrenceWeekly": "Wekelijks", + "dxScheduler-recurrenceMonthly": "Maandelijks", + "dxScheduler-recurrenceYearly": "Jaarlijks", + + "dxScheduler-recurrenceRepeatEvery": "Elke", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Einde herhaling", + "dxScheduler-recurrenceAfter": "Na", + "dxScheduler-recurrenceOn": "Op", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "dag(en)", + "dxScheduler-recurrenceRepeatWeekly": "week/weken", + "dxScheduler-recurrenceRepeatMonthly": "maand(en)", + "dxScheduler-recurrenceRepeatYearly": "jaar/jaren", + + "dxScheduler-switcherDay": "Dag", + "dxScheduler-switcherWeek": "Week", + "dxScheduler-switcherWorkWeek": "Werkweek", + "dxScheduler-switcherMonth": "Maand", + + "dxScheduler-switcherAgenda": "Planningsweergave", + + "dxScheduler-switcherTimelineDay": "Tijdslijn Dag", + "dxScheduler-switcherTimelineWeek": "Tijdslijn Week", + "dxScheduler-switcherTimelineWorkWeek": "Tijdslijn Werkweek", + "dxScheduler-switcherTimelineMonth": "Tijdslijn Maand", + + "dxScheduler-recurrenceRepeatOnDate": "op datum", + "dxScheduler-recurrenceRepeatCount": "keer", + "dxScheduler-allDay": "Duurt hele dag", + + "dxScheduler-confirmRecurrenceEditMessage": "Alleen deze afspraak of de hele serie wijzigen?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Alleen deze afspraak of de volledige serie verwijderen?", + + "dxScheduler-confirmRecurrenceEditSeries": "Serie wijzigen", + "dxScheduler-confirmRecurrenceDeleteSeries": "Serie verwijderen", + "dxScheduler-confirmRecurrenceEditOccurrence": "Afspraak wijzigen", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Afspraak verwijderen", + + "dxScheduler-noTimezoneTitle": "Geen tijdszone", + "dxScheduler-moreAppointments": "Nog {0}", + + "dxCalendar-todayButtonText": "Vandaag", + "dxCalendar-ariaWidgetName": "Kalender", + + "dxColorView-ariaRed": "Rood", + "dxColorView-ariaGreen": "Groen", + "dxColorView-ariaBlue": "Blauw", + "dxColorView-ariaAlpha": "Doorzichtigheid", + "dxColorView-ariaHex": "Kleurcode", + + "dxTagBox-selected": "{0} geselecteerd", + "dxTagBox-allSelected": "Alles geselecteerd ({0})", + "dxTagBox-moreSelected": "Nog {0}", + + "vizExport-printingButtonText": "Afdrukken", + "vizExport-titleMenuText": "Exporteren/Afdrukken", + "vizExport-exportButtonText": "{0} bestand", + + "dxFilterBuilder-and": "En", + "dxFilterBuilder-or": "Of", + "dxFilterBuilder-notAnd": "En niet", + "dxFilterBuilder-notOr": "Of niet", + "dxFilterBuilder-addCondition": "Regel toevoegen", + "dxFilterBuilder-addGroup": "Groep toevoegen", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Gelijk aan", + "dxFilterBuilder-filterOperationNotEquals": "Niet gelijk aan", + "dxFilterBuilder-filterOperationLess": "Is kleiner dan", + "dxFilterBuilder-filterOperationLessOrEquals": "Is kleiner dan of gelijk aan", + "dxFilterBuilder-filterOperationGreater": "Is groter dan", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Is groter dan of gelijk aan", + "dxFilterBuilder-filterOperationStartsWith": "Begint met", + "dxFilterBuilder-filterOperationContains": "Bevat", + "dxFilterBuilder-filterOperationNotContains": "Bevat niet", + "dxFilterBuilder-filterOperationEndsWith": "Eindigt met", + "dxFilterBuilder-filterOperationIsBlank": "Is leeg", + "dxFilterBuilder-filterOperationIsNotBlank": "Is niet leeg", + "dxFilterBuilder-filterOperationBetween": "Is tussen", + "dxFilterBuilder-filterOperationAnyOf": "Is een van", + "dxFilterBuilder-filterOperationNoneOf": "Is geen van", + + "dxHtmlEditor-dialogColorCaption": "Tekstkleur", + "dxHtmlEditor-dialogBackgroundCaption": "Achtergrondkleur", + "dxHtmlEditor-dialogLinkCaption": "Link", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Tekst", + "dxHtmlEditor-dialogLinkTargetField": "Open link in een nieuw venster", + "dxHtmlEditor-dialogImageCaption": "Afbeelding", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Alternatieve tekst", + "dxHtmlEditor-dialogImageWidthField": "Breedte (px)", + "dxHtmlEditor-dialogImageHeightField": "Hoogte (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Titel", + "dxHtmlEditor-normalText": "Normale tekst", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "Nieuwe folder", + "dxFileManager-rootDirectoryName": "Bestanden", + "dxFileManager-errorNoAccess": "Geen toegang. Operatie afgebroken.", + "dxFileManager-errorDirectoryExistsFormat": "Folder '{0}' bestaat al.", + "dxFileManager-errorFileExistsFormat": "Bestand '{0}' bestaat al.", + "dxFileManager-errorFileNotFoundFormat": "Bestand '{0}' niet gevonden.", + "dxFileManager-errorDirectoryNotFoundFormat": "Folder '{0}' bestaat al.", + "dxFileManager-errorWrongFileExtension": "Deze bestandsextensie is niet toegestaan.", + "dxFileManager-errorMaxFileSizeExceeded": "De bestandsgrootte overschrijdt de toegstane limiet", + "dxFileManager-errorInvalidSymbols": "Deze naam bevat ongeldige tekens.", + "dxFileManager-errorDefault": "Er is ongedefinieerde fout opgetreden", + "dxFileManager-errorDirectoryOpenFailed": "De folder kan niet geopend worden", + + "dxDiagram-categoryGeneral": "Algemeen", + "dxDiagram-categoryFlowchart": "Flowchart", + "dxDiagram-categoryOrgChart": "OrgChart", + "dxDiagram-categoryContainers": "Container", + "dxDiagram-categoryCustom": "Aangepast", + + "dxDiagram-commandExportToSvg": "Exporteer naar SVG", + "dxDiagram-commandExportToPng": "Exporteer naar PNG", + "dxDiagram-commandExportToJpg": "Exporteer naar JPEG", + "dxDiagram-commandUndo": "Ongedaan maken", + "dxDiagram-commandRedo": "Opnieuw doen", + "dxDiagram-commandFontName": "Lettertype", + "dxDiagram-commandFontSize": "Lettergrootte", + "dxDiagram-commandBold": "Vet", + "dxDiagram-commandItalic": "Cursief", + "dxDiagram-commandUnderline": "Onderstreept", + "dxDiagram-commandTextColor": "Letterkleur", + "dxDiagram-commandLineColor": "Lijnkleur", + "dxDiagram-commandLineWidth": "Lijndikte", + "dxDiagram-commandLineStyle": "Lijnstijl", + "dxDiagram-commandLineStyleSolid": "Volle lijn", + "dxDiagram-commandLineStyleDotted": "Gestippeld", + "dxDiagram-commandLineStyleDashed": "Gestreept", + "dxDiagram-commandFillColor": "Vulkleur", + "dxDiagram-commandAlignLeft": "Links uitlijnen", + "dxDiagram-commandAlignCenter": "Centreren", + "dxDiagram-commandAlignRight": "Rechts uitlijnen", + "dxDiagram-commandConnectorLineType": "Verbindingslijn type", + "dxDiagram-commandConnectorLineStraight": "Recht", + "dxDiagram-commandConnectorLineOrthogonal": "Orthogonaal", + "dxDiagram-commandConnectorLineStart": "Verbindingslijn Start", + "dxDiagram-commandConnectorLineEnd": "Verbindingslijn Eind", + "dxDiagram-commandConnectorLineNone": "Geen", + "dxDiagram-commandConnectorLineArrow": "Pijl", + "dxDiagram-commandFullscreen": "Volledige schermweergave", + "dxDiagram-commandUnits": "Eenheden", + "dxDiagram-commandPageSize": "Pagina grootte", + "dxDiagram-commandPageOrientation": "Orientatie", + "dxDiagram-commandPageOrientationLandscape": "Landschap", + "dxDiagram-commandPageOrientationPortrait": "Portrait", + "dxDiagram-commandPageColor": "Pagina kleur", + "dxDiagram-commandShowGrid": "Toon raster", + "dxDiagram-commandSnapToGrid": "Plak aan raster", + "dxDiagram-commandGridSize": "Raster grootte", + "dxDiagram-commandZoomLevel": "Zoom niveau", + "dxDiagram-commandAutoZoom": "Automatische zoom", + "dxDiagram-commandFitToContent": "Aan inhoud aanpassen", + "dxDiagram-commandFitToWidth": "Aan breedte aanpassen", + "dxDiagram-commandAutoZoomByContent": "Automatisch aan inhoud aanpassen", + "dxDiagram-commandAutoZoomByWidth": "Automatisch aan breedte aanpassen", + "dxDiagram-commandSimpleView": "Eenvoudige weergave", + "dxDiagram-commandCut": "Knippen", + "dxDiagram-commandCopy": "Kopiëren", + "dxDiagram-commandPaste": "Plakken", + "dxDiagram-commandSelectAll": "Alles selecteren", + "dxDiagram-commandDelete": "Verwijderen", + "dxDiagram-commandBringToFront": "Naar voorgrond", + "dxDiagram-commandSendToBack": "Naar achtergrond", + "dxDiagram-commandLock": "Vergrendelen", + "dxDiagram-commandUnlock": "Ontgrendelen", + "dxDiagram-commandInsertShapeImage": "Afbeeldingsobject invoegen", + "dxDiagram-commandEditShapeImage": "Afbeeldingsobject aanpassen", + "dxDiagram-commandDeleteShapeImage": "Afbeeldingsobject verwijderen", + "dxDiagram-commandLayoutLeftToRight": "Links-naar-rechts", + "dxDiagram-commandLayoutRightToLeft": "Rechts-naar-links", + "dxDiagram-commandLayoutTopToBottom": "Boven-naar-beneden", + "dxDiagram-commandLayoutBottomToTop": "Benede-naar-boven", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Annuleren", + "dxDiagram-dialogInsertShapeImageTitle": "Afbeelding Invoegen", + "dxDiagram-dialogEditShapeImageTitle": "Afbeelding Aanpassen", + "dxDiagram-dialogEditShapeImageSelectButton": "Selecteer afbeelding", + "dxDiagram-dialogEditShapeImageLabelText": "of sleep de afbeelding hier", + + "dxDiagram-uiExport": "Exporteren", + "dxDiagram-uiProperties": "Eigenschappen", + "dxDiagram-uiSettings": "Instellingen", + "dxDiagram-uiShowToolbox": "Gereedschapskist", + "dxDiagram-uiSearch": "Zoeken", + "dxDiagram-uiStyle": "Stijl", + "dxDiagram-uiLayout": "Opmaak", + "dxDiagram-uiLayoutTree": "Opmaakboom", + "dxDiagram-uiLayoutLayered": "Gelaagde opmaak", + "dxDiagram-uiDiagram": "Diagram", + "dxDiagram-uiText": "Tekst", + "dxDiagram-uiObject": "Object", + "dxDiagram-uiConnector": "Verbinding", + "dxDiagram-uiPage": "Pagina", + + "dxDiagram-shapeText": "Tekst", + "dxDiagram-shapeRectangle": "Rechthoek", + "dxDiagram-shapeEllipse": "Ovaal", + "dxDiagram-shapeCross": "Kruis", + "dxDiagram-shapeTriangle": "Driehoek", + "dxDiagram-shapeDiamond": "Diamand", + "dxDiagram-shapeHeart": "Hart", + "dxDiagram-shapePentagon": "Vijfhoek", + "dxDiagram-shapeHexagon": "Zeshoek", + "dxDiagram-shapeOctagon": "Achthoek", + "dxDiagram-shapeStar": "Ster", + "dxDiagram-shapeArrowLeft": "Pijl naar links", + "dxDiagram-shapeArrowUp": "Pijl naar boven", + "dxDiagram-shapeArrowRight": "Pijl naar rechts", + "dxDiagram-shapeArrowDown": "Pijl naar onderen", + "dxDiagram-shapeArrowUpDown": "Pijl naar boven en beneden", + "dxDiagram-shapeArrowLeftRight": "Paal naar links en rechts", + "dxDiagram-shapeProcess": "Proces", + "dxDiagram-shapeDecision": "Beslissing", + "dxDiagram-shapeTerminator": "Aflsuiter", + "dxDiagram-shapePredefinedProcess": "Gedefinieerd proces", + "dxDiagram-shapeDocument": "Document", + "dxDiagram-shapeMultipleDocuments": "Meerdere documenten", + "dxDiagram-shapeManualInput": "Handmatige invoer", + "dxDiagram-shapePreparation": "Voorbereiding", + "dxDiagram-shapeData": "Data", + "dxDiagram-shapeDatabase": "Database", + "dxDiagram-shapeHardDisk": "Vaste schijf", + "dxDiagram-shapeInternalStorage": "Interne opslag", + "dxDiagram-shapePaperTape": "Papierband", + "dxDiagram-shapeManualOperation": "Handmatige operatie", + "dxDiagram-shapeDelay": "Vertraging", + "dxDiagram-shapeStoredData": "Opgeslagen data", + "dxDiagram-shapeDisplay": "Weergave", + "dxDiagram-shapeMerge": "Samenvoegen", + "dxDiagram-shapeConnector": "Verbinding", + "dxDiagram-shapeOr": "Of", + "dxDiagram-shapeSummingJunction": "Optelkruising", + "dxDiagram-shapeContainerDefaultText": "Container", + "dxDiagram-shapeVerticalContainer": "Vertikale Container", + "dxDiagram-shapeHorizontalContainer": "Horizontale Container", + "dxDiagram-shapeCardDefaultText": "Tekst", + "dxDiagram-shapeCardWithImageOnLeft": "Kaart met Afbeelding Links", + "dxDiagram-shapeCardWithImageOnTop": "Kaart met Afbeelding Boven", + "dxDiagram-shapeCardWithImageOnRight": "Kaart me Afbeelding Rechts", + + "dxGantt-dialogTitle": "Titel", + "dxGantt-dialogStartTitle": "Start", + "dxGantt-dialogEndTitle": "Eind", + "dxGantt-dialogProgressTitle": "Voortgang", + "dxGantt-dialogResourcesTitle": "Bronnen", + "dxGantt-dialogResourceManagerTitle": "Beheer Bronnen", + "dxGantt-dialogTaskDetailsTitle": "Taak Details", + "dxGantt-dialogEditResourceListHint": "Pas Bronnen aan", + "dxGantt-dialogEditNoResources": "Geen bronnen", + "dxGantt-dialogButtonAdd": "Toevoegen", + "dxGantt-contextMenuNewTask": "Nieuwe taak", + "dxGantt-contextMenuNewSubtask": "Nieuwe sub-taak", + "dxGantt-contextMenuDeleteTask": "Verwijder taak", + "dxGantt-contextMenuDeleteDependency": "Verwijder afhankelijkheid", + "dxGantt-dialogTaskDeleteConfirmation": "Door het verwijderen van deze taak zullen ook alle subtaken en verbindingen verwijderd worden. Zeker weten?", + "dxGantt-dialogDependencyDeleteConfirmation": "Moet deze afhankelijkheid van de taak verwijderd worden?", + "dxGantt-dialogResourcesDeleteConfirmation": "Door deze bron te verwijderen, wordt deze ook uit alle taken verwijderd waaraan hij is toegewezen. Zeker weten om bron '{0}' te verwijderen?", + "dxGantt-dialogConstraintCriticalViolationMessage": "De taak die verplaatst moet worden is gekoppeld aan een andere taak door een afhankelijkheidsrelatie. Deze wijziging is in strijd met de afhankelijkheidsregels. Hoe verder?", + "dxGantt-dialogConstraintViolationMessage": "De taak die verplaatst moet worden is gekoppeld aan een andere taak door een afhankelijkheidsrelatie. Hoe verder?", + "dxGantt-dialogCancelOperationMessage": "Annuleer de operatie", + "dxGantt-dialogDeleteDependencyMessage": "Verwijder de afhankelijkheid", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "Verplaats de taak en behoud de afhankelijkheid", + "dxGantt-undo": "Ongedaan maken", + "dxGantt-redo": "Opnieuw doen", + "dxGantt-expandAll": "Alles uitklappen", + "dxGantt-collapseAll": "Alles inklappen", + "dxGantt-addNewTask": "Nieuwe taak", + "dxGantt-deleteSelectedTask": "Verwijder geselecteerde taak", + "dxGantt-zoomIn": "Inzoomen", + "dxGantt-zoomOut": "Uitzoomen", + "dxGantt-fullScreen": "Volledig scherm", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Sorteer Oplopend", + "dxGantt-sortingDescendingText": "Sorteer Aflopend", + "dxGantt-sortingClearText": "Sortering wissen", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/pt.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/pt.json new file mode 100644 index 0000000000000000000000000000000000000000..da1b76fe816d04f0d33e06f4f346cb7934c8d16b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/pt.json @@ -0,0 +1,524 @@ +{ + "pt": { + "Yes": "Sim", + "No": "Não", + "Cancel": "Cancelar", + "Clear": "Limpar", + "Done": "Concluído", + "Loading": "Carregando ...", + "Select": "Selecione ...", + "Search": "Pesquisar ...", + "Back": "Voltar", + "OK": "OK", + "dxCollectionWidget-noDataText": "Sem dados", + "dxDropDownEditor-selectLabel": "Selecione", + "validation-required": "Preenchimento obrigatório", + "validation-required-formatted": "{0} é de preenchimento obrigatório", + "validation-numeric": "Valor deve ser um número", + "validation-numeric-formatted": "{0} deve ser um número", + "validation-range": "Valor está fora do intervalo", + "validation-range-formatted": "{0} está fora do intervalo", + "validation-stringLength": "O comprimento do valor não está correto", + "validation-stringLength-formatted": "O comprimento de {0} não está correto", + "validation-custom": "Valor inválido", + "validation-custom-formatted": "{0} é inválido", + "validation-async": "Valor inválido", + "validation-async-formatted": "{0} é inválido", + "validation-compare": "Valores não coincidem", + "validation-compare-formatted": "{0} não coincidem", + "validation-pattern": "Valor não corresponde ao padrão", + "validation-pattern-formatted": "{0} não corresponde ao padrão", + "validation-email": "Email inválido", + "validation-email-formatted": "{0} é inválido", + "validation-mask": "Valor inválido", + "dxLookup-searchPlaceholder": "Número mínimo de caracteres: {0}", + "dxList-pullingDownText": "Puxar para baixo para recarregar...", + "dxList-pulledDownText": "Soltar para recarregar...", + "dxList-refreshingText": "Recarregando ...", + "dxList-pageLoadingText": "A carregar ...", + "dxList-nextButtonText": "Mais", + "dxList-selectAll": "Selecionar todos", + "dxListEditDecorator-delete": "Eliminar", + "dxListEditDecorator-more": "Mais", + "dxScrollView-pullingDownText": "Puxar para baixo para recarregar...", + "dxScrollView-pulledDownText": "Soltar para recarregar...", + "dxScrollView-refreshingText": "Recarregando ...", + "dxScrollView-reachBottomText": "A carregar ...", + "dxDateBox-simulatedDataPickerTitleTime": "Selecionar hora", + "dxDateBox-simulatedDataPickerTitleDate": "Selecionar data", + "dxDateBox-simulatedDataPickerTitleDateTime": "Selecionar data e hora", + "dxDateBox-validation-datetime": "Valor deve ser uma data ou hora", + "dxFileUploader-selectFile": "Selecionar arquivo", + "dxFileUploader-dropFile": "ou Soltar arquivo aqui", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Upload", + "dxFileUploader-uploaded": "Upload concluído", + "dxFileUploader-readyToUpload": "Pronto para upload", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Upload falhou", + "dxFileUploader-invalidFileExtension": "Tipo de arquivo não é permitido", + "dxFileUploader-invalidMaxFileSize": "O arquivo é muito grande", + "dxFileUploader-invalidMinFileSize": "O arquivo é muito pequeno", + "dxRangeSlider-ariaFrom": "De {0}", + "dxRangeSlider-ariaTill": "Até {0}", + "dxSwitch-switchedOnText": "LIGADO", + "dxSwitch-switchedOffText": "DESLIGADO", + "dxForm-optionalMark": "opcional", + "dxForm-requiredMessage": "{0} é de preenchimento obrigatório", + "dxNumberBox-invalidValueMessage": "Valor deve ser um número", + "dxNumberBox-noDataText": "Sem dados", + "dxDataGrid-columnChooserTitle": "Seletor de Colunas", + "dxDataGrid-columnChooserEmptyText": "Arraste uma coluna para até aqui para escondê-la", + "dxDataGrid-groupContinuesMessage": "Continua na página seguinte", + "dxDataGrid-groupContinuedMessage": "Continuação da página anterior", + "dxDataGrid-groupHeaderText": "Agrupar pela coluna", + "dxDataGrid-ungroupHeaderText": "Remover grupo", + "dxDataGrid-ungroupAllText": "Remover todos os grupos", + "dxDataGrid-editingEditRow": "Editar", + "dxDataGrid-editingSaveRowChanges": "Salvar", + "dxDataGrid-editingCancelRowChanges": "Cancelar", + "dxDataGrid-editingDeleteRow": "Eliminar", + "dxDataGrid-editingUndeleteRow": "Recuperar", + "dxDataGrid-editingConfirmDeleteMessage": "Tem certeza que deseja eliminar este registro?", + "dxDataGrid-validationCancelChanges": "Cancelar alterações", + "dxDataGrid-groupPanelEmptyText": "Arrastar o cabeçalho de uma coluna para aqui para agrupar por essa coluna", + "dxDataGrid-noDataText": "Sem dados", + "dxDataGrid-searchPanelPlaceholder": "Pesquisar ...", + "dxDataGrid-filterRowShowAllText": "(Todos)", + "dxDataGrid-filterRowResetOperationText": "Limpar", + "dxDataGrid-filterRowOperationEquals": "Igual", + "dxDataGrid-filterRowOperationNotEquals": "Diferente", + "dxDataGrid-filterRowOperationLess": "Menor que", + "dxDataGrid-filterRowOperationLessOrEquals": "Menor que ou igual a", + "dxDataGrid-filterRowOperationGreater": "Maior que", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Maior que ou igual a", + "dxDataGrid-filterRowOperationStartsWith": "Começa com", + "dxDataGrid-filterRowOperationContains": "Contém", + "dxDataGrid-filterRowOperationNotContains": "Não contém", + "dxDataGrid-filterRowOperationEndsWith": "Termina com", + "dxDataGrid-filterRowOperationBetween": "Entre", + "dxDataGrid-filterRowOperationBetweenStartText": "Início", + "dxDataGrid-filterRowOperationBetweenEndText": "Fim", + "dxDataGrid-applyFilterText": "Aplicar filtro", + "dxDataGrid-trueText": "verdadeiro", + "dxDataGrid-falseText": "falso", + "dxDataGrid-sortingAscendingText": "Ordenar ascendentemente", + "dxDataGrid-sortingDescendingText": "Ordenar descendentemente", + "dxDataGrid-sortingClearText": "Limpar ordenação", + "dxDataGrid-editingSaveAllChanges": "Salvar todas as alterações", + "dxDataGrid-editingCancelAllChanges": "Descartar alterações", + "dxDataGrid-editingAddRow": "Adicionar uma linha", + "dxDataGrid-summaryMin": "Mín: {0}", + "dxDataGrid-summaryMinOtherColumn": "Mín de {1} é {0}", + "dxDataGrid-summaryMax": "Máx: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Máx de {1} é {0}", + "dxDataGrid-summaryAvg": "Méd: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Média de {1} é {0}", + "dxDataGrid-summarySum": "Soma: {0}", + "dxDataGrid-summarySumOtherColumn": "Soma de {1} é {0}", + "dxDataGrid-summaryCount": "Contagem: {0}", + "dxDataGrid-columnFixingFix": "Fixar", + "dxDataGrid-columnFixingUnfix": "Não fixar", + "dxDataGrid-columnFixingLeftPosition": "À esquerda", + "dxDataGrid-columnFixingRightPosition": "À direita", + "dxDataGrid-exportTo": "Exportar para", + "dxDataGrid-exportToExcel": "Exportar para Excel", + "dxDataGrid-exporting": "Exportar...", + "dxDataGrid-excelFormat": "Planilha Excel", + "dxDataGrid-exportAll": "Exportar todos os dados", + "dxDataGrid-exportSelectedRows": "Exportar linhas selecionadas", + "dxDataGrid-selectedRows": "Linhas selecionadas", + "dxDataGrid-headerFilterEmptyValue": "(Vazio)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Cancelar", + "dxDataGrid-ariaColumn": "Coluna", + "dxDataGrid-ariaValue": "Valor", + "dxDataGrid-ariaFilterCell": "Filtro de célula", + "dxDataGrid-ariaCollapse": "Contrair", + "dxDataGrid-ariaExpand": "Expandir", + "dxDataGrid-ariaDataGrid": "Grelha de dados", + "dxDataGrid-ariaSearchInGrid": "Pesquisar na grade de dados", + "dxDataGrid-ariaSelectAll": "Selecionar todos", + "dxDataGrid-ariaSelectRow": "Selecionar linha", + "dxDataGrid-filterBuilderPopupTitle": "Construtor de filtro", + "dxDataGrid-filterPanelCreateFilter": "Criar filtro", + "dxDataGrid-filterPanelClearFilter": "Limpar", + "dxDataGrid-filterPanelFilterEnabledHint": "Habilitar o filtro", + "dxTreeList-ariaTreeList": "Lista em árvore", + "dxTreeList-editingAddRowToNode": "Adicionar", + "dxPager-infoText": "Página {0} de {1} ({2} itens)", + "dxPager-pagesCountText": "de", + "dxPager-pageSizesAllText": "Todos", + "dxPivotGrid-grandTotal": "Grande Total", + "dxPivotGrid-total": "{0} Total", + "dxPivotGrid-fieldChooserTitle": "Seletor de Colunas", + "dxPivotGrid-showFieldChooser": "Mostrar Seletor de Colunas", + "dxPivotGrid-expandAll": "Expandir Tudo", + "dxPivotGrid-collapseAll": "Contrair Tudo", + "dxPivotGrid-sortColumnBySummary": "Ordenar \"{0}\" por esta Coluna", + "dxPivotGrid-sortRowBySummary": "Ordenar \"{0}\" por esta Linha", + "dxPivotGrid-removeAllSorting": "Remover Todas as Ordenações", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Campos de Linha", + "dxPivotGrid-columnFields": "Campos de Coluna", + "dxPivotGrid-dataFields": "Campos de Dados", + "dxPivotGrid-filterFields": "Campos de Filtro", + "dxPivotGrid-allFields": "Todos os Campos", + "dxPivotGrid-columnFieldArea": "Arraste os campos de coluna até aqui", + "dxPivotGrid-dataFieldArea": "Arraste os campos de dados até aqui", + "dxPivotGrid-rowFieldArea": "Arraste os campos de linha até aqui", + "dxPivotGrid-filterFieldArea": "Arraste os campos de filtro até aqui", + "dxScheduler-editorLabelTitle": "Assunto", + "dxScheduler-editorLabelStartDate": "Data de Início", + "dxScheduler-editorLabelEndDate": "Data Final", + "dxScheduler-editorLabelDescription": "Descrição", + "dxScheduler-editorLabelRecurrence": "Repetir", + "dxScheduler-openAppointment": "Abrir compromisso", + "dxScheduler-recurrenceNever": "Nunca", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Diariamente", + "dxScheduler-recurrenceWeekly": "Semanalmente", + "dxScheduler-recurrenceMonthly": "Mensalmente", + "dxScheduler-recurrenceYearly": "Anualmente", + "dxScheduler-recurrenceRepeatEvery": "Todos", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Fim da repetição", + "dxScheduler-recurrenceAfter": "Depois de", + "dxScheduler-recurrenceOn": "A", + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "dia(s)", + "dxScheduler-recurrenceRepeatWeekly": "semana(s)", + "dxScheduler-recurrenceRepeatMonthly": "mês(es)", + "dxScheduler-recurrenceRepeatYearly": "ano(s)", + "dxScheduler-switcherDay": "Dia", + "dxScheduler-switcherWeek": "Semana", + "dxScheduler-switcherWorkWeek": "Dias úteis", + "dxScheduler-switcherMonth": "Mês", + "dxScheduler-switcherTimelineDay": "Linha de tempo Dia", + "dxScheduler-switcherTimelineWeek": "Linha de tempo Semana", + "dxScheduler-switcherTimelineWorkWeek": "Linha de tempo Dias úteis", + "dxScheduler-switcherTimelineMonth": "Linha de tempo Mês", + "dxScheduler-switcherAgenda": "Agenda", + "dxScheduler-recurrenceRepeatOnDate": "na data", + "dxScheduler-recurrenceRepeatCount": "ocorrência(s)", + "dxScheduler-allDay": "Todo o dia", + "dxScheduler-confirmRecurrenceEditMessage": "Deseja editar só este compromisso ou a série toda?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Deseja eliminar só este compromisso ou a série toda?", + "dxScheduler-confirmRecurrenceEditSeries": "Editar série", + "dxScheduler-confirmRecurrenceDeleteSeries": "Eliminar série", + "dxScheduler-confirmRecurrenceEditOccurrence": "Editar compromisso", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Eliminar compromisso", + "dxScheduler-noTimezoneTitle": "Sem fuso horário", + "dxScheduler-moreAppointments": "{0} mais", + "dxCalendar-todayButtonText": "Hoje", + "dxCalendar-ariaWidgetName": "Calendário", + "dxColorView-ariaRed": "Vermelho", + "dxColorView-ariaGreen": "Verde", + "dxColorView-ariaBlue": "Azul", + "dxColorView-ariaAlpha": "Transparência", + "dxColorView-ariaHex": "Código de cor", + "dxTagBox-selected": "{0} selecionados", + "dxTagBox-allSelected": "Todos selecionados ({0})", + "dxTagBox-moreSelected": "{0} mais", + "vizExport-printingButtonText": "Imprimir", + "vizExport-titleMenuText": "Exportar/Imprimir", + "vizExport-exportButtonText": "{0}-Arquivo", + "dxFilterBuilder-and": "E", + "dxFilterBuilder-or": "OU", + "dxFilterBuilder-notAnd": "NÃO E", + "dxFilterBuilder-notOr": "NÃO OU", + "dxFilterBuilder-addCondition": "Adicionar condição", + "dxFilterBuilder-addGroup": "Adicionar Grupo", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Igual", + "dxFilterBuilder-filterOperationNotEquals": "Diferente", + "dxFilterBuilder-filterOperationLess": "Menor que", + "dxFilterBuilder-filterOperationLessOrEquals": "Menor ou igual que", + "dxFilterBuilder-filterOperationGreater": "Maior que", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Maior ou igual que", + "dxFilterBuilder-filterOperationStartsWith": "Começa com", + "dxFilterBuilder-filterOperationContains": "Contém", + "dxFilterBuilder-filterOperationNotContains": "Não contém", + "dxFilterBuilder-filterOperationEndsWith": "Termina com", + "dxFilterBuilder-filterOperationIsBlank": "É vazio", + "dxFilterBuilder-filterOperationIsNotBlank": "Não é vazio", + "dxFilterBuilder-filterOperationBetween": "Entre", + "dxFilterBuilder-filterOperationAnyOf": "Algum de", + "dxFilterBuilder-filterOperationNoneOf": "Nenhum de", + "dxHtmlEditor-dialogColorCaption": "Alterar cor da fonte", + "dxHtmlEditor-dialogBackgroundCaption": "Alterar cor de plano de fundo", + "dxHtmlEditor-dialogLinkCaption": "Adicionar link", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Texto", + "dxHtmlEditor-dialogLinkTargetField": "Abrir link em nova janela", + "dxHtmlEditor-dialogImageCaption": "Adicionar imagem", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Texto alternativo", + "dxHtmlEditor-dialogImageWidthField": "Largura (px)", + "dxHtmlEditor-dialogImageHeightField": "Altura (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Cabeçalho", + "dxHtmlEditor-normalText": "Texto normal", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Ordenar ascendentemente", + "dxGantt-sortingDescendingText": "Ordenar descendentemente", + "dxGantt-sortingClearText": "Limpar ordenação", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ru.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ru.json new file mode 100644 index 0000000000000000000000000000000000000000..7d51af3dc9d83a8006734678097c39c148e2339a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/ru.json @@ -0,0 +1,609 @@ +{ + "ru": { + "Yes": "Да", + "No": "Нет", + "Cancel": "Отмена", + "Clear": "Очистить", + "Done": "Готово", + "Loading": "Загрузка...", + "Select": "Выбрать...", + "Search": "Поиск", + "Back": "Назад", + "OK": "OK", + "dxCollectionWidget-noDataText": "Нет данных для отображения", + "dxDropDownEditor-selectLabel": "Выбрать", + "validation-required": "Поле необходимо заполнить", + "validation-required-formatted": "Необходимо заполнить: {0}", + "validation-numeric": "Значение должно быть числом", + "validation-numeric-formatted": "Значение поля {0} должно быть числом", + "validation-range": "Значение поля не входит в диапазон", + "validation-range-formatted": "Значение поля {0} не входит в диапазон", + "validation-stringLength": "Неверная длина значения в поле", + "validation-stringLength-formatted": "Неверная длина значения в поле {0}", + "validation-custom": "Недопустимое значение", + "validation-custom-formatted": "Недопустимое значение: {0}", + "validation-async": "Недопустимое значение", + "validation-async-formatted": "Недопустимое значение: {0}", + "validation-compare": "Значения полей не соответствуют друг другу.", + "validation-compare-formatted": "Значение поля {0} не соответствует", + "validation-pattern": "Значение не соответствует шаблону", + "validation-pattern-formatted": "Значение поля {0} не соответствует шаблону", + "validation-email": "Недопустимое значение email", + "validation-email-formatted": "Недопустимое значениe {0}", + "validation-mask": "Недопустимое значение", + "dxLookup-searchPlaceholder": "Минимальное количество символов: {0}", + "dxList-pullingDownText": "Потяните, чтобы обновить...", + "dxList-pulledDownText": "Отпустите, чтобы обновить...", + "dxList-refreshingText": "Обновление...", + "dxList-pageLoadingText": "Загрузка...", + "dxList-nextButtonText": "Далее", + "dxList-selectAll": "Выбрать все", + "dxListEditDecorator-delete": "Удалить", + "dxListEditDecorator-more": "Еще", + "dxScrollView-pullingDownText": "Потяните, чтобы обновить...", + "dxScrollView-pulledDownText": "Отпустите, чтобы обновить...", + "dxScrollView-refreshingText": "Обновление...", + "dxScrollView-reachBottomText": "Загрузка...", + "dxDateBox-simulatedDataPickerTitleTime": "Выберите время", + "dxDateBox-simulatedDataPickerTitleDate": "Выберите дату", + "dxDateBox-simulatedDataPickerTitleDateTime": "Выберите дату и время", + "dxDateBox-validation-datetime": "Значение должно быть датой/временем", + "dxFileUploader-selectFile": "Выберите файл", + "dxFileUploader-dropFile": "или Перетащите файл сюда", + "dxFileUploader-bytes": "байт", + "dxFileUploader-kb": "кБ", + "dxFileUploader-Mb": "МБ", + "dxFileUploader-Gb": "ГБ", + "dxFileUploader-upload": "Загрузить", + "dxFileUploader-uploaded": "Загружено", + "dxFileUploader-readyToUpload": "Готово к загрузке", + "dxFileUploader-uploadAbortedMessage": "Загрузка отменена", + "dxFileUploader-uploadFailedMessage": "Загрузка не удалась", + "dxFileUploader-invalidFileExtension": "Недопустимое расширение файла", + "dxFileUploader-invalidMaxFileSize": "Файл слишком большой", + "dxFileUploader-invalidMinFileSize": "Файл слишком маленький", + "dxRangeSlider-ariaFrom": "От", + "dxRangeSlider-ariaTill": "До", + "dxSwitch-switchedOnText": "ВКЛ", + "dxSwitch-switchedOffText": "ВЫКЛ", + "dxForm-optionalMark": "необязательный", + "dxForm-requiredMessage": " Поле {0} должно быть заполнено", + "dxNumberBox-invalidValueMessage": "Значение должно быть числом", + "dxNumberBox-noDataText": "Нет данных", + "dxDataGrid-columnChooserTitle": "Выбор столбцов", + "dxDataGrid-columnChooserEmptyText": "Перетащите столбец сюда, чтобы скрыть его", + "dxDataGrid-groupContinuesMessage": "Продолжение на следующей странице", + "dxDataGrid-groupContinuedMessage": "Продолжение с предыдущей страницы", + "dxDataGrid-groupHeaderText": "Сгруппировать данные по этому столбцу", + "dxDataGrid-ungroupHeaderText": "Разгруппировать данные по этому столбцу", + "dxDataGrid-ungroupAllText": "Сбросить группирование", + "dxDataGrid-editingEditRow": "Редактировать", + "dxDataGrid-editingSaveRowChanges": "Сохранить", + "dxDataGrid-editingCancelRowChanges": "Отменить", + "dxDataGrid-editingDeleteRow": "Удалить", + "dxDataGrid-editingUndeleteRow": "Восстановить", + "dxDataGrid-editingConfirmDeleteMessage": "Вы уверены, что хотите удалить эту запись?", + "dxDataGrid-validationCancelChanges": "Отменить изменения", + "dxDataGrid-groupPanelEmptyText": "Перетащите столбец сюда, чтобы сгруппировать по нему", + "dxDataGrid-noDataText": "Нет данных", + "dxDataGrid-searchPanelPlaceholder": "Искать...", + "dxDataGrid-filterRowShowAllText": "(Все)", + "dxDataGrid-filterRowResetOperationText": "Сбросить", + "dxDataGrid-filterRowOperationEquals": "Равно", + "dxDataGrid-filterRowOperationNotEquals": "Не равно", + "dxDataGrid-filterRowOperationLess": "Меньше", + "dxDataGrid-filterRowOperationLessOrEquals": "Меньше или равно", + "dxDataGrid-filterRowOperationGreater": "Больше", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Больше или равно", + "dxDataGrid-filterRowOperationStartsWith": "Начинается с", + "dxDataGrid-filterRowOperationContains": "Содержит", + "dxDataGrid-filterRowOperationNotContains": "Не содержит", + "dxDataGrid-filterRowOperationEndsWith": "Заканчивается на", + "dxDataGrid-filterRowOperationBetween": "В диапазоне", + "dxDataGrid-filterRowOperationBetweenStartText": "Начало", + "dxDataGrid-filterRowOperationBetweenEndText": "Конец", + "dxDataGrid-applyFilterText": "Применить фильтр", + "dxDataGrid-trueText": "Да", + "dxDataGrid-falseText": "Нет", + "dxDataGrid-sortingAscendingText": "Сортировать по возрастанию", + "dxDataGrid-sortingDescendingText": "Сортировать по убыванию", + "dxDataGrid-sortingClearText": "Сбросить сортировку", + "dxDataGrid-editingSaveAllChanges": "Сохранить изменения", + "dxDataGrid-editingCancelAllChanges": "Отменить изменения", + "dxDataGrid-editingAddRow": "Добавить строку", + "dxDataGrid-summaryMin": "Мин: {0}", + "dxDataGrid-summaryMinOtherColumn": "Мин по {1} : {0}", + "dxDataGrid-summaryMax": "Макс: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Макс по {1} : {0}", + "dxDataGrid-summaryAvg": "Срзнач: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Срзнач по {1} : {0}", + "dxDataGrid-summarySum": "Сумм: {0}", + "dxDataGrid-summarySumOtherColumn": "Сумм по {1} : {0}", + "dxDataGrid-summaryCount": "Кол-во: {0}", + "dxDataGrid-columnFixingFix": "Закрепить", + "dxDataGrid-columnFixingUnfix": "Открепить", + "dxDataGrid-columnFixingLeftPosition": "Налево", + "dxDataGrid-columnFixingRightPosition": "Направо", + "dxDataGrid-exportTo": "Экспортировать", + "dxDataGrid-exportToExcel": "Экспортировать в Excel файл", + "dxDataGrid-exporting": "Экспорт...", + "dxDataGrid-excelFormat": "Excel файл", + "dxDataGrid-selectedRows": "Выбранные строки", + "dxDataGrid-exportAll": "Экспортировать всё", + "dxDataGrid-exportSelectedRows": "Экспортировать выбранные строки", + "dxDataGrid-headerFilterEmptyValue": "(Пустое)", + "dxDataGrid-headerFilterOK": "ОК", + "dxDataGrid-headerFilterCancel": "Отменить", + "dxDataGrid-ariaAdaptiveCollapse": "Скрыть дополнительные данные", + "dxDataGrid-ariaAdaptiveExpand": "Показать дополнительные данные", + "dxDataGrid-ariaColumn": "Столбец", + "dxDataGrid-ariaValue": "Значение", + "dxDataGrid-ariaFilterCell": "Фильтр", + "dxDataGrid-ariaCollapse": "Свернуть", + "dxDataGrid-ariaExpand": "Развернуть", + "dxDataGrid-ariaDataGrid": "Таблица данных", + "dxDataGrid-ariaSearchInGrid": "Искать в таблице данных", + "dxDataGrid-ariaSelectAll": "Выбрать всё", + "dxDataGrid-ariaSelectRow": "Выбрать строку", + "dxDataGrid-ariaToolbar": "Панель инструментов таблицы данных", + "dxDataGrid-filterBuilderPopupTitle": "Конструктор фильтра", + "dxDataGrid-filterPanelCreateFilter": "Создать фильтр", + "dxDataGrid-filterPanelClearFilter": "Очистить", + "dxDataGrid-filterPanelFilterEnabledHint": "Активировать фильтр", + "dxTreeList-ariaTreeList": "Иерархическая таблица данных", + "dxTreeList-ariaSearchInGrid": "Искать в иерархической таблице данных", + "dxTreeList-ariaToolbar": "Панель инструментов иерархической таблицы данных", + "dxTreeList-editingAddRowToNode": "Добавить", + "dxPager-infoText": "Страница {0} из {1} (Всего элементов: {2})", + "dxPager-pagesCountText": "из", + "dxPager-pageSizesAllText": "Все", + "dxPivotGrid-grandTotal": "Итого", + "dxPivotGrid-total": "{0} Всего", + "dxPivotGrid-fieldChooserTitle": "Выбор полей", + "dxPivotGrid-showFieldChooser": "Показать выбор полей", + "dxPivotGrid-expandAll": "Раскрыть все", + "dxPivotGrid-collapseAll": "Свернуть все", + "dxPivotGrid-sortColumnBySummary": "Сортировать \"{0}\" по этой колонке", + "dxPivotGrid-sortRowBySummary": "Сортировать \"{0}\" по этой строке", + "dxPivotGrid-removeAllSorting": "Сбросить все сортировки", + "dxPivotGrid-dataNotAvailable": "Н/Д", + "dxPivotGrid-rowFields": "Поля строк", + "dxPivotGrid-columnFields": "Поля столбцов", + "dxPivotGrid-dataFields": "Поля данных", + "dxPivotGrid-filterFields": "Поля фильтров", + "dxPivotGrid-allFields": "Все поля", + "dxPivotGrid-columnFieldArea": "Перетащите поля колонок cюда", + "dxPivotGrid-dataFieldArea": "Перетащите поля данных cюда", + "dxPivotGrid-rowFieldArea": "Перетащите поля строк cюда", + "dxPivotGrid-filterFieldArea": "Перетащите поля фильтров cюда", + "dxScheduler-editorLabelTitle": "Название", + "dxScheduler-editorLabelStartDate": "Дата начала", + "dxScheduler-editorLabelEndDate": "Дата завершения", + "dxScheduler-editorLabelDescription": "Описание", + "dxScheduler-editorLabelRecurrence": "Повторение", + "dxScheduler-openAppointment": "Открыть задачу", + "dxScheduler-recurrenceNever": "Никогда", + "dxScheduler-recurrenceMinutely": "Ежеминутно", + "dxScheduler-recurrenceHourly": "Ежечасно", + "dxScheduler-recurrenceDaily": "Ежедневно", + "dxScheduler-recurrenceWeekly": "Еженедельно", + "dxScheduler-recurrenceMonthly": "Ежемесячно", + "dxScheduler-recurrenceYearly": "Ежегодно", + "dxScheduler-recurrenceRepeatEvery": "Интервал", + "dxScheduler-recurrenceRepeatOn": "Повторять по", + "dxScheduler-recurrenceEnd": "Завершить повторение", + "dxScheduler-recurrenceAfter": "После", + "dxScheduler-recurrenceOn": "Повторять до", + "dxScheduler-recurrenceRepeatMinutely": "минут(минуты)", + "dxScheduler-recurrenceRepeatHourly": "часов(часа)", + "dxScheduler-recurrenceRepeatDaily": "дней(дня)", + "dxScheduler-recurrenceRepeatWeekly": "недели(недель)", + "dxScheduler-recurrenceRepeatMonthly": "месяца(месяцев)", + "dxScheduler-recurrenceRepeatYearly": "года(лет)", + "dxScheduler-recurrenceRepeatOnDate": "до даты", + "dxScheduler-recurrenceRepeatCount": "повторений", + "dxScheduler-switcherDay": "День", + "dxScheduler-switcherWeek": "Неделя", + "dxScheduler-switcherWorkWeek": "Рабочая неделя", + "dxScheduler-switcherMonth": "Месяц", + "dxScheduler-switcherTimelineDay": "Хронология дня", + "dxScheduler-switcherTimelineWeek": "Хронология недели", + "dxScheduler-switcherTimelineWorkWeek": "Хронология рабочей недели", + "dxScheduler-switcherTimelineMonth": "Хронология месяца", + "dxScheduler-switcherAgenda": "Расписание", + "dxScheduler-allDay": "Весь день", + "dxScheduler-confirmRecurrenceEditMessage": "Вы хотите отредактировать только это событие или всю серию?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Вы хотите удалить только это событие или всю серию?", + "dxScheduler-confirmRecurrenceEditSeries": "Всю серию", + "dxScheduler-confirmRecurrenceDeleteSeries": "Всю серию", + "dxScheduler-confirmRecurrenceEditOccurrence": "Только это событие", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Только это событие", + "dxScheduler-noTimezoneTitle": "Часовой пояс не выбран", + "dxScheduler-moreAppointments": "и еще {0}", + "dxCalendar-todayButtonText": "Сегодня", + "dxCalendar-ariaWidgetName": "Календарь", + "dxColorView-ariaRed": "Красный", + "dxColorView-ariaGreen": "Зеленый", + "dxColorView-ariaBlue": "Синий", + "dxColorView-ariaAlpha": "Прозрачность", + "dxColorView-ariaHex": "Код цвета", + "dxTagBox-selected": "{0} выбрано", + "dxTagBox-allSelected": "Выбрано все ({0})", + "dxTagBox-moreSelected": "и еще {0}", + "vizExport-printingButtonText": "Печать", + "vizExport-titleMenuText": "Экспорт/Печать", + "vizExport-exportButtonText": "{0} файл", + "dxFilterBuilder-and": "И", + "dxFilterBuilder-or": "Или", + "dxFilterBuilder-notAnd": "Не И", + "dxFilterBuilder-notOr": "Не Или", + "dxFilterBuilder-addCondition": "Добавить условие", + "dxFilterBuilder-addGroup": "Добавить группу", + "dxFilterBuilder-enterValueText": "<введите значение>", + "dxFilterBuilder-filterOperationEquals": "Равно", + "dxFilterBuilder-filterOperationNotEquals": "Не равно", + "dxFilterBuilder-filterOperationLess": "Меньше", + "dxFilterBuilder-filterOperationLessOrEquals": "Меньше или равно", + "dxFilterBuilder-filterOperationGreater": "Больше", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Больше или равно", + "dxFilterBuilder-filterOperationStartsWith": "Начинается с", + "dxFilterBuilder-filterOperationContains": "Содержит", + "dxFilterBuilder-filterOperationNotContains": "Не содержит", + "dxFilterBuilder-filterOperationEndsWith": "Заканчивается на", + "dxFilterBuilder-filterOperationIsBlank": "Пусто", + "dxFilterBuilder-filterOperationIsNotBlank": "Не пусто", + "dxFilterBuilder-filterOperationBetween": "В диапазоне", + "dxFilterBuilder-filterOperationAnyOf": "Любой из", + "dxFilterBuilder-filterOperationNoneOf": "Ни один из", + "dxHtmlEditor-dialogColorCaption": "Изменить цвет текста", + "dxHtmlEditor-dialogBackgroundCaption": "Изменить цвет фона", + "dxHtmlEditor-dialogLinkCaption": "Добавить ссылку", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Текст", + "dxHtmlEditor-dialogLinkTargetField": "Открыть в новом окне", + "dxHtmlEditor-dialogImageCaption": "Добавить изображение", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Альтернативный текст", + "dxHtmlEditor-dialogImageWidthField": "Ширина (px)", + "dxHtmlEditor-dialogImageHeightField": "Высота (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "Строки", + "dxHtmlEditor-dialogInsertTableColumnsField": "Колонки", + "dxHtmlEditor-dialogInsertTableCaption": "Вставить таблицу", + "dxHtmlEditor-heading": "Заголовок", + "dxHtmlEditor-normalText": "Обычный текст", + "dxHtmlEditor-background": "Цвет фона", + "dxHtmlEditor-bold": "Полужирный", + "dxHtmlEditor-color": "Цвет текста", + "dxHtmlEditor-font": "Шрифт", + "dxHtmlEditor-italic": "Курсив", + "dxHtmlEditor-link": "Добавить ссылку", + "dxHtmlEditor-image": "Добавить изображение", + "dxHtmlEditor-size": "Размер шрифта", + "dxHtmlEditor-strike": "Зачеркнутый", + "dxHtmlEditor-subscript": "Нижний индекс", + "dxHtmlEditor-superscript": "Верхний индекс", + "dxHtmlEditor-underline": "Подчеркнутый", + "dxHtmlEditor-blockquote": "Цитата", + "dxHtmlEditor-header": "Заголовок", + "dxHtmlEditor-increaseIndent": "Увеличить отступ", + "dxHtmlEditor-decreaseIndent": "Уменьшить отступ", + "dxHtmlEditor-orderedList": "Нумерованный список", + "dxHtmlEditor-bulletList": "Маркированный список", + "dxHtmlEditor-alignLeft": "Выравнивание по левому краю", + "dxHtmlEditor-alignCenter": "Выравнивание по центру", + "dxHtmlEditor-alignRight": "Выравнивание по правому краю", + "dxHtmlEditor-alignJustify": "Выравнивание по ширине", + "dxHtmlEditor-codeBlock": "Блок кода", + "dxHtmlEditor-variable": "Добавить переменную", + "dxHtmlEditor-undo": "Отменить", + "dxHtmlEditor-redo": "Повторить", + "dxHtmlEditor-clear": "Очистить форматирование", + "dxHtmlEditor-insertTable": "Вставить таблицу", + "dxHtmlEditor-insertHeaderRow": "Вставить строку заголовков", + "dxHtmlEditor-insertRowAbove": "Вставить строку сверху", + "dxHtmlEditor-insertRowBelow": "Вставить строку снизу", + "dxHtmlEditor-insertColumnLeft": "Вставить колонку слева", + "dxHtmlEditor-insertColumnRight": "Вставить колонку справа", + "dxHtmlEditor-deleteColumn": "Удалить колонку", + "dxHtmlEditor-deleteRow": "Удалить строку", + "dxHtmlEditor-deleteTable": "Удалить таблицу", + "dxHtmlEditor-cellProperties": "Свойства ячейки", + "dxHtmlEditor-tableProperties": "Свойства таблицы", + "dxHtmlEditor-insert": "Вставка", + "dxHtmlEditor-delete": "Удаление", + "dxHtmlEditor-border": "Граница", + "dxHtmlEditor-style": "Стиль", + "dxHtmlEditor-width": "Ширина", + "dxHtmlEditor-height": "Высота", + "dxHtmlEditor-borderColor": "Цвет", + "dxHtmlEditor-tableBackground": "Цвет фона", + "dxHtmlEditor-dimensions": "Размеры", + "dxHtmlEditor-alignment": "Выравнивание", + "dxHtmlEditor-horizontal": "Горизонтальное", + "dxHtmlEditor-vertical": "Вертикальное", + "dxHtmlEditor-paddingVertical": "Вертикальный отступ", + "dxHtmlEditor-paddingHorizontal": "Горизонтальный отступ", + "dxHtmlEditor-pixels": "Пиксели", + "dxHtmlEditor-list": "Список", + "dxHtmlEditor-ordered": "Нумерованный", + "dxHtmlEditor-bullet": "Маркированный", + "dxHtmlEditor-align": "Выравнивание", + "dxHtmlEditor-center": "По центру", + "dxHtmlEditor-left": "По левому краю", + "dxHtmlEditor-right": "По правому краю", + "dxHtmlEditor-indent": "Отступ", + "dxHtmlEditor-justify": "По ширине", + "dxFileManager-newDirectoryName": "Без названия", + "dxFileManager-rootDirectoryName": "Файлы", + "dxFileManager-errorNoAccess": "Доступ запрещён. Операция не может быть завершена.", + "dxFileManager-errorDirectoryExistsFormat": "Каталог {0} уже существует.", + "dxFileManager-errorFileExistsFormat": "Файл {0} уже существует.", + "dxFileManager-errorFileNotFoundFormat": "Файл {0} не найден.", + "dxFileManager-errorDirectoryNotFoundFormat": "Каталог '{0}' не найден.", + "dxFileManager-errorWrongFileExtension": "Неверное расширение файла.", + "dxFileManager-errorMaxFileSizeExceeded": "Размер файла превышает допустимое значение.", + "dxFileManager-errorInvalidSymbols": "Введённое имя содержит недопустимые символы.", + "dxFileManager-errorDefault": "Неизвестная ошибка", + "dxFileManager-errorDirectoryOpenFailed": "Не удалось открыть каталог", + + "dxFileManager-commandCreate": "Новая папка", + "dxFileManager-commandRename": "Переименовать", + "dxFileManager-commandMove": "Переместить в", + "dxFileManager-commandCopy": "Копировать в", + "dxFileManager-commandDelete": "Удалить", + "dxFileManager-commandDownload": "Скачать", + "dxFileManager-commandUpload": "Загрузить файлы", + "dxFileManager-commandRefresh": "Обновить", + "dxFileManager-commandThumbnails": "Режим эксизов", + "dxFileManager-commandDetails": "Режим списка", + "dxFileManager-commandClearSelection": "Очистить выделение", + "dxFileManager-dialogButtonCancel": "Отмена", + "dxFileManager-commandShowNavPane": "Переключить панель навигации", + + "dxFileManager-dialogDirectoryChooserMoveTitle": "Переместить в", + "dxFileManager-dialogDirectoryChooserMoveButtonText": "Переместить", + "dxFileManager-dialogDirectoryChooserCopyTitle": "Копировать в", + "dxFileManager-dialogDirectoryChooserCopyButtonText": "Копировать", + "dxFileManager-dialogRenameItemTitle": "Переименовать", + "dxFileManager-dialogRenameItemButtonText": "Сохранить", + "dxFileManager-dialogCreateDirectoryTitle": "Новая папка", + "dxFileManager-dialogCreateDirectoryButtonText": "Создать", + "dxFileManager-dialogDeleteItemTitle": "Удаление элемента", + "dxFileManager-dialogDeleteItemButtonText": "Удалить", + "dxFileManager-dialogDeleteItemSingleItemConfirmation": "Вы действительно хотите удалить {0}?", + "dxFileManager-dialogDeleteItemMultipleItemsConfirmation": "Вы действительно хотите удалить {0} элементов?", + + "dxFileManager-editingCreateSingleItemProcessingMessage": "Создаётся папка в {0}", + "dxFileManager-editingCreateSingleItemSuccessMessage": "Создана папка в {0}", + "dxFileManager-editingCreateSingleItemErrorMessage": "Не удалось создать папку", + "dxFileManager-editingCreateCommonErrorMessage": "Не удалось создать папку", + + "dxFileManager-editingRenameSingleItemProcessingMessage": "Переименовывается элемент в {0}", + "dxFileManager-editingRenameSingleItemSuccessMessage": "Переименован элемент в {0}", + "dxFileManager-editingRenameSingleItemErrorMessage": "Не удалось переименовать элемент", + "dxFileManager-editingRenameCommonErrorMessage": "Не удалось переименовать элемент", + + "dxFileManager-editingDeleteSingleItemProcessingMessage": "Элемент удаляется из {0}", + "dxFileManager-editingDeleteMultipleItemsProcessingMessage": "Удаление {0} элементов из {1}", + "dxFileManager-editingDeleteSingleItemSuccessMessage": "Элемент удалён из {0}", + "dxFileManager-editingDeleteMultipleItemsSuccessMessage": "{0} элементов удалено из {1}", + "dxFileManager-editingDeleteSingleItemErrorMessage": "Не удалось удалить элемент", + "dxFileManager-editingDeleteMultipleItemsErrorMessage": "{0} элементов не были удалены", + "dxFileManager-editingDeleteCommonErrorMessage": "Некоторые элементы не были удалены", + + "dxFileManager-editingMoveSingleItemProcessingMessage": "Элемент перемещается в {0}", + "dxFileManager-editingMoveMultipleItemsProcessingMessage": "Перемещение {0} элементов в {1}", + "dxFileManager-editingMoveSingleItemSuccessMessage": "Элемент перемещён в {0}", + "dxFileManager-editingMoveMultipleItemsSuccessMessage": "{0} элементов перемещено в {1}", + "dxFileManager-editingMoveSingleItemErrorMessage": "Не удалось переместить элемент", + "dxFileManager-editingMoveMultipleItemsErrorMessage": "{0} элементов не были перемещены", + "dxFileManager-editingMoveCommonErrorMessage": "Некоторые элементы не были перемещены", + + "dxFileManager-editingCopySingleItemProcessingMessage": "Элемент копируется в {0}", + "dxFileManager-editingCopyMultipleItemsProcessingMessage": "Коипрование {0} элементов в {1}", + "dxFileManager-editingCopySingleItemSuccessMessage": "Элемент скопирован в {0}", + "dxFileManager-editingCopyMultipleItemsSuccessMessage": "{0} элементов скопировано в {1}", + "dxFileManager-editingCopySingleItemErrorMessage": "Не удалось скопировать элемент", + "dxFileManager-editingCopyMultipleItemsErrorMessage": "{0} элементов не были скопированы", + "dxFileManager-editingCopyCommonErrorMessage": "Некоторые элементы не были скопированы", + + "dxFileManager-editingUploadSingleItemProcessingMessage": "Элемент загружается в {0}", + "dxFileManager-editingUploadMultipleItemsProcessingMessage": "Загрузка {0} элементов в {1}", + "dxFileManager-editingUploadSingleItemSuccessMessage": "Элемент загружен в {0}", + "dxFileManager-editingUploadMultipleItemsSuccessMessage": "{0} элементов загружено в {1}", + "dxFileManager-editingUploadSingleItemErrorMessage": "Не удалось загрузить элемент", + "dxFileManager-editingUploadMultipleItemsErrorMessage": "{0} элементов не были загружены", + "dxFileManager-editingUploadCanceledMessage": "Отменено", + + "dxFileManager-listDetailsColumnCaptionName": "Название", + "dxFileManager-listDetailsColumnCaptionDateModified": "Дата изменения", + "dxFileManager-listDetailsColumnCaptionFileSize": "Размер файла", + + "dxFileManager-listThumbnailsTooltipTextSize": "Размер", + "dxFileManager-listThumbnailsTooltipTextDateModified": "Дата изменения", + + "dxFileManager-notificationProgressPanelTitle": "Прогресс", + "dxFileManager-notificationProgressPanelEmptyListText": "Операции отсутствуют", + "dxFileManager-notificationProgressPanelOperationCanceled": "Отменено", + + "dxDiagram-categoryGeneral": "Общие", + "dxDiagram-categoryFlowchart": "Блок-схема", + "dxDiagram-categoryOrgChart": "Организационная схема", + "dxDiagram-categoryContainers": "Контейнеры", + "dxDiagram-categoryCustom": "Пользовательские", + + "dxDiagram-commandExportToSvg": "Экспорт в SVG", + "dxDiagram-commandExportToPng": "Экспорт в PNG", + "dxDiagram-commandExportToJpg": "Экспорт в JPEG", + "dxDiagram-commandUndo": "Отменить", + "dxDiagram-commandRedo": "Повторить", + "dxDiagram-commandFontName": "Название шрифта", + "dxDiagram-commandFontSize": "Размер шрифта", + "dxDiagram-commandBold": "Полужирный", + "dxDiagram-commandItalic": "Курсив", + "dxDiagram-commandUnderline": "Подчеркнутый", + "dxDiagram-commandTextColor": "Цвет текста", + "dxDiagram-commandLineColor": "Цвет линии", + "dxDiagram-commandLineWidth": "Ширина линии", + "dxDiagram-commandLineStyle": "Стиль линии", + "dxDiagram-commandLineStyleSolid": "Сплошная", + "dxDiagram-commandLineStyleDotted": "Пунктирная", + "dxDiagram-commandLineStyleDashed": "Штриховая", + "dxDiagram-commandFillColor": "Цвет заливки", + "dxDiagram-commandAlignLeft": "Выравнивание по левому краю", + "dxDiagram-commandAlignCenter": "Выравнивание по центру", + "dxDiagram-commandAlignRight": "Выравнивание по правому краю", + "dxDiagram-commandConnectorLineType": "Тип соединителя", + "dxDiagram-commandConnectorLineStraight": "Прямой", + "dxDiagram-commandConnectorLineOrthogonal": "Ортогональный", + "dxDiagram-commandConnectorLineStart": "Тип начала соединителя", + "dxDiagram-commandConnectorLineEnd": "Тип конца соединителя", + "dxDiagram-commandConnectorLineNone": "Нет", + "dxDiagram-commandConnectorLineArrow": "Стрелка", + "dxDiagram-commandFullscreen": "Полноэкранный режим", + "dxDiagram-commandUnits": "Единицы измерения", + "dxDiagram-commandPageSize": "Размер страницы", + "dxDiagram-commandPageOrientation": "Ориентация страницы", + "dxDiagram-commandPageOrientationLandscape": "Альбомная", + "dxDiagram-commandPageOrientationPortrait": "Портретная", + "dxDiagram-commandPageColor": "Цвет страницы", + "dxDiagram-commandShowGrid": "Показывать сетку", + "dxDiagram-commandSnapToGrid": "Привязка к сетке", + "dxDiagram-commandGridSize": "Размер сетки", + "dxDiagram-commandZoomLevel": "Маштаб", + "dxDiagram-commandAutoZoom": "Автомаштаб", + "dxDiagram-commandFitToContent": "Вместить по содержимому", + "dxDiagram-commandFitToWidth": "Вместить по ширине", + "dxDiagram-commandAutoZoomByContent": "Автомаштаб по содержимому", + "dxDiagram-commandAutoZoomByWidth": "Автомаштаб по ширине", + "dxDiagram-commandSimpleView": "Упрощенный вид", + "dxDiagram-commandCut": "Вырезать", + "dxDiagram-commandCopy": "Копировать", + "dxDiagram-commandPaste": "Вставить", + "dxDiagram-commandSelectAll": "Выделить всё", + "dxDiagram-commandDelete": "Удалить", + "dxDiagram-commandBringToFront": "На передний план", + "dxDiagram-commandSendToBack": "На задний план", + "dxDiagram-commandLock": "Заблокировать", + "dxDiagram-commandUnlock": "Разблокировать", + "dxDiagram-commandInsertShapeImage": "Добавить изображение...", + "dxDiagram-commandEditShapeImage": "Изменить изображение...", + "dxDiagram-commandDeleteShapeImage": "Удалить изображение", + "dxDiagram-commandLayoutLeftToRight": "Слева направо", + "dxDiagram-commandLayoutRightToLeft": "Справа налево", + "dxDiagram-commandLayoutTopToBottom": "Сверху вниз", + "dxDiagram-commandLayoutBottomToTop": "Снизу вверх", + + "dxDiagram-unitIn": "дюйм(а)", + "dxDiagram-unitCm": "см", + "dxDiagram-unitPx": "пиксель(я)", + + "dxDiagram-dialogButtonOK": "ОК", + "dxDiagram-dialogButtonCancel": "Отмена", + "dxDiagram-dialogInsertShapeImageTitle": "Добавить изображение", + "dxDiagram-dialogEditShapeImageTitle": "Изменить изображение", + "dxDiagram-dialogEditShapeImageSelectButton": "Выберите изображение", + "dxDiagram-dialogEditShapeImageLabelText": "или перетащите файл сюда", + + "dxDiagram-uiExport": "Экспорт", + "dxDiagram-uiProperties": "Свойства", + "dxDiagram-uiSettings": "Настройки", + "dxDiagram-uiShowToolbox": "Панель инструментов", + "dxDiagram-uiSearch": "Поиск", + "dxDiagram-uiStyle": "Стиль", + "dxDiagram-uiLayout": "Компоновка", + "dxDiagram-uiLayoutTree": "Древовидная", + "dxDiagram-uiLayoutLayered": "Многоуровневая", + "dxDiagram-uiDiagram": "Диаграмма", + "dxDiagram-uiText": "Текст", + "dxDiagram-uiObject": "Объект", + "dxDiagram-uiConnector": "Соединитель", + "dxDiagram-uiPage": "Страница", + + "dxDiagram-shapeText": "Текст", + "dxDiagram-shapeRectangle": "Прямоугольник", + "dxDiagram-shapeEllipse": "Эллипс", + "dxDiagram-shapeCross": "Крест", + "dxDiagram-shapeTriangle": "Треугольник", + "dxDiagram-shapeDiamond": "Ромб", + "dxDiagram-shapeHeart": "Сердце", + "dxDiagram-shapePentagon": "Пятиугольник", + "dxDiagram-shapeHexagon": "Шестиугольник", + "dxDiagram-shapeOctagon": "Восьмиугольник", + "dxDiagram-shapeStar": "Звезда", + "dxDiagram-shapeArrowLeft": "Стрелка влево", + "dxDiagram-shapeArrowUp": "Стрелка вверх", + "dxDiagram-shapeArrowRight": "Стрелка вправо", + "dxDiagram-shapeArrowDown": "Стрелка вниз", + "dxDiagram-shapeArrowUpDown": "Стрелка вверх-вниз", + "dxDiagram-shapeArrowLeftRight": "Стрелка влево-вправо", + "dxDiagram-shapeProcess": "Процесс", + "dxDiagram-shapeDecision": "Решение", + "dxDiagram-shapeTerminator": "Терминатор", + "dxDiagram-shapePredefinedProcess": "Предопределенный процесс", + "dxDiagram-shapeDocument": "Документ", + "dxDiagram-shapeMultipleDocuments": "Документы", + "dxDiagram-shapeManualInput": "Ручной ввод", + "dxDiagram-shapePreparation": "Подготовка", + "dxDiagram-shapeData": "Данные", + "dxDiagram-shapeDatabase": "База данных", + "dxDiagram-shapeHardDisk": "Жесткий диск", + "dxDiagram-shapeInternalStorage": "Внутренняя память", + "dxDiagram-shapePaperTape": "Бумажная лента", + "dxDiagram-shapeManualOperation": "Ручная операция", + "dxDiagram-shapeDelay": "Задержка", + "dxDiagram-shapeStoredData": "Запоминаемые данные", + "dxDiagram-shapeDisplay": "Дисплей", + "dxDiagram-shapeMerge": "Слияние", + "dxDiagram-shapeConnector": "Соединитель", + "dxDiagram-shapeOr": "Или", + "dxDiagram-shapeSummingJunction": "Суммирование", + "dxDiagram-shapeContainerDefaultText": "Контейнер", + "dxDiagram-shapeVerticalContainer": "Вертикальный контейнер", + "dxDiagram-shapeHorizontalContainer": "Горизонтальный контейнер", + "dxDiagram-shapeCardDefaultText": "Имя человека", + "dxDiagram-shapeCardWithImageOnLeft": "Карточка с изображением слева", + "dxDiagram-shapeCardWithImageOnTop": "Карточка с изображением сверху", + "dxDiagram-shapeCardWithImageOnRight": "Карточка с изображением справа", + + "dxGantt-dialogTitle": "Название", + "dxGantt-dialogStartTitle": "Начало", + "dxGantt-dialogEndTitle": "Окончание", + "dxGantt-dialogProgressTitle": "Прогресс", + "dxGantt-dialogResourcesTitle": "Ресурсы", + "dxGantt-dialogResourceManagerTitle": "Управление ресурсами", + "dxGantt-dialogTaskDetailsTitle": "Детали задачи", + "dxGantt-dialogEditResourceListHint": "Редактировать список ресурсов", + "dxGantt-dialogEditNoResources": "Список ресурсов пуст", + "dxGantt-dialogButtonAdd": "Добавить", + "dxGantt-contextMenuNewTask": "Новая задача", + "dxGantt-contextMenuNewSubtask": "Новая подзадача", + "dxGantt-contextMenuDeleteTask": "Удалить задачу", + "dxGantt-contextMenuDeleteDependency": "Удалить зависимость", + "dxGantt-dialogTaskDeleteConfirmation": "Удаление задачи приведет к удалению всех её зависимостей и подзадач. Вы уверены, что вы хотите удалить эту задачу?", + "dxGantt-dialogDependencyDeleteConfirmation": "Вы уверены, что хотите удалить эту зависимость из задачи?", + "dxGantt-dialogResourcesDeleteConfirmation": "Удаление ресурса также удалит его из всех задач, в которых он используется. Вы уверены, что хотите удалить эти ресурсы? Ресурсы: {0}", + "dxGantt-dialogConstraintCriticalViolationMessage": "Задача, которую вы передвигаете, имеет зависимость от другой задачи. Это изменение противоречит правилам валидации. Как вы хотите поступить?", + "dxGantt-dialogConstraintViolationMessage": "Задача, которую вы передвигаете, имеет зависимость от другой задачи. Как вы хотите поступить?", + "dxGantt-dialogCancelOperationMessage": "Отменить операцию", + "dxGantt-dialogDeleteDependencyMessage": "Удалить задачу", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "Сохранить зависимость и передвинуть задачу", + "dxGantt-undo": "Отменить", + "dxGantt-redo": "Повторить", + "dxGantt-expandAll": "Развернуть все", + "dxGantt-collapseAll": "Свернуть все", + "dxGantt-addNewTask": "Добавить новую задачу", + "dxGantt-deleteSelectedTask": "Удалить выделенную задачу", + "dxGantt-zoomIn": "Увеличить масштаб", + "dxGantt-zoomOut": "Уменьшить масштаб", + "dxGantt-fullScreen": "Полноэкранный режим", + "dxGantt-quarter": "{0}-й кв.", + "dxGantt-sortingAscendingText": "Сортировать по возрастанию", + "dxGantt-sortingDescendingText": "Сортировать по убыванию", + "dxGantt-sortingClearText": "Сбросить сортировку", + "dxGantt-showResources": "Отображать Ресурсы", + "dxGantt-showDependencies": "Отображать Зависимости", + "dxGantt-dialogStartDateValidation": "Начальная дата должна быть позднее {0}", + "dxGantt-dialogEndDateValidation": "Конечная дата должна быть позднее {0}" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sl.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sl.json new file mode 100644 index 0000000000000000000000000000000000000000..e841d4270942f27420096b2bbd6dbd7cd7c0eb3d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sl.json @@ -0,0 +1,555 @@ +{ + "sl": { + "Yes": "Da", + "No": "Ne", + "Cancel": "Prekliči", + "Clear": "Pobriši", + "Done": "Končano", + "Loading": "Nalagam...", + "Select": "Izberi...", + "Search": "Išči", + "Back": "Nazaj", + "OK": "V redu", + + "dxCollectionWidget-noDataText": "Ni podatkov za prikaz", + + "dxDropDownEditor-selectLabel": "Izberi", + + "validation-required": "Obvezen podatek", + "validation-required-formatted": "Podatek {0} je obvezen", + "validation-numeric": "Vrednost mora biti število", + "validation-numeric-formatted": "{0} mora biti število", + "validation-range": "Vrednost je izven območja", + "validation-range-formatted": "{0} je izven območja", + "validation-stringLength": "Neustrezna dolžina podatka", + "validation-stringLength-formatted": "Dolžina {0} ni ustrezna", + "validation-custom": "Vrednost ni pravilna", + "validation-custom-formatted": "Vrednost {0} je nepravilna", + "validation-compare": "Vrednosti se ne ujemata", + "validation-compare-formatted": "{0} se ne ujema", + "validation-pattern": "Vrednost ne ustreza vzorcu", + "validation-pattern-formatted": "{0} ne ustreza vzorcu", + "validation-email": "Email je neveljaven", + "validation-email-formatted": "{0} je neveljaven", + "validation-mask": "Vrednost je napačna", + + "dxLookup-searchPlaceholder": "Najmanjše število znakov: {0}", + + "dxList-pullingDownText": "Povlecite navzdol za osvežitev...", + "dxList-pulledDownText": "Spustite za osvežitev...", + "dxList-refreshingText": "Osvežujem...", + "dxList-pageLoadingText": "Nalagam...", + "dxList-nextButtonText": "Več", + "dxList-selectAll": "Izberi vse", + "dxListEditDecorator-delete": "Izbriši", + "dxListEditDecorator-more": "Več", + + "dxScrollView-pullingDownText": "Povlecite navzdol za osvežitev...", + "dxScrollView-pulledDownText": "Spustite za osvežitev...", + "dxScrollView-refreshingText": "Osvežujem...", + "dxScrollView-reachBottomText": "Nalagam...", + + "dxDateBox-simulatedDataPickerTitleTime": "Izberi čas", + "dxDateBox-simulatedDataPickerTitleDate": "Izberi datum", + "dxDateBox-simulatedDataPickerTitleDateTime": "Izberi datum in čas", + "dxDateBox-validation-datetime": "Vrednost mora biti datum ali čas", + + "dxFileUploader-selectFile": "Izberi datoteko", + "dxFileUploader-dropFile": "ali spusti datoteko tukaj", + "dxFileUploader-bytes": "bajtov", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Naloži", + "dxFileUploader-uploaded": "Naloženo", + "dxFileUploader-readyToUpload": "Pripravljeno za nalaganje", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Nalaganje je spodletelo", + "dxFileUploader-invalidFileExtension": "Tip datoteke ni dovoljen", + "dxFileUploader-invalidMaxFileSize": "Datoteka je prevelika", + "dxFileUploader-invalidMinFileSize": "Datoteka je premajhna", + + "dxRangeSlider-ariaFrom": "Od", + "dxRangeSlider-ariaTill": "Do", + "dxSwitch-switchedOnText": "Vklopljeno", + "dxSwitch-switchedOffText": "Izklopljeno", + + "dxForm-optionalMark": "opcijsko", + "dxForm-requiredMessage": "Podatek {0} je obvezen", + + "dxNumberBox-invalidValueMessage": "Vrednost mora biti število", + "dxNumberBox-noDataText": "Ni podatkov", + + "dxDataGrid-columnChooserTitle": "Izbirnik stolpcev", + "dxDataGrid-columnChooserEmptyText": "Povlecite stolpec sem, da ga skrijete", + "dxDataGrid-groupContinuesMessage": "Nadaljevanje na naslednji strani", + "dxDataGrid-groupContinuedMessage": "Nadaljevanje iz prejšnje strani", + "dxDataGrid-groupHeaderText": "Združi po tem stolpcu", + "dxDataGrid-ungroupHeaderText": "Razdruži", + "dxDataGrid-ungroupAllText": "Razdruži vse", + "dxDataGrid-editingEditRow": "Uredi", + "dxDataGrid-editingSaveRowChanges": "Shrani", + "dxDataGrid-editingCancelRowChanges": "Prekliči", + "dxDataGrid-editingDeleteRow": "Briši", + "dxDataGrid-editingUndeleteRow": "Razveljavi brisanje", + "dxDataGrid-editingConfirmDeleteMessage": "Ste prepričani, da želite izbrisati ta zapis?", + "dxDataGrid-validationCancelChanges": "Prekliči spremembe", + "dxDataGrid-groupPanelEmptyText": "Povleci glavo stolpca sem za združevanje po tem stolpcu", + "dxDataGrid-noDataText": "Ni podatkov", + "dxDataGrid-searchPanelPlaceholder": "Išči...", + "dxDataGrid-filterRowShowAllText": "(Vse)", + "dxDataGrid-filterRowResetOperationText": "Ponastavi", + "dxDataGrid-filterRowOperationEquals": "Enako", + "dxDataGrid-filterRowOperationNotEquals": "Ni enako", + "dxDataGrid-filterRowOperationLess": "Manj od", + "dxDataGrid-filterRowOperationLessOrEquals": "Manj ali enako kot", + "dxDataGrid-filterRowOperationGreater": "Večje kot", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Večje ali enako kot", + "dxDataGrid-filterRowOperationStartsWith": "Se začne", + "dxDataGrid-filterRowOperationContains": "Vsebuje", + "dxDataGrid-filterRowOperationNotContains": "Ne vsebuje", + "dxDataGrid-filterRowOperationEndsWith": "Se konča z", + "dxDataGrid-filterRowOperationBetween": "Je med", + "dxDataGrid-filterRowOperationBetweenStartText": "Začetek", + "dxDataGrid-filterRowOperationBetweenEndText": "Konec", + "dxDataGrid-applyFilterText": "Uporabi filter", + "dxDataGrid-trueText": "Da", + "dxDataGrid-falseText": "Ne", + "dxDataGrid-sortingAscendingText": "Razvrsti naraščajoče", + "dxDataGrid-sortingDescendingText": "Razvrsti padajoče", + "dxDataGrid-sortingClearText": "Brez razvrščanja", + "dxDataGrid-editingSaveAllChanges": "Shrani spremembe", + "dxDataGrid-editingCancelAllChanges": "Zavrzi spremembe", + "dxDataGrid-editingAddRow": "Dodaj vrstico", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Min od {1} je {0}", + "dxDataGrid-summaryMax": "Maks: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Maks od {1} je {0}", + "dxDataGrid-summaryAvg": "Povpr: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Povpr. od {1} je {0}", + "dxDataGrid-summarySum": "Skupaj: {0}", + "dxDataGrid-summarySumOtherColumn": "Skupaj od {1} je {0}", + "dxDataGrid-summaryCount": "Število: {0}", + "dxDataGrid-columnFixingFix": "Popravi", + "dxDataGrid-columnFixingUnfix": "Ne popravi", + "dxDataGrid-columnFixingLeftPosition": "Levo", + "dxDataGrid-columnFixingRightPosition": "Desno", + "dxDataGrid-exportTo": "Izvozi", + "dxDataGrid-exportToExcel": "Izvozi v Excel datoteko", + "dxDataGrid-exporting": "Izvozi...", + "dxDataGrid-excelFormat": "Excel datoteka", + "dxDataGrid-selectedRows": "Izbrane vrstice", + "dxDataGrid-exportSelectedRows": "Izvozi izbrane vrstice", + "dxDataGrid-exportAll": "Izvozi vse podatke", + "dxDataGrid-headerFilterEmptyValue": "(Prazno)", + "dxDataGrid-headerFilterOK": "V redu", + "dxDataGrid-headerFilterCancel": "Prekliči", + "dxDataGrid-ariaColumn": "Stolpec", + "dxDataGrid-ariaValue": "Vrednost", + "dxDataGrid-ariaFilterCell": "Filtriraj po celici", + "dxDataGrid-ariaCollapse": "Skrči", + "dxDataGrid-ariaExpand": "Razširi", + "dxDataGrid-ariaDataGrid": "Tabela", + "dxDataGrid-ariaSearchInGrid": "Išči v tabeli", + "dxDataGrid-ariaSelectAll": "Izberi vse", + "dxDataGrid-ariaSelectRow": "Izberi vrstico", + "dxDataGrid-filterBuilderPopupTitle": "Graditelj filtra", + "dxDataGrid-filterPanelCreateFilter": "Ustvari filter", + "dxDataGrid-filterPanelClearFilter": "Pobriši", + "dxDataGrid-filterPanelFilterEnabledHint": "Omogoči filtriranje", + + "dxTreeList-ariaTreeList": "Drevesni seznam", + "dxTreeList-editingAddRowToNode": "Dodaj", + + "dxPager-infoText": "Stran {0} od {1} ({2} zapisov)", + "dxPager-pagesCountText": "od", + "dxPager-pageSizesAllText": "Vse", + "dxPivotGrid-grandTotal": "Skupna vsota", + "dxPivotGrid-total": "{0} skupaj", + "dxPivotGrid-fieldChooserTitle": "Izbirnik polj", + "dxPivotGrid-showFieldChooser": "Prikaži izbirnik polj", + "dxPivotGrid-expandAll": "Razširi vse", + "dxPivotGrid-collapseAll": "Skrči vse", + "dxPivotGrid-sortColumnBySummary": "Razvrsti \"{0}\" po tem stolpcu", + "dxPivotGrid-sortRowBySummary": "Razvrsti \"{0}\" po tej vrstici", + "dxPivotGrid-removeAllSorting": "Brez razvrščanja", + "dxPivotGrid-dataNotAvailable": "Ni na voljo", + "dxPivotGrid-rowFields": "Vrstice", + "dxPivotGrid-columnFields": "Stolpci", + "dxPivotGrid-dataFields": "Podatki", + "dxPivotGrid-filterFields": "Filtri", + "dxPivotGrid-allFields": "Vsa polja", + "dxPivotGrid-columnFieldArea": "Povleci stolpce tukaj", + "dxPivotGrid-dataFieldArea": "Povleci podatke tukaj", + "dxPivotGrid-rowFieldArea": "Povleci vrstice tukaj", + "dxPivotGrid-filterFieldArea": "Povleci filtre tukaj", + + "dxScheduler-editorLabelTitle": "Predmet", + "dxScheduler-editorLabelStartDate": "Datum začetka", + "dxScheduler-editorLabelEndDate": "Datum konca", + "dxScheduler-editorLabelDescription": "Opis", + "dxScheduler-editorLabelRecurrence": "Ponovi", + + "dxScheduler-openAppointment": "Odpri dogodek", + + "dxScheduler-recurrenceNever": "Nikoli", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Dnevno", + "dxScheduler-recurrenceWeekly": "Tedensko", + "dxScheduler-recurrenceMonthly": "Mesečno", + "dxScheduler-recurrenceYearly": "Letno", + + "dxScheduler-recurrenceRepeatEvery": "Ponovi vsak", + "dxScheduler-recurrenceRepeatOn": "Ponovi na", + "dxScheduler-recurrenceEnd": "Zaključi ponavljanje", + "dxScheduler-recurrenceAfter": "Po", + "dxScheduler-recurrenceOn": "Vklopljeno", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "dan/dni", + "dxScheduler-recurrenceRepeatWeekly": "teden/tednov", + "dxScheduler-recurrenceRepeatMonthly": "mesec/mesecev", + "dxScheduler-recurrenceRepeatYearly": "let", + + "dxScheduler-switcherDay": "Dan", + "dxScheduler-switcherWeek": "Teden", + "dxScheduler-switcherWorkWeek": "Delovni teden", + "dxScheduler-switcherMonth": "Mesec", + + "dxScheduler-switcherAgenda": "Urnik", + + "dxScheduler-switcherTimelineDay": "Dnevna časovnica", + "dxScheduler-switcherTimelineWeek": "Tedenska časovnica", + "dxScheduler-switcherTimelineWorkWeek": "Časovnica delovnega tedna", + "dxScheduler-switcherTimelineMonth": "Mesečna časovnica", + + "dxScheduler-recurrenceRepeatOnDate": "na dan", + "dxScheduler-recurrenceRepeatCount": "pojavitev", + "dxScheduler-allDay": "Ves dan", + + "dxScheduler-confirmRecurrenceEditMessage": "Želite urediti samo ta dogodek ali tudi nadaljne ponovitve?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Želite izbrisati samo izbrani dogodek ali tudi nadaljne ponovitve?", + + "dxScheduler-confirmRecurrenceEditSeries": "Uredi niz dogodkov", + "dxScheduler-confirmRecurrenceDeleteSeries": "Izbriši niz dogodkov", + "dxScheduler-confirmRecurrenceEditOccurrence": "Uredi dogodek", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Izbriši dogodek", + + "dxScheduler-noTimezoneTitle": "Brez časovnega pasa", + "dxScheduler-moreAppointments": "še {0}", + + "dxCalendar-todayButtonText": "Danes", + "dxCalendar-ariaWidgetName": "Koledar", + + "dxColorView-ariaRed": "Rdeča", + "dxColorView-ariaGreen": "Zelena", + "dxColorView-ariaBlue": "Modra", + "dxColorView-ariaAlpha": "Prosojno", + "dxColorView-ariaHex": "Koda barve (hex)", + + "dxTagBox-selected": "{0} izbranih", + "dxTagBox-allSelected": "Vsi izbrani ({0})", + "dxTagBox-moreSelected": "še {0}", + + "vizExport-printingButtonText": "Natisni", + "vizExport-titleMenuText": "Izvozi/Natisni", + "vizExport-exportButtonText": "{0} datoteka", + + "dxFilterBuilder-and": "In", + "dxFilterBuilder-or": "Ali", + "dxFilterBuilder-notAnd": "In ne", + "dxFilterBuilder-notOr": "Ali ne", + "dxFilterBuilder-addCondition": "Dodaj pogoj", + "dxFilterBuilder-addGroup": "Dodaj skupino", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Enako", + "dxFilterBuilder-filterOperationNotEquals": "Ni enako", + "dxFilterBuilder-filterOperationLess": "Je manj kot", + "dxFilterBuilder-filterOperationLessOrEquals": "Je manj ali enako kot", + "dxFilterBuilder-filterOperationGreater": "Je večje kot", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Je večje ali enako kot", + "dxFilterBuilder-filterOperationStartsWith": "Se začne z", + "dxFilterBuilder-filterOperationContains": "Vsebuje", + "dxFilterBuilder-filterOperationNotContains": "Ne vsebuje", + "dxFilterBuilder-filterOperationEndsWith": "Se konča z", + "dxFilterBuilder-filterOperationIsBlank": "Je prazno", + "dxFilterBuilder-filterOperationIsNotBlank": "Ni prazno", + "dxFilterBuilder-filterOperationBetween": "Je med", + "dxFilterBuilder-filterOperationAnyOf": "Je karkoli izmed", + "dxFilterBuilder-filterOperationNoneOf": "Ni nič izmed", + + "dxHtmlEditor-dialogColorCaption": "Zamenjaj barvo pisave", + "dxHtmlEditor-dialogBackgroundCaption": "Zamenjaj barvo ozadja", + "dxHtmlEditor-dialogLinkCaption": "Dodaj povezavo", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Tekst", + "dxHtmlEditor-dialogLinkTargetField": "Odpri povezvo v novem oknu", + "dxHtmlEditor-dialogImageCaption": "Dodaj sliko", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Dodatno besedilo", + "dxHtmlEditor-dialogImageWidthField": "Širina (px)", + "dxHtmlEditor-dialogImageHeightField": "Višina (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Naslov", + "dxHtmlEditor-normalText": "Običajno besedilo", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "Neimenovana mapa", + "dxFileManager-errorNoAccess": "Dostop zavrnjen. Operacija ne more biti končana.", + "dxFileManager-errorDirectoryExistsFormat": "Mapa '{0}' že obstaja.", + "dxFileManager-errorFileExistsFormat": "Datoteka '{0}' že obstaja.", + "dxFileManager-errorFileNotFoundFormat": "Datoteka '{0}' ni bila najdena", + "dxFileManager-errorDefault": "Neznana napaka.", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Razvrsti naraščajoče", + "dxGantt-sortingDescendingText": "Razvrsti padajoče", + "dxGantt-sortingClearText": "Brez razvrščanja", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sv.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sv.json new file mode 100644 index 0000000000000000000000000000000000000000..5d44b29be3eac917815733b5346fe9fa58e086d8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/sv.json @@ -0,0 +1,554 @@ +{ + "sv": { + "Yes": "Ja", + "No": "Nej", + "Cancel": "Avbryt", + "Clear": "Rensa", + "Done": "Klar", + "Loading": "Laddar...", + "Select": "Välj...", + "Search": "Sök", + "Back": "Tillbaka", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Inget data att visa", + + "dxDropDownEditor-selectLabel": "Välj", + + "validation-required": "Krävs", + "validation-required-formatted": "{0} krävs", + "validation-numeric": "Värdet måste vara ett nummer", + "validation-numeric-formatted": "{0} måste vara ett nummer", + "validation-range": "Värdet utanför tillåtet intervall", + "validation-range-formatted": "{0} utanför tillåtet intervall", + "validation-stringLength": "Längden på värdet är inte korrekt", + "validation-stringLength-formatted": "Längden på {0} är inte korrekt", + "validation-custom": "Ogiltigt värde", + "validation-custom-formatted": "{0} är ogiltigt", + "validation-async": "Ogiltigt värde", + "validation-async-formatted": "{0} är ogiltigt", + "validation-compare": "Värdena matchar inte", + "validation-compare-formatted": "{0} matchar inte", + "validation-pattern": "Värdet matchar inte mönster", + "validation-pattern-formatted": "{0} matchar inte mönster", + "validation-email": "E-post är ogiltigt", + "validation-email-formatted": "{0} är ogiltigt", + "validation-mask": "Värdet är ogiltigt", + + "dxLookup-searchPlaceholder": "Minsta antal tecken: {0}", + + "dxList-pullingDownText": "Dra neråt för att uppdatera...", + "dxList-pulledDownText": "Släpp för att uppdatera...", + "dxList-refreshingText": "Uppdaterar...", + "dxList-pageLoadingText": "Laddar...", + "dxList-nextButtonText": "Mer", + "dxList-selectAll": "Välj alla", + "dxListEditDecorator-delete": "Radera", + "dxListEditDecorator-more": "Mer", + + "dxScrollView-pullingDownText": "Dra neråt för att uppdatera...", + "dxScrollView-pulledDownText": "Släpp för att uppdatera...", + "dxScrollView-refreshingText": "uppdaterar...", + "dxScrollView-reachBottomText": "Laddar...", + + "dxDateBox-simulatedDataPickerTitleTime": "Välj tid", + "dxDateBox-simulatedDataPickerTitleDate": "Välj datum", + "dxDateBox-simulatedDataPickerTitleDateTime": "Välj datum och tid", + "dxDateBox-validation-datetime": "Värdet måste vara ett datum eller en tid", + + "dxFileUploader-selectFile": "Välj fil", + "dxFileUploader-dropFile": "eller släpp filen här", + "dxFileUploader-bytes": "byte", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Ladda upp", + "dxFileUploader-uploaded": "Uppladdad", + "dxFileUploader-readyToUpload": "Klar att ladda upp", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Uppladdning misslyckades", + "dxFileUploader-invalidFileExtension": "", + "dxFileUploader-invalidMaxFileSize": "", + "dxFileUploader-invalidMinFileSize": "", + + "dxRangeSlider-ariaFrom": "Från", + "dxRangeSlider-ariaTill": "Till", + "dxSwitch-switchedOnText": "PÅ", + "dxSwitch-switchedOffText": "AV", + + "dxForm-optionalMark": "valfri", + "dxForm-requiredMessage": "{0} är nödvändigt", + + "dxNumberBox-invalidValueMessage": "Värdet måste vara ett nummer", + "dxNumberBox-noDataText": "Inget data", + + "dxDataGrid-columnChooserTitle": "Kolumnväljare", + "dxDataGrid-columnChooserEmptyText": "Dra en kolumn hit för att dölja den", + "dxDataGrid-groupContinuesMessage": "Fortsätter på nästa sida", + "dxDataGrid-groupContinuedMessage": "Fortsättning från föregående sida", + "dxDataGrid-groupHeaderText": "Gruppera enligt denna kolumn", + "dxDataGrid-ungroupHeaderText": "Avgruppera", + "dxDataGrid-ungroupAllText": "Avgruppera allt", + "dxDataGrid-editingEditRow": "Redigera", + "dxDataGrid-editingSaveRowChanges": "Spara", + "dxDataGrid-editingCancelRowChanges": "Avbryt", + "dxDataGrid-editingDeleteRow": "Radera", + "dxDataGrid-editingUndeleteRow": "Ångra radering", + "dxDataGrid-editingConfirmDeleteMessage": "Är du säker på att du vill radera denna post?", + "dxDataGrid-validationCancelChanges": "Avbryt ändringarna", + "dxDataGrid-groupPanelEmptyText": "Dra en kolumnrubrik hit för att gruppera enligt den kolumnen", + "dxDataGrid-noDataText": "Inget data", + "dxDataGrid-searchPanelPlaceholder": "Sök...", + "dxDataGrid-filterRowShowAllText": "(Allt)", + "dxDataGrid-filterRowResetOperationText": "Återställ", + "dxDataGrid-filterRowOperationEquals": "Är lika med", + "dxDataGrid-filterRowOperationNotEquals": "Är olika", + "dxDataGrid-filterRowOperationLess": "Mindre än", + "dxDataGrid-filterRowOperationLessOrEquals": "Mindre än eller lika med", + "dxDataGrid-filterRowOperationGreater": "Större än", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Större än eller lika med", + "dxDataGrid-filterRowOperationStartsWith": "Börjar med", + "dxDataGrid-filterRowOperationContains": "Innehåller", + "dxDataGrid-filterRowOperationNotContains": "Innehåller inte", + "dxDataGrid-filterRowOperationEndsWith": "Slutar med", + "dxDataGrid-filterRowOperationBetween": "Mellan", + "dxDataGrid-filterRowOperationBetweenStartText": "Start", + "dxDataGrid-filterRowOperationBetweenEndText": "Slut", + "dxDataGrid-applyFilterText": "Använd filter", + "dxDataGrid-trueText": "sant", + "dxDataGrid-falseText": "falskt", + "dxDataGrid-sortingAscendingText": "Sortera stigande", + "dxDataGrid-sortingDescendingText": "Sortera fallande", + "dxDataGrid-sortingClearText": "Rensa sortering", + "dxDataGrid-editingSaveAllChanges": "Spara ändringar", + "dxDataGrid-editingCancelAllChanges": "Ångra ändringar", + "dxDataGrid-editingAddRow": "Lägg till rad", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "Minimi av {1} är {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Maximi av {1} är {0}", + "dxDataGrid-summaryAvg": "Medel: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Medeltal av {1} är {0}", + "dxDataGrid-summarySum": "Sum: {0}", + "dxDataGrid-summarySumOtherColumn": "Summan av {1} är {0}", + "dxDataGrid-summaryCount": "Antal: {0}", + "dxDataGrid-columnFixingFix": "Fixera", + "dxDataGrid-columnFixingUnfix": "Avfixera", + "dxDataGrid-columnFixingLeftPosition": "Till vänster", + "dxDataGrid-columnFixingRightPosition": "Till höger", + "dxDataGrid-exportTo": "Exportera", + "dxDataGrid-exportToExcel": "Exportera till Excel fil", + "dxDataGrid-exporting": "Exportera...", + "dxDataGrid-excelFormat": "Excel fil", + "dxDataGrid-selectedRows": "Valda rader", + "dxDataGrid-exportSelectedRows": "Exportera valda rader", + "dxDataGrid-exportAll": "Exportera allt", + "dxDataGrid-headerFilterEmptyValue": "(Tomma)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Avbryt", + "dxDataGrid-ariaColumn": "Kolumn", + "dxDataGrid-ariaValue": "Värde", + "dxDataGrid-ariaFilterCell": "Filtrera cell", + "dxDataGrid-ariaCollapse": "Kollapsa", + "dxDataGrid-ariaExpand": "Expandera", + "dxDataGrid-ariaDataGrid": "Datarutnät", + "dxDataGrid-ariaSearchInGrid": "Sök i datarutnätet", + "dxDataGrid-ariaSelectAll": "Välj allt", + "dxDataGrid-ariaSelectRow": "Välj rad", + "dxDataGrid-filterBuilderPopupTitle": "Filterverktyg", + "dxDataGrid-filterPanelCreateFilter": "Skapa filter", + "dxDataGrid-filterPanelClearFilter": "Rensa", + "dxDataGrid-filterPanelFilterEnabledHint": "Aktivera filter", + + "dxTreeList-ariaTreeList": "Trädlista", + "dxTreeList-editingAddRowToNode": "Lägg till", + + "dxPager-infoText": "Sida {0} av {1} ({2} uppgifter)", + "dxPager-pagesCountText": "av", + "dxPager-pageSizesAllText": "Allt", + "dxPivotGrid-grandTotal": "Totalsumma", + "dxPivotGrid-total": "{0} Summa", + "dxPivotGrid-fieldChooserTitle": "Fältväljare", + "dxPivotGrid-showFieldChooser": "Visa fältväljare", + "dxPivotGrid-expandAll": "Expandera alla", + "dxPivotGrid-collapseAll": "Kollapsa alla", + "dxPivotGrid-sortColumnBySummary": "Sortera \"{0}\" enligt denna kolumn", + "dxPivotGrid-sortRowBySummary": "Sortera \"{0}\" enligt denna rad", + "dxPivotGrid-removeAllSorting": "Avlägsna all sortering", + "dxPivotGrid-dataNotAvailable": "Saknas", + "dxPivotGrid-rowFields": "Radfält", + "dxPivotGrid-columnFields": "Kolumnfält", + "dxPivotGrid-dataFields": "Datafält", + "dxPivotGrid-filterFields": "Filterfält", + "dxPivotGrid-allFields": "Alla fält", + "dxPivotGrid-columnFieldArea": "Släpp kolumnfält här", + "dxPivotGrid-dataFieldArea": "Släpp datafält här", + "dxPivotGrid-rowFieldArea": "Släpp radfält här", + "dxPivotGrid-filterFieldArea": "Släpp filterfält här", + + "dxScheduler-editorLabelTitle": "Ämne", + "dxScheduler-editorLabelStartDate": "Startdatum", + "dxScheduler-editorLabelEndDate": "Slutdatum", + "dxScheduler-editorLabelDescription": "Beskrivning", + "dxScheduler-editorLabelRecurrence": "Upprepa", + + "dxScheduler-openAppointment": "Öppna avtalad tid", + + "dxScheduler-recurrenceNever": "Aldrig", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Varje dag", + "dxScheduler-recurrenceWeekly": "Varje vecka", + "dxScheduler-recurrenceMonthly": "Varje månad", + "dxScheduler-recurrenceYearly": "Varje år", + + "dxScheduler-recurrenceRepeatEvery": "Varje", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "Upprepning slutar", + "dxScheduler-recurrenceAfter": "Efter", + "dxScheduler-recurrenceOn": "På", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "dagar", + "dxScheduler-recurrenceRepeatWeekly": "veckor", + "dxScheduler-recurrenceRepeatMonthly": "månader", + "dxScheduler-recurrenceRepeatYearly": "år", + + "dxScheduler-switcherDay": "Dag", + "dxScheduler-switcherWeek": "Vecka", + "dxScheduler-switcherWorkWeek": "Arbetsvecka", + "dxScheduler-switcherMonth": "Månad", + + "dxScheduler-switcherAgenda": "Agenda", + + "dxScheduler-switcherTimelineDay": "Tidslinje dag", + "dxScheduler-switcherTimelineWeek": "Tidslinje vecka", + "dxScheduler-switcherTimelineWorkWeek": "Tidslinje arbetsvecka", + "dxScheduler-switcherTimelineMonth": "Tidslinje månad", + + "dxScheduler-recurrenceRepeatOnDate": "på datumet", + "dxScheduler-recurrenceRepeatCount": "upprepning(ar)", + "dxScheduler-allDay": "Hela dagen", + + "dxScheduler-confirmRecurrenceEditMessage": "Vill du redigera bara denna avtalade tid eller hela serien?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Vill du radera bara denna avtalade tid eller hela serien?", + + "dxScheduler-confirmRecurrenceEditSeries": "Redigera serien", + "dxScheduler-confirmRecurrenceDeleteSeries": "Radera serien", + "dxScheduler-confirmRecurrenceEditOccurrence": "Redigera avtalad tid", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Radera avtalad tid", + + "dxScheduler-noTimezoneTitle": "Ingen tidszon", + "dxScheduler-moreAppointments": "{0} mer", + + "dxCalendar-todayButtonText": "I dag", + "dxCalendar-ariaWidgetName": "Kalender", + + "dxColorView-ariaRed": "Röd", + "dxColorView-ariaGreen": "Grön", + "dxColorView-ariaBlue": "Blå", + "dxColorView-ariaAlpha": "Transparens", + "dxColorView-ariaHex": "Färgkod", + + "dxTagBox-selected": "{0} valda", + "dxTagBox-allSelected": "Alla valda ({0})", + "dxTagBox-moreSelected": "{0} mer", + + "vizExport-printingButtonText": "Skriv ut", + "vizExport-titleMenuText": "Export/Utskrift", + "vizExport-exportButtonText": "{0} fil", + + "dxFilterBuilder-and": "Och", + "dxFilterBuilder-or": "Eller", + "dxFilterBuilder-notAnd": "Inte och", + "dxFilterBuilder-notOr": "Inte eller", + "dxFilterBuilder-addCondition": "Lägg till villkor", + "dxFilterBuilder-addGroup": "Lägg till grupp", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Är lika med", + "dxFilterBuilder-filterOperationNotEquals": "Är olika", + "dxFilterBuilder-filterOperationLess": "Mindre än", + "dxFilterBuilder-filterOperationLessOrEquals": "Mindre än eller lika med", + "dxFilterBuilder-filterOperationGreater": "Större än", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Större än eller lika med", + "dxFilterBuilder-filterOperationStartsWith": "Börjar med", + "dxFilterBuilder-filterOperationContains": "Innehåller", + "dxFilterBuilder-filterOperationNotContains": "Innehåller inte", + "dxFilterBuilder-filterOperationEndsWith": "Slutar med", + "dxFilterBuilder-filterOperationIsBlank": "Är tom", + "dxFilterBuilder-filterOperationIsNotBlank": "Är inte tom", + "dxFilterBuilder-filterOperationBetween": "Mellan", + "dxFilterBuilder-filterOperationAnyOf": "Någon av", + "dxFilterBuilder-filterOperationNoneOf": "Ingen av", + + "dxHtmlEditor-dialogColorCaption": "!TODO!", + "dxHtmlEditor-dialogBackgroundCaption": "!TODO!", + "dxHtmlEditor-dialogLinkCaption": "!TODO!", + "dxHtmlEditor-dialogLinkUrlField": "!TODO!", + "dxHtmlEditor-dialogLinkTextField": "!TODO!", + "dxHtmlEditor-dialogLinkTargetField": "!TODO!", + "dxHtmlEditor-dialogImageCaption": "!TODO!", + "dxHtmlEditor-dialogImageUrlField": "!TODO!", + "dxHtmlEditor-dialogImageAltField": "!TODO!", + "dxHtmlEditor-dialogImageWidthField": "!TODO!", + "dxHtmlEditor-dialogImageHeightField": "!TODO!", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "!TODO!", + "dxHtmlEditor-normalText": "!TODO!", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/tr.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/tr.json new file mode 100644 index 0000000000000000000000000000000000000000..0899a3a045a06fb49d76a7e8d61160d71f882b92 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/tr.json @@ -0,0 +1,516 @@ +{ + "tr": { + "Yes": "Evet", + "No": "Hayır", + "Cancel": "İptal", + "Clear": "Temizle", + "Done": "Tamam", + "Loading": "Yükleniyor...", + "Select": "Seç...", + "Search": "Ara", + "Back": "Geri", + "OK": "Tamam", + "dxCollectionWidget-noDataText": "Gösterilecek bilgi yok", + "validation-required": "Zorunlu", + "validation-required-formatted": "{0} gerekli", + "validation-numeric": "Değer bir sayı olmalı", + "validation-numeric-formatted": "{0} bir sayı olmalı", + "validation-range": "Değer aralık dışında", + "validation-range-formatted": "{0} aralık dışında", + "validation-stringLength": "Değerin uzunluğu doğru değil", + "validation-stringLength-formatted": "{0} uzunluğu doğru değil", + "validation-custom": "Değer geçersiz", + "validation-custom-formatted": "{0} geçersiz", + "validation-compare": "Değerler eşleşmiyor", + "validation-compare-formatted": "{0} eşleşmiyor", + "validation-pattern": "Değer kalıpla eşleşmiyor", + "validation-pattern-formatted": "{0} kalıpla eşleşmiyor", + "validation-email": "E-posta geçersiz", + "validation-email-formatted": "{0} geçersiz", + "validation-mask": "Değer geçersiz", + "dxLookup-searchPlaceholder": "Minimum karakter sayısı: {0}", + "dxList-pullingDownText": "Yenilemek için aşağıya çekin...", + "dxList-pulledDownText": "Yenilemek için bırakın...", + "dxList-refreshingText": "Yenileniyor...", + "dxList-pageLoadingText": "Yükleniyor...", + "dxList-nextButtonText": "Daha", + "dxList-selectAll": "Tümünü Seç", + "dxListEditDecorator-delete": "Sil", + "dxListEditDecorator-more": "Daha", + "dxScrollView-pullingDownText": "Yenilemek için aşağıya çekin...", + "dxScrollView-pulledDownText": "Yenilemek için bırakın...", + "dxScrollView-refreshingText": "Yenileniyor...", + "dxScrollView-reachBottomText": "Yükleniyor...", + "dxDateBox-simulatedDataPickerTitleTime": "Saat seç", + "dxDateBox-simulatedDataPickerTitleDate": "Tarih seç", + "dxDateBox-simulatedDataPickerTitleDateTime": "Tarih ve saati seçin", + "dxDateBox-validation-datetime": "Değer bir tarih veya saat olmalıdır", + "dxFileUploader-selectFile": "Dosya seç", + "dxFileUploader-dropFile": "veya Dosyayı buraya bırakın", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Yükleme", + "dxFileUploader-uploaded": "Yüklenen", + "dxFileUploader-readyToUpload": "Yüklemeye hazır", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Yükleme başarısız", + "dxFileUploader-invalidFileExtension": "Dosya türüne izin verilmiyor", + "dxFileUploader-invalidMaxFileSize": "Dosya çok büyük", + "dxFileUploader-invalidMinFileSize": "Dosya çok küçük", + "dxRangeSlider-ariaFrom": "İtibaren", + "dxRangeSlider-ariaTill": "Kadar", + "dxSwitch-switchedOnText": "Açık", + "dxSwitch-switchedOffText": "Kapalı", + "dxForm-optionalMark": "isteğe bağlı", + "dxForm-requiredMessage": "{0} gerekli", + "dxNumberBox-invalidValueMessage": "Değer bir sayı olmalı", + "dxNumberBox-noDataText": "Veri yok", + "dxDataGrid-columnChooserTitle": "Sütun Seçici", + "dxDataGrid-columnChooserEmptyText": "Sütunu gizlemek için buraya sürükleyin", + "dxDataGrid-groupContinuesMessage": "Bir sonraki sayfada devam ediyor", + "dxDataGrid-groupContinuedMessage": "Önceki sayfadan devam", + "dxDataGrid-groupHeaderText": "Bu Sütuna Göre Grupla", + "dxDataGrid-ungroupHeaderText": "Grubu Kaldır", + "dxDataGrid-ungroupAllText": "Tüm Grupları Kaldır", + "dxDataGrid-editingEditRow": "Düzenle", + "dxDataGrid-editingSaveRowChanges": "Kaydet", + "dxDataGrid-editingCancelRowChanges": "İptal", + "dxDataGrid-editingDeleteRow": "Sil", + "dxDataGrid-editingUndeleteRow": "Silme", + "dxDataGrid-editingConfirmDeleteMessage": "Bu kaydı silmek istediğinize emin misiniz?", + "dxDataGrid-validationCancelChanges": "Değişiklikleri iptal et", + "dxDataGrid-groupPanelEmptyText": "Bu sütuna göre gruplamak için bir sütun başlığını buraya sürükleyin", + "dxDataGrid-noDataText": "Veri yok", + "dxDataGrid-searchPanelPlaceholder": "Arama...", + "dxDataGrid-filterRowShowAllText": "(Tümü)", + "dxDataGrid-filterRowResetOperationText": "Sıfırla", + "dxDataGrid-filterRowOperationEquals": "Eşittir", + "dxDataGrid-filterRowOperationNotEquals": "Eşit değil", + "dxDataGrid-filterRowOperationLess": "Daha küçük", + "dxDataGrid-filterRowOperationLessOrEquals": "Daha küçük veya eşit", + "dxDataGrid-filterRowOperationGreater": "Daha büyük", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Daha büyük veya eşit", + "dxDataGrid-filterRowOperationStartsWith": "İle başlar", + "dxDataGrid-filterRowOperationContains": "İçeren", + "dxDataGrid-filterRowOperationNotContains": "İçermeyen", + "dxDataGrid-filterRowOperationEndsWith": "İle biten", + "dxDataGrid-filterRowOperationBetween": "Arasında", + "dxDataGrid-filterRowOperationBetweenStartText": "Başla", + "dxDataGrid-filterRowOperationBetweenEndText": "Bitiş", + "dxDataGrid-applyFilterText": "Filtre uygula", + "dxDataGrid-trueText": "evet", + "dxDataGrid-falseText": "hayır", + "dxDataGrid-sortingAscendingText": "Artan Sıralama", + "dxDataGrid-sortingDescendingText": "Azalan Sıralama", + "dxDataGrid-sortingClearText": "Sıralamayı Temizle", + "dxDataGrid-editingSaveAllChanges": "Değişiklikleri Kaydet", + "dxDataGrid-editingCancelAllChanges": "Değişiklikleri iptal et", + "dxDataGrid-editingAddRow": "Satır ekle", + "dxDataGrid-summaryMin": "Min: {0}", + "dxDataGrid-summaryMinOtherColumn": "{1} min: {0}", + "dxDataGrid-summaryMax": "Max: {0}", + "dxDataGrid-summaryMaxOtherColumn": "{1} max: {0}", + "dxDataGrid-summaryAvg": "Ort: {0}", + "dxDataGrid-summaryAvgOtherColumn": "{1} ortalaması: {0}", + "dxDataGrid-summarySum": "Top: {0}", + "dxDataGrid-summarySumOtherColumn": "{1} toplamı: {0}", + "dxDataGrid-summaryCount": "Toplam: {0}", + "dxDataGrid-columnFixingFix": "Sabitle", + "dxDataGrid-columnFixingUnfix": "Çöz", + "dxDataGrid-columnFixingLeftPosition": "Sola", + "dxDataGrid-columnFixingRightPosition": "Sağa", + "dxDataGrid-exportTo": "Dışa aktar", + "dxDataGrid-exportToExcel": "Excel dosyasına aktar", + "dxDataGrid-exporting": "Dışa Aktar...", + "dxDataGrid-excelFormat": "Excel dosyası", + "dxDataGrid-selectedRows": "Seçili satırlar", + "dxDataGrid-exportSelectedRows": "Seçili satırları aktar", + "dxDataGrid-exportAll": "Tüm verileri dışa aktar", + "dxDataGrid-headerFilterEmptyValue": "(Blanks)", + "dxDataGrid-headerFilterOK": "Tamam", + "dxDataGrid-headerFilterCancel": "İptal", + "dxDataGrid-ariaColumn": "Sütun", + "dxDataGrid-ariaValue": "Veri", + "dxDataGrid-ariaFilterCell": "Filtre hücresi", + "dxDataGrid-ariaCollapse": "Daralt", + "dxDataGrid-ariaExpand": "Genişlet", + "dxDataGrid-ariaDataGrid": "Tablo", + "dxDataGrid-ariaSearchInGrid": "Tabloda ara", + "dxDataGrid-ariaSelectAll": "Hepsini seç", + "dxDataGrid-ariaSelectRow": "Satırı seç", + "dxDataGrid-filterBuilderPopupTitle": "Filtre Oluşturucu", + "dxDataGrid-filterPanelCreateFilter": "Filtre Oluştur", + "dxDataGrid-filterPanelClearFilter": "Temizle", + "dxDataGrid-filterPanelFilterEnabledHint": "Filtreyi etkinleştir", + "dxTreeList-ariaTreeList": "Ağaç listesi", + "dxTreeList-editingAddRowToNode": "Ekle", + "dxPager-infoText": "Sayfa {0} / {1} ({2} veri)", + "dxPager-pagesCountText": "arasında", + "dxPager-pageSizesAllText": "Tümü", + "dxPivotGrid-grandTotal": "Genel Toplam", + "dxPivotGrid-total": "{0} Toplam", + "dxPivotGrid-fieldChooserTitle": "Alan Seçici", + "dxPivotGrid-showFieldChooser": "Alan Seçiciyi Göster", + "dxPivotGrid-expandAll": "Tümünü Genişlet", + "dxPivotGrid-collapseAll": "Tümünü Daralt", + "dxPivotGrid-sortColumnBySummary": "\"{0}\" Bu Sütuna Göre Sırala", + "dxPivotGrid-sortRowBySummary": "\"{0}\" Bu Satıra Göre Sırala", + "dxPivotGrid-removeAllSorting": "Tüm Sıralamaları Kaldır", + "dxPivotGrid-dataNotAvailable": "N/A", + "dxPivotGrid-rowFields": "Satır Alanları", + "dxPivotGrid-columnFields": "Sütun Alanları", + "dxPivotGrid-dataFields": "Veri Alanları", + "dxPivotGrid-filterFields": "Filtre Alanları", + "dxPivotGrid-allFields": "Tüm Alanlar", + "dxPivotGrid-columnFieldArea": "Sütun Alanlarını Buraya Bırak", + "dxPivotGrid-dataFieldArea": "Veri Alanlarını Buraya Bırak", + "dxPivotGrid-rowFieldArea": "Satır Alanlarını Buraya Bırak", + "dxPivotGrid-filterFieldArea": "Filtre Alanlarını Buraya Bırak", + "dxScheduler-editorLabelTitle": "Konu", + "dxScheduler-editorLabelStartDate": "Başlangıç Tarihi", + "dxScheduler-editorLabelEndDate": "Bitiş Tarihi", + "dxScheduler-editorLabelDescription": "Açıklama", + "dxScheduler-editorLabelRecurrence": "Tekrar", + "dxScheduler-openAppointment": "Randevu Aç", + "dxScheduler-recurrenceNever": "Asla", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Günlük", + "dxScheduler-recurrenceWeekly": "Haftalık", + "dxScheduler-recurrenceMonthly": "Aylık", + "dxScheduler-recurrenceYearly": "Yıllık", + "dxScheduler-recurrenceRepeatEvery": "Her tekrarla", + "dxScheduler-recurrenceRepeatOn": "Tekrarla", + "dxScheduler-recurrenceEnd": "Tekrarı bitir", + "dxScheduler-recurrenceAfter": "Sonra", + "dxScheduler-recurrenceOn": "İle", + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "günler", + "dxScheduler-recurrenceRepeatWeekly": "haftalar", + "dxScheduler-recurrenceRepeatMonthly": "aylar", + "dxScheduler-recurrenceRepeatYearly": "yıllar", + "dxScheduler-switcherDay": "Gün", + "dxScheduler-switcherWeek": "Hafta", + "dxScheduler-switcherWorkWeek": "Çalışma Haftası", + "dxScheduler-switcherMonth": "Ay", + "dxScheduler-switcherAgenda": "Ajanda", + "dxScheduler-switcherTimelineDay": "Zaman Çizelgesi Günü", + "dxScheduler-switcherTimelineWeek": "Zaman Çizelgesi Haftası", + "dxScheduler-switcherTimelineWorkWeek": "Zaman Çizelgesi Çalışma Haftası", + "dxScheduler-switcherTimelineMonth": "TZaman Çizelgesi Çalışma Ayı", + "dxScheduler-recurrenceRepeatOnDate": "tarihinde", + "dxScheduler-recurrenceRepeatCount": "olaylar", + "dxScheduler-allDay": "Tüm gün", + "dxScheduler-confirmRecurrenceEditMessage": "Yalnızca bu randevuyu veya tüm diziyi düzenlemek ister misiniz?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Yalnızca bu randevuyu veya tüm diziyi silmek istiyor musunuz?", + "dxScheduler-confirmRecurrenceEditSeries": "Serileri düzenle", + "dxScheduler-confirmRecurrenceDeleteSeries": "Serileri sil", + "dxScheduler-confirmRecurrenceEditOccurrence": "Randevuyu düzenle", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Randevuyu sil", + "dxScheduler-noTimezoneTitle": "Saat dilimi yok", + "dxScheduler-moreAppointments": "{0} daha", + "dxCalendar-todayButtonText": "Bugün", + "dxCalendar-ariaWidgetName": "Takvim", + "dxColorView-ariaRed": "Kırmızı", + "dxColorView-ariaGreen": "Yeşil", + "dxColorView-ariaBlue": "Mavi", + "dxColorView-ariaAlpha": "Şeffaflık", + "dxColorView-ariaHex": "Renk kodu", + "dxTagBox-selected": "{0} seçili", + "dxTagBox-allSelected": "Tümü seçildi ({0})", + "dxTagBox-moreSelected": "{0} daha", + "vizExport-printingButtonText": "Yazdır", + "vizExport-titleMenuText": "Dışa Aktar/Yazdır", + "vizExport-exportButtonText": "{0} dosya", + "dxFilterBuilder-and": "Ve", + "dxFilterBuilder-or": "Veya", + "dxFilterBuilder-notAnd": "Değil Ve", + "dxFilterBuilder-notOr": "Değil Veya", + "dxFilterBuilder-addCondition": "Koşul Ekle", + "dxFilterBuilder-addGroup": "Grup Ekle", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Eşit", + "dxFilterBuilder-filterOperationNotEquals": "Eşit değil", + "dxFilterBuilder-filterOperationLess": "Daha küçük", + "dxFilterBuilder-filterOperationLessOrEquals": "Daha küçük veya eşit", + "dxFilterBuilder-filterOperationGreater": "Daha büyük", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Daha büyük veya eşit", + "dxFilterBuilder-filterOperationStartsWith": "İle başlar", + "dxFilterBuilder-filterOperationContains": "İçerir", + "dxFilterBuilder-filterOperationNotContains": "İçermez", + "dxFilterBuilder-filterOperationEndsWith": "İle biter", + "dxFilterBuilder-filterOperationIsBlank": "Boş", + "dxFilterBuilder-filterOperationIsNotBlank": "Boş değil", + "dxFilterBuilder-filterOperationBetween": "Arasında", + "dxFilterBuilder-filterOperationAnyOf": "Herhangi biri", + "dxFilterBuilder-filterOperationNoneOf": "Hiçbiri", + "dxHtmlEditor-dialogColorCaption": "Yazı Tipi Rengini Değiştir", + "dxHtmlEditor-dialogBackgroundCaption": "Arka Plan Rengini Değiştir", + "dxHtmlEditor-dialogLinkCaption": "Link Ekle", + "dxHtmlEditor-dialogLinkUrlField": "URL", + "dxHtmlEditor-dialogLinkTextField": "Metin", + "dxHtmlEditor-dialogLinkTargetField": "Linki yeni pencerede aç", + "dxHtmlEditor-dialogImageCaption": "Resim Ekle", + "dxHtmlEditor-dialogImageUrlField": "URL", + "dxHtmlEditor-dialogImageAltField": "Alternatif metin", + "dxHtmlEditor-dialogImageWidthField": "Genişlik (px)", + "dxHtmlEditor-dialogImageHeightField": "Yükseklik (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Başlık", + "dxHtmlEditor-normalText": "Normal metin", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + "dxFileManager-errorNoAccess": "Erişim reddedildi. İşlem tamamlanamıyor.", + "dxFileManager-errorDirectoryExistsFormat": "Klasör '{0}' zaten var.", + "dxFileManager-errorFileExistsFormat": "Dosya '{0}' zaten var.", + "dxFileManager-errorFileNotFoundFormat": "Dosya '{0}' bulunamadı", + "dxFileManager-errorDefault": "Belirtilmemiş hata.", + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Artan Sıralama", + "dxGantt-sortingDescendingText": "Azalan Sıralama", + "dxGantt-sortingClearText": "Sıralamayı Temizle", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/vi.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/vi.json new file mode 100644 index 0000000000000000000000000000000000000000..0133ba13fa095b30dda3b00d51edbfe157cd6361 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/vi.json @@ -0,0 +1,557 @@ +{ + "vi": { + "Yes": "Có", + "No": "Không", + "Cancel": "Hủy", + "Clear": "Làm sạch", + "Done": "Hoàn tất", + "Loading": "Đang tải...", + "Select": "Lựa chọn...", + "Search": "Tìm kiếm", + "Back": "Quay lại", + "OK": "OK", + + "dxCollectionWidget-noDataText": "Không có dữ liệu để hiển thị", + + "dxDropDownEditor-selectLabel": "Lựa chọn", + + "validation-required": "Bắt buộc", + "validation-required-formatted": "{0} là bắt buộc", + "validation-numeric": "Giá trị phải là một số", + "validation-numeric-formatted": "{0} phải là một số", + "validation-range": "Giá trị ngoài khoảng", + "validation-range-formatted": "{0} ngoài khoảng", + "validation-stringLength": "Độ dài của giá trị không đúng", + "validation-stringLength-formatted": "Độ dài của {0} không đúng", + "validation-custom": "Giá trị không hợp lệ", + "validation-custom-formatted": "{0} không hợp lệ", + "validation-async": "Giá trị không hợp lệ", + "validation-async-formatted": "{0} không hợp lệ", + "validation-compare": "Các giá trị không khớp", + "validation-compare-formatted": "{0} không khớp", + "validation-pattern": "Giá trị không khớp với khuôn mẫu", + "validation-pattern-formatted": "{0} không khớp với khuôn mẫu", + "validation-email": "Email không hợp lệ", + "validation-email-formatted": "{0} không hợp lệ", + "validation-mask": "Giá trị không hợp lệ", + + "dxLookup-searchPlaceholder": "Số ký tự tối thiểu: {0}", + + "dxList-pullingDownText": "Kéo xuống để làm tươi...", + "dxList-pulledDownText": "Nhả ra để làm tươi...", + "dxList-refreshingText": "Đang làm tươi...", + "dxList-pageLoadingText": "Đang tải...", + "dxList-nextButtonText": "Thêm", + "dxList-selectAll": "Chọn Tất cả", + "dxListEditDecorator-delete": "Xóa", + "dxListEditDecorator-more": "Thêm", + + "dxScrollView-pullingDownText": "Kéo xuống để làm tươi...", + "dxScrollView-pulledDownText": "Nhả ra để làm tươi...", + "dxScrollView-refreshingText": "Làm tươi...", + "dxScrollView-reachBottomText": "Đang tải...", + + "dxDateBox-simulatedDataPickerTitleTime": "Lựa chọn thời gian", + "dxDateBox-simulatedDataPickerTitleDate": "Lựa chọn ngày", + "dxDateBox-simulatedDataPickerTitleDateTime": "Chọn ngày và giờ", + "dxDateBox-validation-datetime": "Giá trị phải là ngày hoặc giờ", + + "dxFileUploader-selectFile": "Chọn tập tin", + "dxFileUploader-dropFile": "hoặc Thả tập tin vào đây", + "dxFileUploader-bytes": "byte", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "Upload", + "dxFileUploader-uploaded": "Đã upload", + "dxFileUploader-readyToUpload": "Sẵn sàng để upload", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "Upload thất bại", + "dxFileUploader-invalidFileExtension": "Kiểu tập tin không cho phép", + "dxFileUploader-invalidMaxFileSize": "Tập tin quá lớn", + "dxFileUploader-invalidMinFileSize": "Tập tin quá nhỏ", + + "dxRangeSlider-ariaFrom": "Từ", + "dxRangeSlider-ariaTill": "Vẫn", + "dxSwitch-switchedOnText": "ON", + "dxSwitch-switchedOffText": "OFF", + + "dxForm-optionalMark": "tùy chọn", + "dxForm-requiredMessage": "{0} là bắt buộc", + + "dxNumberBox-invalidValueMessage": "Giá trị phải là một số", + "dxNumberBox-noDataText": "Không có dữ liệu", + + "dxDataGrid-columnChooserTitle": "Trình chọn cột", + "dxDataGrid-columnChooserEmptyText": "Kéo một cột vào đây để ẩn nó đi", + "dxDataGrid-groupContinuesMessage": "Tiếp tục ở trang tiếp theo", + "dxDataGrid-groupContinuedMessage": "Được tiếp tục từ trang trước", + "dxDataGrid-groupHeaderText": "Nhóm theo Cột này", + "dxDataGrid-ungroupHeaderText": "Bỏ Nhóm", + "dxDataGrid-ungroupAllText": "Bỏ Nhóm tất cả", + "dxDataGrid-editingEditRow": "Sửa", + "dxDataGrid-editingSaveRowChanges": "Lưu", + "dxDataGrid-editingCancelRowChanges": "Hủy", + "dxDataGrid-editingDeleteRow": "Xóa", + "dxDataGrid-editingUndeleteRow": "Không xóa", + "dxDataGrid-editingConfirmDeleteMessage": "Bạn có thật sự muốn xóa bản ghi này không?", + "dxDataGrid-validationCancelChanges": "Hủy bỏ các thay đổi", + "dxDataGrid-groupPanelEmptyText": "Kéo tiêu đề một cột vào đây để để nhóm cột đó", + "dxDataGrid-noDataText": "Không có dữ liệu", + "dxDataGrid-searchPanelPlaceholder": "Tìm kiếm...", + "dxDataGrid-filterRowShowAllText": "(Tất cả)", + "dxDataGrid-filterRowResetOperationText": "Làm lại", + "dxDataGrid-filterRowOperationEquals": "Bằng", + "dxDataGrid-filterRowOperationNotEquals": "Không bằng", + "dxDataGrid-filterRowOperationLess": "Nhỏ hơn", + "dxDataGrid-filterRowOperationLessOrEquals": "Nhỏ hơn hoặc bằng", + "dxDataGrid-filterRowOperationGreater": "Lớn hơn", + "dxDataGrid-filterRowOperationGreaterOrEquals": "Lớn hơn hoặc bằng", + "dxDataGrid-filterRowOperationStartsWith": "Bắt đầu bởi", + "dxDataGrid-filterRowOperationContains": "Chứa", + "dxDataGrid-filterRowOperationNotContains": "Không chứa", + "dxDataGrid-filterRowOperationEndsWith": "Kết thúc bởi", + "dxDataGrid-filterRowOperationBetween": "Giữa", + "dxDataGrid-filterRowOperationBetweenStartText": "Bắt đầu", + "dxDataGrid-filterRowOperationBetweenEndText": "Kết thúc", + "dxDataGrid-applyFilterText": "Áp dụng bộ lọc", + "dxDataGrid-trueText": "đúng", + "dxDataGrid-falseText": "sai", + "dxDataGrid-sortingAscendingText": "Sắp xếp Tăng dần", + "dxDataGrid-sortingDescendingText": "Sắp xếp Giảm dần", + "dxDataGrid-sortingClearText": "Loại bỏ việc sắp xếp", + "dxDataGrid-editingSaveAllChanges": "Lưu lại các thay đổi", + "dxDataGrid-editingCancelAllChanges": "Loại bỏ các thay đổi", + "dxDataGrid-editingAddRow": "Thêm một hàng", + "dxDataGrid-summaryMin": "Nhỏ nhất: {0}", + "dxDataGrid-summaryMinOtherColumn": "Nhỏ nhất của {1} là {0}", + "dxDataGrid-summaryMax": "Lớn nhất: {0}", + "dxDataGrid-summaryMaxOtherColumn": "Lớn nhất của {1} là {0}", + "dxDataGrid-summaryAvg": "Trung bình: {0}", + "dxDataGrid-summaryAvgOtherColumn": "Trung bình của {1} là {0}", + "dxDataGrid-summarySum": "Tổng: {0}", + "dxDataGrid-summarySumOtherColumn": "Tổng của {1} là {0}", + "dxDataGrid-summaryCount": "Số lượng: {0}", + "dxDataGrid-columnFixingFix": "Cố định", + "dxDataGrid-columnFixingUnfix": "Không cố định", + "dxDataGrid-columnFixingLeftPosition": "Đến bên trái", + "dxDataGrid-columnFixingRightPosition": "Đến bên phải", + "dxDataGrid-exportTo": "Xuất ra", + "dxDataGrid-exportToExcel": "Xuất ra Tập tin Excel", + "dxDataGrid-exporting": "Xuất khẩu...", + "dxDataGrid-excelFormat": "Tập tin Excel", + "dxDataGrid-selectedRows": "Các hàng được chọn", + "dxDataGrid-exportSelectedRows": "Xuất ra các hàng được chọn", + "dxDataGrid-exportAll": "Xuất ra tất cả dữ liệu", + "dxDataGrid-headerFilterEmptyValue": "(Trống)", + "dxDataGrid-headerFilterOK": "OK", + "dxDataGrid-headerFilterCancel": "Hủy", + "dxDataGrid-ariaColumn": "Cột", + "dxDataGrid-ariaValue": "Giá trị", + "dxDataGrid-ariaFilterCell": "Lọc ô", + "dxDataGrid-ariaCollapse": "Thu lại", + "dxDataGrid-ariaExpand": "Mở ra", + "dxDataGrid-ariaDataGrid": "Lưới dữ liệu", + "dxDataGrid-ariaSearchInGrid": "Tìm kiếm trong lưới dữ liệu", + "dxDataGrid-ariaSelectAll": "Chọn tất cả", + "dxDataGrid-ariaSelectRow": "Chọn hàng", + "dxDataGrid-filterBuilderPopupTitle": "Trình dựng Bộ lọc", + "dxDataGrid-filterPanelCreateFilter": "Tạo Bộ lọc", + "dxDataGrid-filterPanelClearFilter": "Loại bỏ", + "dxDataGrid-filterPanelFilterEnabledHint": "Kích hoạt Bộ lọc", + + "dxTreeList-ariaTreeList": "Danh sách cây", + "dxTreeList-editingAddRowToNode": "Thêm", + + "dxPager-infoText": "Trang {0} của {1} ({2} mục)", + "dxPager-pagesCountText": "của", + "dxPager-pageSizesAllText": "Tất cả", + "dxPivotGrid-grandTotal": "Tổng tất cả", + "dxPivotGrid-total": "{0} Tổng", + "dxPivotGrid-fieldChooserTitle": "Trình lựa chọn Trường", + "dxPivotGrid-showFieldChooser": "Hiển thị Trình lựa chọn Trường", + "dxPivotGrid-expandAll": "Mở rộng tất cả", + "dxPivotGrid-collapseAll": "Thu lại tất cả", + "dxPivotGrid-sortColumnBySummary": "Sắp xếp \"{0}\" theo Cột này", + "dxPivotGrid-sortRowBySummary": "Sắp xếp \"{0}\" theo Hàng này", + "dxPivotGrid-removeAllSorting": "Loại bỏ tất cả việc sắp xếp", + "dxPivotGrid-dataNotAvailable": "Không có sẵn", + "dxPivotGrid-rowFields": "Các trường của hàng", + "dxPivotGrid-columnFields": "Các trường của cột", + "dxPivotGrid-dataFields": "Các trường Dữ liệu", + "dxPivotGrid-filterFields": "Lọc các trường", + "dxPivotGrid-allFields": "Tất cả các trường", + "dxPivotGrid-columnFieldArea": "Thả các trường của cột vào đây", + "dxPivotGrid-dataFieldArea": "Thả các trường dữ liệu vào đây", + "dxPivotGrid-rowFieldArea": "Thả các trường của hàng vào đây", + "dxPivotGrid-filterFieldArea": "Thả bộ lọc các trường vào đây", + + "dxScheduler-editorLabelTitle": "Chủ đề", + "dxScheduler-editorLabelStartDate": "Ngày bắt đầu", + "dxScheduler-editorLabelEndDate": "Ngày kết thúc", + "dxScheduler-editorLabelDescription": "Mô tả", + "dxScheduler-editorLabelRecurrence": "Lặp lại", + + "dxScheduler-openAppointment": "Mở lịch hẹn", + + "dxScheduler-recurrenceNever": "Không bao giờ", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "Hàng ngày", + "dxScheduler-recurrenceWeekly": "Hàng tuần", + "dxScheduler-recurrenceMonthly": "Hàng tháng", + "dxScheduler-recurrenceYearly": "Hàng năm", + + "dxScheduler-recurrenceRepeatEvery": "Lặp lại mãi", + "dxScheduler-recurrenceRepeatOn": "Bật chế độ Lặp lại", + "dxScheduler-recurrenceEnd": "Kết thúc việc lặp lại", + "dxScheduler-recurrenceAfter": "Sau", + "dxScheduler-recurrenceOn": "Vào", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "ngày", + "dxScheduler-recurrenceRepeatWeekly": "tuần", + "dxScheduler-recurrenceRepeatMonthly": "tháng", + "dxScheduler-recurrenceRepeatYearly": "năm", + + "dxScheduler-switcherDay": "Ngày", + "dxScheduler-switcherWeek": "Tuần", + "dxScheduler-switcherWorkWeek": "Tuần Làm việc", + "dxScheduler-switcherMonth": "Tháng", + + "dxScheduler-switcherAgenda": "Lịch trình", + + "dxScheduler-switcherTimelineDay": "Dòng thời gian Ngày", + "dxScheduler-switcherTimelineWeek": "Dòng thời gian Tuần", + "dxScheduler-switcherTimelineWorkWeek": "Dòng thời gian Tuần làm việc", + "dxScheduler-switcherTimelineMonth": "Dòng thời gian Tháng", + + "dxScheduler-recurrenceRepeatOnDate": "vào ngày", + "dxScheduler-recurrenceRepeatCount": "số lần diễn ra", + "dxScheduler-allDay": "Cả ngày", + + "dxScheduler-confirmRecurrenceEditMessage": "Bạn có muốn sửa chỉ Lịch hẹn này hoặc Toàn bộ chuỗi?", + "dxScheduler-confirmRecurrenceDeleteMessage": "Bạn có muốn xóa chỉ Lịch hẹn này hoặc Toàn bộ chuỗi?", + + "dxScheduler-confirmRecurrenceEditSeries": "Sửa chuỗi", + "dxScheduler-confirmRecurrenceDeleteSeries": "Xóa chuỗi", + "dxScheduler-confirmRecurrenceEditOccurrence": "Sửa Lịch hẹn", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "Xóa Lịch hẹn", + + "dxScheduler-noTimezoneTitle": "Không có múi giờ", + "dxScheduler-moreAppointments": "{0} thêm", + + "dxCalendar-todayButtonText": "Hôm nay", + "dxCalendar-ariaWidgetName": "Lịch", + + "dxColorView-ariaRed": "Đỏ", + "dxColorView-ariaGreen": "Xanh lá", + "dxColorView-ariaBlue": "Xanh nước biển", + "dxColorView-ariaAlpha": "Trong suốt", + "dxColorView-ariaHex": "Mã màu", + + "dxTagBox-selected": "{0} đã được chọn", + "dxTagBox-allSelected": "Tất cả đã được chọn ({0})", + "dxTagBox-moreSelected": "{0} thêm", + + "vizExport-printingButtonText": "In", + "vizExport-titleMenuText": "Xuất ra/In", + "vizExport-exportButtonText": "{0} tập tin", + + "dxFilterBuilder-and": "Và", + "dxFilterBuilder-or": "Hoặc", + "dxFilterBuilder-notAnd": "Không Và", + "dxFilterBuilder-notOr": "Không hoặc", + "dxFilterBuilder-addCondition": "Thêm Điều kiện", + "dxFilterBuilder-addGroup": "Thêm nhóm", + "dxFilterBuilder-enterValueText": "", + "dxFilterBuilder-filterOperationEquals": "Bằng", + "dxFilterBuilder-filterOperationNotEquals": "Không bằng", + "dxFilterBuilder-filterOperationLess": "Nhỏ hơn", + "dxFilterBuilder-filterOperationLessOrEquals": "Nhỏ hơn hoặc bằng", + "dxFilterBuilder-filterOperationGreater": "Là lớn hơn", + "dxFilterBuilder-filterOperationGreaterOrEquals": "Là lớn hơn hoặc bằng", + "dxFilterBuilder-filterOperationStartsWith": "Bắt đầu với", + "dxFilterBuilder-filterOperationContains": "Chứa", + "dxFilterBuilder-filterOperationNotContains": "Không chứa", + "dxFilterBuilder-filterOperationEndsWith": "Kết thúc bởi", + "dxFilterBuilder-filterOperationIsBlank": "Là trống", + "dxFilterBuilder-filterOperationIsNotBlank": "Là không trống", + "dxFilterBuilder-filterOperationBetween": "Là giữa", + "dxFilterBuilder-filterOperationAnyOf": "Là bất kỳ của", + "dxFilterBuilder-filterOperationNoneOf": "Không không có của", + + "dxHtmlEditor-dialogColorCaption": "Đổi màu phông chữ", + "dxHtmlEditor-dialogBackgroundCaption": "Đổi màu nền", + "dxHtmlEditor-dialogLinkCaption": "Thêm Liên kết", + "dxHtmlEditor-dialogLinkUrlField": "Đường dẫn", + "dxHtmlEditor-dialogLinkTextField": "Văn bản", + "dxHtmlEditor-dialogLinkTargetField": "Mở liên kết ở cửa sổ mới", + "dxHtmlEditor-dialogImageCaption": "Thêm hình ảnh", + "dxHtmlEditor-dialogImageUrlField": "Đường dẫn", + "dxHtmlEditor-dialogImageAltField": "Văn bản thay thế", + "dxHtmlEditor-dialogImageWidthField": "Rộng (px)", + "dxHtmlEditor-dialogImageHeightField": "Cao (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "Tiêu đề", + "dxHtmlEditor-normalText": "Chữ bình thường", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "Thư mục không tên", + "dxFileManager-rootDirectoryName": "Các tập tin", + "dxFileManager-errorNoAccess": "Từ chối truy cập. Thao tác không thể hoàn tất.", + "dxFileManager-errorDirectoryExistsFormat": "Thư mục '{0}' đã tồn tại.", + "dxFileManager-errorFileExistsFormat": "Tập tin '{0}' đã tồn tại.", + "dxFileManager-errorFileNotFoundFormat": "Tập tin '{0}' không tìm thấy", + "dxFileManager-errorDirectoryNotFoundFormat": "Thư mục '{0}' không tìm thấy", + "dxFileManager-errorWrongFileExtension": "Phần mở rộng của tập tin không cho phép", + "dxFileManager-errorMaxFileSizeExceeded": "Kích thước của tập tin vượt quá kích thước tối đa cho phép", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "Lỗi không xác định.", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "Chung", + "dxDiagram-categoryFlowchart": "Lưu đồ", + "dxDiagram-categoryOrgChart": "Sơ đồ tổ chức", + "dxDiagram-categoryContainers": "Trình chứa", + "dxDiagram-categoryCustom": "Tùy chỉnh", + + "dxDiagram-commandExportToSvg": "Xuất ra SVG", + "dxDiagram-commandExportToPng": "Xuất ra PNG", + "dxDiagram-commandExportToJpg": "Xuất ra JPEG", + "dxDiagram-commandUndo": "Hủy thao tác", + "dxDiagram-commandRedo": "Làm lại thao tác", + "dxDiagram-commandFontName": "Tên phông chữ", + "dxDiagram-commandFontSize": "Kích thước phông chữ", + "dxDiagram-commandBold": "Đậm", + "dxDiagram-commandItalic": "Nghiêng", + "dxDiagram-commandUnderline": "Gạch dưới", + "dxDiagram-commandTextColor": "Màu chữ", + "dxDiagram-commandLineColor": "Màu đường", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "Đổ màu", + "dxDiagram-commandAlignLeft": "Canh trái", + "dxDiagram-commandAlignCenter": "Canh giữa", + "dxDiagram-commandAlignRight": "Canh phải", + "dxDiagram-commandConnectorLineType": "Loại đường nối", + "dxDiagram-commandConnectorLineStraight": "Thẳng", + "dxDiagram-commandConnectorLineOrthogonal": "Trực giao", + "dxDiagram-commandConnectorLineStart": "Bắt đầu đường nối", + "dxDiagram-commandConnectorLineEnd": "Kết thúc đường nối", + "dxDiagram-commandConnectorLineNone": "Không", + "dxDiagram-commandConnectorLineArrow": "Mũi tên", + "dxDiagram-commandFullscreen": "Toàn màn hình", + "dxDiagram-commandUnits": "Đơn vị", + "dxDiagram-commandPageSize": "Kích thước trang", + "dxDiagram-commandPageOrientation": "Chiều của trang", + "dxDiagram-commandPageOrientationLandscape": "Trang ngang", + "dxDiagram-commandPageOrientationPortrait": "Trang dọc", + "dxDiagram-commandPageColor": "Màu trang", + "dxDiagram-commandShowGrid": "Hiển thị lưới", + "dxDiagram-commandSnapToGrid": "Neo vào lưới", + "dxDiagram-commandGridSize": "Kích thước lưới", + "dxDiagram-commandZoomLevel": "Mức phóng đại", + "dxDiagram-commandAutoZoom": "Phóng đại tự động", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "Kiểu xem đơn giản", + "dxDiagram-commandCut": "Cắt", + "dxDiagram-commandCopy": "Sao chép", + "dxDiagram-commandPaste": "Dán", + "dxDiagram-commandSelectAll": "Chọn tất cả", + "dxDiagram-commandDelete": "Xóa", + "dxDiagram-commandBringToFront": "Mang đến phía trước", + "dxDiagram-commandSendToBack": "Mang đến phía sau", + "dxDiagram-commandLock": "Khóa", + "dxDiagram-commandUnlock": "Mở khóa", + "dxDiagram-commandInsertShapeImage": "Chèn ảnh...", + "dxDiagram-commandEditShapeImage": "Đổi ảnh...", + "dxDiagram-commandDeleteShapeImage": "Xóa ảnh", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "in", + "dxDiagram-unitCm": "cm", + "dxDiagram-unitPx": "px", + + "dxDiagram-dialogButtonOK": "OK", + "dxDiagram-dialogButtonCancel": "Hủy", + "dxDiagram-dialogInsertShapeImageTitle": "Chèn ảnh", + "dxDiagram-dialogEditShapeImageTitle": "Đổi ảnh", + "dxDiagram-dialogEditShapeImageSelectButton": "Chọn ảnh", + "dxDiagram-dialogEditShapeImageLabelText": "hoặc thả tập tin vào đây", + + "dxDiagram-uiExport": "Xuất ra", + "dxDiagram-uiProperties": "Thuộc tính", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "Cây", + "dxDiagram-uiLayoutLayered": "Được xếp tầng", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "Sắp xếp Tăng dần", + "dxGantt-sortingDescendingText": "Sắp xếp Giảm dần", + "dxGantt-sortingClearText": "Loại bỏ việc sắp xếp", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh-tw.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh-tw.json new file mode 100644 index 0000000000000000000000000000000000000000..794ca6dcfd091423a2511cfcd62f0432bfee2de7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh-tw.json @@ -0,0 +1,268 @@ +{ + "zh-tw": { + "Yes": "是", + "No": "否", + "Cancel": "取消", + "Clear": "清除", + "Done": "完成", + "Loading": "正在載入...", + "Select": "選擇...", + "Search": "搜尋", + "Back": "返回", + "OK": "確定", + "dxCollectionWidget-noDataText": "沒有要顯示的資料", + "dxDropDownEditor-selectLabel": "選擇", + "validation-required": "必需", + "validation-required-formatted": "{0} 是必需的", + "validation-numeric": "值必須是一個數字", + "validation-numeric-formatted": "{0} 必須是一個數字", + "validation-range": "值超出範圍", + "validation-range-formatted": "{0} 超出範圍", + "validation-stringLength": "該值的長度不正確", + "validation-stringLength-formatted": "{0} 的長度不正確", + "validation-custom": "值無效", + "validation-custom-formatted": "{0} 值無效", + "validation-async": "值無效", + "validation-async-formatted": "{0} 值無效", + "validation-compare": "值不匹配", + "validation-compare-formatted": "{0} 不匹配", + "validation-pattern": "值不符合該模式", + "validation-pattern-formatted": "{0} 不匹配該模式", + "validation-email": "電子郵件無效", + "validation-email-formatted": "{0} 無效", + "validation-mask": "值無效", + "dxLookup-searchPlaceholder": "最小字元數: {0}", + "dxList-pullingDownText": "下拉以重新整理...", + "dxList-pulledDownText": "放開以重新整理...", + "dxList-refreshingText": "重新整理中...", + "dxList-pageLoadingText": "正在載入...", + "dxList-nextButtonText": "更多", + "dxList-selectAll": "全選", + "dxListEditDecorator-delete": "刪除", + "dxListEditDecorator-more": "更多", + "dxScrollView-pullingDownText": "下拉以重新整理...", + "dxScrollView-pulledDownText": "放開以重新整理...", + "dxScrollView-refreshingText": "重新整理中...", + "dxScrollView-reachBottomText": "正在載入...", + "dxDateBox-simulatedDataPickerTitleTime": "選擇時間", + "dxDateBox-simulatedDataPickerTitleDate": "選擇日期", + "dxDateBox-simulatedDataPickerTitleDateTime": "選擇日期和時間", + "dxDateBox-validation-datetime": "值必須是日期或時間", + "dxFileUploader-selectFile": "選擇文件", + "dxFileUploader-dropFile": "或者把文件放在此處", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "上傳", + "dxFileUploader-uploaded": "已上傳", + "dxFileUploader-readyToUpload": "準備上傳", + + "dxFileUploader-uploadFailedMessage": "上傳失敗", + "dxFileUploader-invalidFileExtension": "文件類型錯誤", + "dxFileUploader-invalidMaxFileSize": "文件過大", + "dxFileUploader-invalidMinFileSize": "文件過小", + "dxRangeSlider-ariaFrom": "從", + "dxRangeSlider-ariaTill": "至", + "dxSwitch-switchedOnText": "開", + "dxSwitch-switchedOffText": "關", + "dxForm-optionalMark": "可選", + "dxForm-requiredMessage": "{0} 是必須的", + "dxNumberBox-invalidValueMessage": "值必須是一個數字", + "dxNumberBox-noDataText": "無資料", + "dxDataGrid-columnChooserTitle": "欄選擇器", + "dxDataGrid-columnChooserEmptyText": "在這裡拖動一列隱藏它", + "dxDataGrid-groupContinuesMessage": "下一頁接續", + "dxDataGrid-groupContinuedMessage": "接續上一頁", + "dxDataGrid-groupHeaderText": "通過該欄分組", + "dxDataGrid-ungroupHeaderText": "取消分組", + "dxDataGrid-ungroupAllText": "取消所有分組", + "dxDataGrid-editingEditRow": "編輯", + "dxDataGrid-editingSaveRowChanges": "保存", + "dxDataGrid-editingCancelRowChanges": "取消", + "dxDataGrid-editingDeleteRow": "刪除", + "dxDataGrid-editingUndeleteRow": "取消刪除", + "dxDataGrid-editingConfirmDeleteMessage": "你確定要刪除這條記錄嗎?", + "dxDataGrid-validationCancelChanges": "取消更改", + "dxDataGrid-groupPanelEmptyText": "拖動欄標題至此以進行欄分組", + "dxDataGrid-noDataText": "無資料", + "dxDataGrid-searchPanelPlaceholder": "搜尋...", + "dxDataGrid-filterRowShowAllText": "(全部)", + "dxDataGrid-filterRowResetOperationText": "重置", + "dxDataGrid-filterRowOperationEquals": "等於", + "dxDataGrid-filterRowOperationNotEquals": "不等於", + "dxDataGrid-filterRowOperationLess": "小於", + "dxDataGrid-filterRowOperationLessOrEquals": "小於或等於", + "dxDataGrid-filterRowOperationGreater": "大於", + "dxDataGrid-filterRowOperationGreaterOrEquals": "大於或等於", + "dxDataGrid-filterRowOperationStartsWith": "以...開始", + "dxDataGrid-filterRowOperationContains": "包含", + "dxDataGrid-filterRowOperationNotContains": "不包含", + "dxDataGrid-filterRowOperationEndsWith": "結束於", + "dxDataGrid-filterRowOperationBetween": "之間", + "dxDataGrid-filterRowOperationBetweenStartText": "開始", + "dxDataGrid-filterRowOperationBetweenEndText": "結束", + "dxDataGrid-applyFilterText": "應用過濾器", + "dxDataGrid-trueText": "真", + "dxDataGrid-falseText": "假", + "dxDataGrid-sortingAscendingText": "遞增排序", + "dxDataGrid-sortingDescendingText": "遞減排序", + "dxDataGrid-sortingClearText": "清除排序", + "dxDataGrid-editingSaveAllChanges": "保存修改", + "dxDataGrid-editingCancelAllChanges": "放棄修改", + "dxDataGrid-editingAddRow": "添加一列", + "dxDataGrid-summaryMin": "最小值: {0}", + "dxDataGrid-summaryMinOtherColumn": "{1} 的最小值為 {0}", + "dxDataGrid-summaryMax": "最大值: {0}", + "dxDataGrid-summaryMaxOtherColumn": "{1} 的最大值為 {0}", + "dxDataGrid-summaryAvg": "平均值: {0}", + "dxDataGrid-summaryAvgOtherColumn": "{1} 的平均值為 {0}", + "dxDataGrid-summarySum": "總和: {0}", + "dxDataGrid-summarySumOtherColumn": "{1} 的總和為 {0}", + "dxDataGrid-summaryCount": "計數: {0}", + "dxDataGrid-columnFixingFix": "固定", + "dxDataGrid-columnFixingUnfix": "不固定", + "dxDataGrid-columnFixingLeftPosition": "向左", + "dxDataGrid-columnFixingRightPosition": "向右", + "dxDataGrid-exportTo": "匯出", + "dxDataGrid-exportToExcel": "匯出Excel文件", + "dxDataGrid-exporting": "匯出...", + "dxDataGrid-excelFormat": "Excel文件", + "dxDataGrid-selectedRows": "已選列", + "dxDataGrid-exportSelectedRows": "匯出已選行", + "dxDataGrid-exportAll": "匯出所有資料", + "dxDataGrid-headerFilterEmptyValue": "(空白)", + "dxDataGrid-headerFilterOK": "好", + "dxDataGrid-headerFilterCancel": "取消", + "dxDataGrid-ariaColumn": "欄", + "dxDataGrid-ariaValue": "值", + "dxDataGrid-ariaFilterCell": "過濾單元", + "dxDataGrid-ariaCollapse": "摺疊", + "dxDataGrid-ariaExpand": "展開", + "dxDataGrid-ariaDataGrid": "資料網格", + "dxDataGrid-ariaSearchInGrid": "在資料網格中搜尋", + "dxDataGrid-ariaSelectAll": "全選", + "dxDataGrid-ariaSelectRow": "選擇列", + "dxDataGrid-filterBuilderPopupTitle": "過濾器生成器", + "dxDataGrid-filterPanelCreateFilter": "創建過濾器", + "dxDataGrid-filterPanelClearFilter": "清空", + "dxDataGrid-filterPanelFilterEnabledHint": "啟用該過濾器", + "dxTreeList-ariaTreeList": "樹狀列表", + "dxTreeList-editingAddRowToNode": "添加", + "dxPager-infoText": "第{0}頁,共{1}頁 ({2} 個項目)", + "dxPager-pagesCountText": "到", + "dxPager-pageSizesAllText": "全部", + "dxPivotGrid-grandTotal": "合計", + "dxPivotGrid-total": "{0} 總計", + "dxPivotGrid-fieldChooserTitle": "欄位選擇器", + "dxPivotGrid-showFieldChooser": "顯示欄位選擇器", + "dxPivotGrid-expandAll": "全部展開", + "dxPivotGrid-collapseAll": "全部摺疊", + "dxPivotGrid-sortColumnBySummary": "按 \"{0}\" 欄排序", + "dxPivotGrid-sortRowBySummary": "按 \"{0}\" 列排序", + "dxPivotGrid-removeAllSorting": "清除所有排序", + "dxPivotGrid-dataNotAvailable": "不適用", + "dxPivotGrid-rowFields": "列欄位", + "dxPivotGrid-columnFields": "欄欄位", + "dxPivotGrid-dataFields": "資料欄位", + "dxPivotGrid-filterFields": "過濾欄位", + "dxPivotGrid-allFields": "所有欄位", + "dxPivotGrid-columnFieldArea": "將欄欄位拖動到此處", + "dxPivotGrid-dataFieldArea": "將資料拖動到此處", + "dxPivotGrid-rowFieldArea": "將列欄位拖到到此次", + "dxPivotGrid-filterFieldArea": "拖動篩選欄位到此處", + "dxScheduler-editorLabelTitle": "標題", + "dxScheduler-editorLabelStartDate": "開始日期", + "dxScheduler-editorLabelEndDate": "結束日期", + "dxScheduler-editorLabelDescription": "描述", + "dxScheduler-editorLabelRecurrence": "重複", + "dxScheduler-openAppointment": "打開日程", + "dxScheduler-recurrenceNever": "永不", + "dxScheduler-recurrenceMinutely": "每分鐘", + "dxScheduler-recurrenceHourly": "每小時", + "dxScheduler-recurrenceDaily": "日常", + "dxScheduler-recurrenceWeekly": "每週", + "dxScheduler-recurrenceMonthly": "每月", + "dxScheduler-recurrenceYearly": "每年", + "dxScheduler-recurrenceRepeatEvery": "所有", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "停止重複", + "dxScheduler-recurrenceAfter": "之後", + "dxScheduler-recurrenceOn": "在", + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "日", + "dxScheduler-recurrenceRepeatWeekly": "周", + "dxScheduler-recurrenceRepeatMonthly": "月", + "dxScheduler-recurrenceRepeatYearly": "年", + "dxScheduler-switcherDay": "日", + "dxScheduler-switcherWeek": "周", + "dxScheduler-switcherWorkWeek": "工作周", + "dxScheduler-switcherMonth": "月", + "dxScheduler-switcherAgenda": "議程", + "dxScheduler-switcherTimelineDay": "時間軸日", + "dxScheduler-switcherTimelineWeek": "時間軸周", + "dxScheduler-switcherTimelineWorkWeek": "時間軸工作周", + "dxScheduler-switcherTimelineMonth": "時間軸月", + "dxScheduler-recurrenceRepeatOnDate": "於日期", + "dxScheduler-recurrenceRepeatCount": "事件", + "dxScheduler-allDay": "全天", + "dxScheduler-confirmRecurrenceEditMessage": "你想只修改該日程還是想修改整個系列的日程?", + "dxScheduler-confirmRecurrenceDeleteMessage": "你想只刪除這個日程還是想刪除整個系列的日程?", + "dxScheduler-confirmRecurrenceEditSeries": "修改該系列的日程", + "dxScheduler-confirmRecurrenceDeleteSeries": "刪除該系列的日程", + "dxScheduler-confirmRecurrenceEditOccurrence": "修改日程", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "刪除日程", + "dxScheduler-noTimezoneTitle": "沒有時區", + "dxScheduler-moreAppointments": "{0} 更多", + "dxCalendar-todayButtonText": "今天", + "dxCalendar-ariaWidgetName": "日曆", + "dxColorView-ariaRed": "紅色", + "dxColorView-ariaGreen": "綠色", + "dxColorView-ariaBlue": "藍色", + "dxColorView-ariaAlpha": "透明度", + "dxColorView-ariaHex": "色標", + "dxTagBox-selected": "{0} 已選擇", + "dxTagBox-allSelected": "已全選 ({0})", + "dxTagBox-moreSelected": "{0} 更多", + "vizExport-printingButtonText": "列印", + "vizExport-titleMenuText": "匯出中/列印中", + "vizExport-exportButtonText": "{0} 文件", + "dxFilterBuilder-and": "與", + "dxFilterBuilder-or": "或", + "dxFilterBuilder-notAnd": "與非", + "dxFilterBuilder-notOr": "或非", + "dxFilterBuilder-addCondition": "添加條件", + "dxFilterBuilder-addGroup": "添加組", + "dxFilterBuilder-enterValueText": "<輸入值>", + "dxFilterBuilder-filterOperationEquals": "等於", + "dxFilterBuilder-filterOperationNotEquals": "不等於", + "dxFilterBuilder-filterOperationLess": "小於", + "dxFilterBuilder-filterOperationLessOrEquals": "小於或等於", + "dxFilterBuilder-filterOperationGreater": "大於", + "dxFilterBuilder-filterOperationGreaterOrEquals": "大於或等於", + "dxFilterBuilder-filterOperationStartsWith": "開始於", + "dxFilterBuilder-filterOperationContains": "包含", + "dxFilterBuilder-filterOperationNotContains": "不包含", + "dxFilterBuilder-filterOperationEndsWith": "結束於", + "dxFilterBuilder-filterOperationIsBlank": "空", + "dxFilterBuilder-filterOperationIsNotBlank": "不為空", + "dxFilterBuilder-filterOperationBetween": "之間", + "dxFilterBuilder-filterOperationAnyOf": "任何一個", + "dxFilterBuilder-filterOperationNoneOf": "任何一個都不", + "dxHtmlEditor-dialogColorCaption": "更改字體顏色", + "dxHtmlEditor-dialogBackgroundCaption": "更改背景顏色", + "dxHtmlEditor-dialogLinkCaption": "添加鏈接", + "dxHtmlEditor-dialogLinkUrlField": "鏈接地址", + "dxHtmlEditor-dialogLinkTextField": "鏈接文字", + "dxHtmlEditor-dialogLinkTargetField": "在新窗口中打開", + "dxHtmlEditor-dialogImageCaption": "添加圖片", + "dxHtmlEditor-dialogImageUrlField": "圖片地址", + "dxHtmlEditor-dialogImageAltField": "替代文字", + "dxHtmlEditor-dialogImageWidthField": "寬 (px)", + "dxHtmlEditor-dialogImageHeightField": "長 (px)", + + "dxHtmlEditor-heading": "標題", + "dxHtmlEditor-normalText": "正文" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh.json b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh.json new file mode 100644 index 0000000000000000000000000000000000000000..e03d9d7e50be3273f0d765c57a8aaeb1e5c5f79d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/messages/zh.json @@ -0,0 +1,557 @@ +{ + "zh": { + "Yes": "是", + "No": "否", + "Cancel": "取消", + "Clear": "清除", + "Done": "完成", + "Loading": "正在加载...", + "Select": "选择...", + "Search": "搜索", + "Back": "返回", + "OK": "确定", + + "dxCollectionWidget-noDataText": "没有要显示的数据", + + "dxDropDownEditor-selectLabel": "选择", + + "validation-required": "必需", + "validation-required-formatted": "{0} 是必需的", + "validation-numeric": "值必须是一个数字", + "validation-numeric-formatted": "{0} 必须是一个数字", + "validation-range": "值超出范围", + "validation-range-formatted": "{0} 超出范围", + "validation-stringLength": "该值的长度不正确", + "validation-stringLength-formatted": "{0} 的长度不正确", + "validation-custom": "值无效", + "validation-custom-formatted": "{0} 值无效", + "validation-async": "值无效", + "validation-async-formatted": "{0} 值无效", + "validation-compare": "值不匹配", + "validation-compare-formatted": "{0} 不匹配", + "validation-pattern": "值不符合该模式", + "validation-pattern-formatted": "{0} 不匹配该模式", + "validation-email": "电子邮件无效", + "validation-email-formatted": "{0} 无效", + "validation-mask": "值无效", + + "dxLookup-searchPlaceholder": "最小字符数: {0}", + + "dxList-pullingDownText": "下拉以刷新...", + "dxList-pulledDownText": "放开以刷新...", + "dxList-refreshingText": "刷新中...", + "dxList-pageLoadingText": "正在加载...", + "dxList-nextButtonText": "更多", + "dxList-selectAll": "全选", + "dxListEditDecorator-delete": "删除", + "dxListEditDecorator-more": "更多", + + "dxScrollView-pullingDownText": "下拉以刷新...", + "dxScrollView-pulledDownText": "放开以刷新...", + "dxScrollView-refreshingText": "刷新中...", + "dxScrollView-reachBottomText": "正在加载...", + + "dxDateBox-simulatedDataPickerTitleTime": "选择时间", + "dxDateBox-simulatedDataPickerTitleDate": "选择日期", + "dxDateBox-simulatedDataPickerTitleDateTime": "选择日期和时间", + "dxDateBox-validation-datetime": "值必须是日期或时间", + + "dxFileUploader-selectFile": "选择文件", + "dxFileUploader-dropFile": "或者把文件放在此处", + "dxFileUploader-bytes": "bytes", + "dxFileUploader-kb": "kb", + "dxFileUploader-Mb": "Mb", + "dxFileUploader-Gb": "Gb", + "dxFileUploader-upload": "上传", + "dxFileUploader-uploaded": "已上传", + "dxFileUploader-readyToUpload": "准备上传", + "dxFileUploader-uploadAbortedMessage": "TODO", + "dxFileUploader-uploadFailedMessage": "上传失败", + "dxFileUploader-invalidFileExtension": "文件类型错误", + "dxFileUploader-invalidMaxFileSize": "文件过大", + "dxFileUploader-invalidMinFileSize": "文件过小", + + "dxRangeSlider-ariaFrom": "从", + "dxRangeSlider-ariaTill": "至", + "dxSwitch-switchedOnText": "开", + "dxSwitch-switchedOffText": "关", + + "dxForm-optionalMark": "可选", + "dxForm-requiredMessage": "{0} 是必须的", + + "dxNumberBox-invalidValueMessage": "值必须是一个数字", + "dxNumberBox-noDataText": "无数据", + + "dxDataGrid-columnChooserTitle": "列选择器", + "dxDataGrid-columnChooserEmptyText": "在这里拖动一列隐藏它", + "dxDataGrid-groupContinuesMessage": "下一页", + "dxDataGrid-groupContinuedMessage": "上一页", + "dxDataGrid-groupHeaderText": "通过该列分组", + "dxDataGrid-ungroupHeaderText": "取消分组", + "dxDataGrid-ungroupAllText": "取消所有分组", + "dxDataGrid-editingEditRow": "编辑", + "dxDataGrid-editingSaveRowChanges": "保存", + "dxDataGrid-editingCancelRowChanges": "取消", + "dxDataGrid-editingDeleteRow": "删除", + "dxDataGrid-editingUndeleteRow": "取消删除", + "dxDataGrid-editingConfirmDeleteMessage": "你确定要删除这条记录吗?", + "dxDataGrid-validationCancelChanges": "取消更改", + "dxDataGrid-groupPanelEmptyText": "拖动列标题至此以进行列分组", + "dxDataGrid-noDataText": "无数据", + "dxDataGrid-searchPanelPlaceholder": "搜索...", + "dxDataGrid-filterRowShowAllText": "(全部)", + "dxDataGrid-filterRowResetOperationText": "重置", + "dxDataGrid-filterRowOperationEquals": "等于", + "dxDataGrid-filterRowOperationNotEquals": "不等于", + "dxDataGrid-filterRowOperationLess": "小于", + "dxDataGrid-filterRowOperationLessOrEquals": "小于或等于", + "dxDataGrid-filterRowOperationGreater": "大于", + "dxDataGrid-filterRowOperationGreaterOrEquals": "大于或等于", + "dxDataGrid-filterRowOperationStartsWith": "以...开始", + "dxDataGrid-filterRowOperationContains": "包含", + "dxDataGrid-filterRowOperationNotContains": "不包含", + "dxDataGrid-filterRowOperationEndsWith": "结束于", + "dxDataGrid-filterRowOperationBetween": "之间", + "dxDataGrid-filterRowOperationBetweenStartText": "开始", + "dxDataGrid-filterRowOperationBetweenEndText": "结束", + "dxDataGrid-applyFilterText": "应用过滤器", + "dxDataGrid-trueText": "真", + "dxDataGrid-falseText": "假", + "dxDataGrid-sortingAscendingText": "升序排序", + "dxDataGrid-sortingDescendingText": "降序排序", + "dxDataGrid-sortingClearText": "清除排序", + "dxDataGrid-editingSaveAllChanges": "保存修改", + "dxDataGrid-editingCancelAllChanges": "放弃修改", + "dxDataGrid-editingAddRow": "添加一行", + "dxDataGrid-summaryMin": "最小值: {0}", + "dxDataGrid-summaryMinOtherColumn": "{1} 的最小值为 {0}", + "dxDataGrid-summaryMax": "最大值: {0}", + "dxDataGrid-summaryMaxOtherColumn": "{1} 的最大值为 {0}", + "dxDataGrid-summaryAvg": "平均值: {0}", + "dxDataGrid-summaryAvgOtherColumn": "{1} 的平均值为 {0}", + "dxDataGrid-summarySum": "总和: {0}", + "dxDataGrid-summarySumOtherColumn": "{1} 的总和为 {0}", + "dxDataGrid-summaryCount": "计数: {0}", + "dxDataGrid-columnFixingFix": "固定", + "dxDataGrid-columnFixingUnfix": "不固定", + "dxDataGrid-columnFixingLeftPosition": "向左", + "dxDataGrid-columnFixingRightPosition": "向右", + "dxDataGrid-exportTo": "导出", + "dxDataGrid-exportToExcel": "导出Excel文件", + "dxDataGrid-exporting": "导出...", + "dxDataGrid-excelFormat": "Excel文件", + "dxDataGrid-selectedRows": "已选行", + "dxDataGrid-exportSelectedRows": "导出已选行", + "dxDataGrid-exportAll": "导出所有数据", + "dxDataGrid-headerFilterEmptyValue": "(空白)", + "dxDataGrid-headerFilterOK": "好", + "dxDataGrid-headerFilterCancel": "取消", + "dxDataGrid-ariaColumn": "列", + "dxDataGrid-ariaValue": "值", + "dxDataGrid-ariaFilterCell": "过滤单元", + "dxDataGrid-ariaCollapse": "折叠", + "dxDataGrid-ariaExpand": "展开", + "dxDataGrid-ariaDataGrid": "数据网格", + "dxDataGrid-ariaSearchInGrid": "在数据网格中搜索", + "dxDataGrid-ariaSelectAll": "全选", + "dxDataGrid-ariaSelectRow": "选择行", + "dxDataGrid-filterBuilderPopupTitle": "过滤器生成器", + "dxDataGrid-filterPanelCreateFilter": "创建过滤器", + "dxDataGrid-filterPanelClearFilter": "清空", + "dxDataGrid-filterPanelFilterEnabledHint": "启用该过滤器", + + "dxTreeList-ariaTreeList": "树状列表", + "dxTreeList-editingAddRowToNode": "添加", + + "dxPager-infoText": "第{0}页,共{1}页 ({2} 个项目)", + "dxPager-pagesCountText": "到", + "dxPager-pageSizesAllText": "全部", + "dxPivotGrid-grandTotal": "合计", + "dxPivotGrid-total": "{0} 总计", + "dxPivotGrid-fieldChooserTitle": "字段选择器", + "dxPivotGrid-showFieldChooser": "显示字段选择器", + "dxPivotGrid-expandAll": "全部展开", + "dxPivotGrid-collapseAll": "全部折叠", + "dxPivotGrid-sortColumnBySummary": "按 \"{0}\" 列排序", + "dxPivotGrid-sortRowBySummary": "按 \"{0}\" 行排序", + "dxPivotGrid-removeAllSorting": "清除所有排序", + "dxPivotGrid-dataNotAvailable": "不适用", + "dxPivotGrid-rowFields": "行字段", + "dxPivotGrid-columnFields": "列字段", + "dxPivotGrid-dataFields": "数据字段", + "dxPivotGrid-filterFields": "过滤字段", + "dxPivotGrid-allFields": "所有字段", + "dxPivotGrid-columnFieldArea": "将列拖动到此处", + "dxPivotGrid-dataFieldArea": "将数据拖动到此处", + "dxPivotGrid-rowFieldArea": "将行字段拖到到此次", + "dxPivotGrid-filterFieldArea": "拖动筛选字段到此处", + + "dxScheduler-editorLabelTitle": "标题", + "dxScheduler-editorLabelStartDate": "开始日期", + "dxScheduler-editorLabelEndDate": "结束日期", + "dxScheduler-editorLabelDescription": "描述", + "dxScheduler-editorLabelRecurrence": "重复", + + "dxScheduler-openAppointment": "打开日程", + + "dxScheduler-recurrenceNever": "永不", + "dxScheduler-recurrenceMinutely": "Minutely", + "dxScheduler-recurrenceHourly": "Hourly", + "dxScheduler-recurrenceDaily": "日常", + "dxScheduler-recurrenceWeekly": "每周", + "dxScheduler-recurrenceMonthly": "每月", + "dxScheduler-recurrenceYearly": "每年", + + "dxScheduler-recurrenceRepeatEvery": "所有", + "dxScheduler-recurrenceRepeatOn": "Repeat On", + "dxScheduler-recurrenceEnd": "停止重复", + "dxScheduler-recurrenceAfter": "之后", + "dxScheduler-recurrenceOn": "在", + + "dxScheduler-recurrenceRepeatMinutely": "minute(s)", + "dxScheduler-recurrenceRepeatHourly": "hour(s)", + "dxScheduler-recurrenceRepeatDaily": "日", + "dxScheduler-recurrenceRepeatWeekly": "周", + "dxScheduler-recurrenceRepeatMonthly": "月", + "dxScheduler-recurrenceRepeatYearly": "年", + + "dxScheduler-switcherDay": "日", + "dxScheduler-switcherWeek": "周", + "dxScheduler-switcherWorkWeek": "工作周", + "dxScheduler-switcherMonth": "月", + + "dxScheduler-switcherAgenda": "议程", + + "dxScheduler-switcherTimelineDay": "时间轴日", + "dxScheduler-switcherTimelineWeek": "时间轴周", + "dxScheduler-switcherTimelineWorkWeek": "时间轴工作周", + "dxScheduler-switcherTimelineMonth": "时间轴月", + + "dxScheduler-recurrenceRepeatOnDate": "于日期", + "dxScheduler-recurrenceRepeatCount": "事件", + "dxScheduler-allDay": "全天", + + "dxScheduler-confirmRecurrenceEditMessage": "你想只修改该日程还是想修改整个系列的日程?", + "dxScheduler-confirmRecurrenceDeleteMessage": "你想只删除这个日程还是想删除整个系列的日程?", + + "dxScheduler-confirmRecurrenceEditSeries": "修改该系列的日程", + "dxScheduler-confirmRecurrenceDeleteSeries": "删除该系列的日程", + "dxScheduler-confirmRecurrenceEditOccurrence": "修改日程", + "dxScheduler-confirmRecurrenceDeleteOccurrence": "删除日程", + + "dxScheduler-noTimezoneTitle": "没有时区", + "dxScheduler-moreAppointments": "{0} 更多", + + "dxCalendar-todayButtonText": "今天", + "dxCalendar-ariaWidgetName": "日历", + + "dxColorView-ariaRed": "红色", + "dxColorView-ariaGreen": "绿色", + "dxColorView-ariaBlue": "蓝色", + "dxColorView-ariaAlpha": "透明度", + "dxColorView-ariaHex": "色标", + + "dxTagBox-selected": "{0} 已选择", + "dxTagBox-allSelected": "已全选 ({0})", + "dxTagBox-moreSelected": "{0} 更多", + + "vizExport-printingButtonText": "打印", + "vizExport-titleMenuText": "导出中/打印中", + "vizExport-exportButtonText": "{0} 文件", + + "dxFilterBuilder-and": "与", + "dxFilterBuilder-or": "或", + "dxFilterBuilder-notAnd": "与非", + "dxFilterBuilder-notOr": "或非", + "dxFilterBuilder-addCondition": "添加条件", + "dxFilterBuilder-addGroup": "添加组", + "dxFilterBuilder-enterValueText": "<输入值>", + "dxFilterBuilder-filterOperationEquals": "等于", + "dxFilterBuilder-filterOperationNotEquals": "不等于", + "dxFilterBuilder-filterOperationLess": "小于", + "dxFilterBuilder-filterOperationLessOrEquals": "小于或等于", + "dxFilterBuilder-filterOperationGreater": "大于", + "dxFilterBuilder-filterOperationGreaterOrEquals": "大于或等于", + "dxFilterBuilder-filterOperationStartsWith": "开始于", + "dxFilterBuilder-filterOperationContains": "包含", + "dxFilterBuilder-filterOperationNotContains": "不包含", + "dxFilterBuilder-filterOperationEndsWith": "结束于", + "dxFilterBuilder-filterOperationIsBlank": "空", + "dxFilterBuilder-filterOperationIsNotBlank": "不为空", + "dxFilterBuilder-filterOperationBetween": "之间", + "dxFilterBuilder-filterOperationAnyOf": "任何一个", + "dxFilterBuilder-filterOperationNoneOf": "任何一个都不", + + "dxHtmlEditor-dialogColorCaption": "更改字体颜色", + "dxHtmlEditor-dialogBackgroundCaption": "更改背景颜色", + "dxHtmlEditor-dialogLinkCaption": "添加链接", + "dxHtmlEditor-dialogLinkUrlField": "链接地址", + "dxHtmlEditor-dialogLinkTextField": "链接文字", + "dxHtmlEditor-dialogLinkTargetField": "在新窗口中打开", + "dxHtmlEditor-dialogImageCaption": "添加图片", + "dxHtmlEditor-dialogImageUrlField": "图片地址", + "dxHtmlEditor-dialogImageAltField": "替代文字", + "dxHtmlEditor-dialogImageWidthField": "宽 (px)", + "dxHtmlEditor-dialogImageHeightField": "长 (px)", + "dxHtmlEditor-dialogInsertTableRowsField": "!TODO", + "dxHtmlEditor-dialogInsertTableColumnsField": "!TODO", + "dxHtmlEditor-dialogInsertTableCaption": "!TODO", + "dxHtmlEditor-heading": "标题", + "dxHtmlEditor-normalText": "正文", + "dxHtmlEditor-background": "TODO", + "dxHtmlEditor-bold": "TODO", + "dxHtmlEditor-color": "TODO", + "dxHtmlEditor-font": "TODO", + "dxHtmlEditor-italic": "TODO", + "dxHtmlEditor-link": "TODO", + "dxHtmlEditor-image": "TODO", + "dxHtmlEditor-size": "TODO", + "dxHtmlEditor-strike": "TODO", + "dxHtmlEditor-subscript": "TODO", + "dxHtmlEditor-superscript": "TODO", + "dxHtmlEditor-underline": "TODO", + "dxHtmlEditor-blockquote": "TODO", + "dxHtmlEditor-header": "TODO", + "dxHtmlEditor-increaseIndent": "TODO", + "dxHtmlEditor-decreaseIndent": "TODO", + "dxHtmlEditor-orderedList": "TODO", + "dxHtmlEditor-bulletList": "TODO", + "dxHtmlEditor-alignLeft": "TODO", + "dxHtmlEditor-alignCenter": "TODO", + "dxHtmlEditor-alignRight": "TODO", + "dxHtmlEditor-alignJustify": "TODO", + "dxHtmlEditor-codeBlock": "TODO", + "dxHtmlEditor-variable": "TODO", + "dxHtmlEditor-undo": "TODO", + "dxHtmlEditor-redo": "TODO", + "dxHtmlEditor-clear": "TODO", + "dxHtmlEditor-insertTable": "TODO", + "dxHtmlEditor-insertHeaderRow": "TODO", + "dxHtmlEditor-insertRowAbove": "TODO", + "dxHtmlEditor-insertRowBelow": "TODO", + "dxHtmlEditor-insertColumnLeft": "TODO", + "dxHtmlEditor-insertColumnRight": "TODO", + "dxHtmlEditor-deleteColumn": "TODO", + "dxHtmlEditor-deleteRow": "TODO", + "dxHtmlEditor-deleteTable": "TODO", + "dxHtmlEditor-cellProperties": "TODO", + "dxHtmlEditor-tableProperties": "TODO", + "dxHtmlEditor-insert": "TODO", + "dxHtmlEditor-delete": "TODO", + "dxHtmlEditor-border": "TODO", + "dxHtmlEditor-style": "TODO", + "dxHtmlEditor-width": "TODO", + "dxHtmlEditor-height": "TODO", + "dxHtmlEditor-borderColor": "TODO", + "dxHtmlEditor-tableBackground": "TODO", + "dxHtmlEditor-dimensions": "TODO", + "dxHtmlEditor-alignment": "TODO", + "dxHtmlEditor-horizontal": "TODO", + "dxHtmlEditor-vertical": "TODO", + "dxHtmlEditor-paddingVertical": "TODO", + "dxHtmlEditor-paddingHorizontal": "TODO", + "dxHtmlEditor-pixels": "TODO", + "dxHtmlEditor-list": "TODO", + "dxHtmlEditor-ordered": "TODO", + "dxHtmlEditor-bullet": "TODO", + "dxHtmlEditor-align": "TODO", + "dxHtmlEditor-center": "TODO", + "dxHtmlEditor-left": "TODO", + "dxHtmlEditor-right": "TODO", + "dxHtmlEditor-indent": "TODO", + "dxHtmlEditor-justify": "TODO", + + "dxFileManager-newDirectoryName": "TODO", + "dxFileManager-rootDirectoryName": "TODO", + "dxFileManager-errorNoAccess": "TODO", + "dxFileManager-errorDirectoryExistsFormat": "TODO", + "dxFileManager-errorFileExistsFormat": "TODO", + "dxFileManager-errorFileNotFoundFormat": "TODO", + "dxFileManager-errorDirectoryNotFoundFormat": "TODO", + "dxFileManager-errorWrongFileExtension": "TODO", + "dxFileManager-errorMaxFileSizeExceeded": "TODO", + "dxFileManager-errorInvalidSymbols": "TODO", + "dxFileManager-errorDefault": "TODO", + "dxFileManager-errorDirectoryOpenFailed": "TODO", + + "dxDiagram-categoryGeneral": "TODO", + "dxDiagram-categoryFlowchart": "TODO", + "dxDiagram-categoryOrgChart": "TODO", + "dxDiagram-categoryContainers": "TODO", + "dxDiagram-categoryCustom": "TODO", + + "dxDiagram-commandExportToSvg": "TODO", + "dxDiagram-commandExportToPng": "TODO", + "dxDiagram-commandExportToJpg": "TODO", + "dxDiagram-commandUndo": "TODO", + "dxDiagram-commandRedo": "TODO", + "dxDiagram-commandFontName": "TODO", + "dxDiagram-commandFontSize": "TODO", + "dxDiagram-commandBold": "TODO", + "dxDiagram-commandItalic": "TODO", + "dxDiagram-commandUnderline": "TODO", + "dxDiagram-commandTextColor": "TODO", + "dxDiagram-commandLineColor": "TODO", + "dxDiagram-commandLineWidth": "TODO", + "dxDiagram-commandLineStyle": "TODO", + "dxDiagram-commandLineStyleSolid": "TODO", + "dxDiagram-commandLineStyleDotted": "TODO", + "dxDiagram-commandLineStyleDashed": "TODO", + "dxDiagram-commandFillColor": "TODO", + "dxDiagram-commandAlignLeft": "TODO", + "dxDiagram-commandAlignCenter": "TODO", + "dxDiagram-commandAlignRight": "TODO", + "dxDiagram-commandConnectorLineType": "TODO", + "dxDiagram-commandConnectorLineStraight": "TODO", + "dxDiagram-commandConnectorLineOrthogonal": "TODO", + "dxDiagram-commandConnectorLineStart": "TODO", + "dxDiagram-commandConnectorLineEnd": "TODO", + "dxDiagram-commandConnectorLineNone": "TODO", + "dxDiagram-commandConnectorLineArrow": "TODO", + "dxDiagram-commandFullscreen": "TODO", + "dxDiagram-commandUnits": "TODO", + "dxDiagram-commandPageSize": "TODO", + "dxDiagram-commandPageOrientation": "TODO", + "dxDiagram-commandPageOrientationLandscape": "TODO", + "dxDiagram-commandPageOrientationPortrait": "TODO", + "dxDiagram-commandPageColor": "TODO", + "dxDiagram-commandShowGrid": "TODO", + "dxDiagram-commandSnapToGrid": "TODO", + "dxDiagram-commandGridSize": "TODO", + "dxDiagram-commandZoomLevel": "TODO", + "dxDiagram-commandAutoZoom": "TODO", + "dxDiagram-commandFitToContent": "TODO", + "dxDiagram-commandFitToWidth": "TODO", + "dxDiagram-commandAutoZoomByContent": "TODO", + "dxDiagram-commandAutoZoomByWidth": "TODO", + "dxDiagram-commandSimpleView": "TODO", + "dxDiagram-commandCut": "TODO", + "dxDiagram-commandCopy": "TODO", + "dxDiagram-commandPaste": "TODO", + "dxDiagram-commandSelectAll": "TODO", + "dxDiagram-commandDelete": "TODO", + "dxDiagram-commandBringToFront": "TODO", + "dxDiagram-commandSendToBack": "TODO", + "dxDiagram-commandLock": "TODO", + "dxDiagram-commandUnlock": "TODO", + "dxDiagram-commandInsertShapeImage": "TODO", + "dxDiagram-commandEditShapeImage": "TODO", + "dxDiagram-commandDeleteShapeImage": "TODO", + "dxDiagram-commandLayoutLeftToRight": "TODO", + "dxDiagram-commandLayoutRightToLeft": "TODO", + "dxDiagram-commandLayoutTopToBottom": "TODO", + "dxDiagram-commandLayoutBottomToTop": "TODO", + + "dxDiagram-unitIn": "TODO", + "dxDiagram-unitCm": "TODO", + "dxDiagram-unitPx": "TODO", + + "dxDiagram-dialogButtonOK": "TODO", + "dxDiagram-dialogButtonCancel": "TODO", + "dxDiagram-dialogInsertShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageTitle": "TODO", + "dxDiagram-dialogEditShapeImageSelectButton": "TODO", + "dxDiagram-dialogEditShapeImageLabelText": "TODO", + + "dxDiagram-uiExport": "TODO", + "dxDiagram-uiProperties": "TODO", + "dxDiagram-uiSettings": "TODO", + "dxDiagram-uiShowToolbox": "TODO", + "dxDiagram-uiSearch": "TODO", + "dxDiagram-uiStyle": "TODO", + "dxDiagram-uiLayout": "TODO", + "dxDiagram-uiLayoutTree": "TODO", + "dxDiagram-uiLayoutLayered": "TODO", + "dxDiagram-uiDiagram": "TODO", + "dxDiagram-uiText": "TODO", + "dxDiagram-uiObject": "TODO", + "dxDiagram-uiConnector": "TODO", + "dxDiagram-uiPage": "TODO", + + "dxDiagram-shapeText": "TODO", + "dxDiagram-shapeRectangle": "TODO", + "dxDiagram-shapeEllipse": "TODO", + "dxDiagram-shapeCross": "TODO", + "dxDiagram-shapeTriangle": "TODO", + "dxDiagram-shapeDiamond": "TODO", + "dxDiagram-shapeHeart": "TODO", + "dxDiagram-shapePentagon": "TODO", + "dxDiagram-shapeHexagon": "TODO", + "dxDiagram-shapeOctagon": "TODO", + "dxDiagram-shapeStar": "TODO", + "dxDiagram-shapeArrowLeft": "TODO", + "dxDiagram-shapeArrowUp": "TODO", + "dxDiagram-shapeArrowRight": "TODO", + "dxDiagram-shapeArrowDown": "TODO", + "dxDiagram-shapeArrowUpDown": "TODO", + "dxDiagram-shapeArrowLeftRight": "TODO", + "dxDiagram-shapeProcess": "TODO", + "dxDiagram-shapeDecision": "TODO", + "dxDiagram-shapeTerminator": "TODO", + "dxDiagram-shapePredefinedProcess": "TODO", + "dxDiagram-shapeDocument": "TODO", + "dxDiagram-shapeMultipleDocuments": "TODO", + "dxDiagram-shapeManualInput": "TODO", + "dxDiagram-shapePreparation": "TODO", + "dxDiagram-shapeData": "TODO", + "dxDiagram-shapeDatabase": "TODO", + "dxDiagram-shapeHardDisk": "TODO", + "dxDiagram-shapeInternalStorage": "TODO", + "dxDiagram-shapePaperTape": "TODO", + "dxDiagram-shapeManualOperation": "TODO", + "dxDiagram-shapeDelay": "TODO", + "dxDiagram-shapeStoredData": "TODO", + "dxDiagram-shapeDisplay": "TODO", + "dxDiagram-shapeMerge": "TODO", + "dxDiagram-shapeConnector": "TODO", + "dxDiagram-shapeOr": "TODO", + "dxDiagram-shapeSummingJunction": "TODO", + "dxDiagram-shapeContainerDefaultText": "TODO", + "dxDiagram-shapeVerticalContainer": "TODO", + "dxDiagram-shapeHorizontalContainer": "TODO", + "dxDiagram-shapeCardDefaultText": "TODO", + "dxDiagram-shapeCardWithImageOnLeft": "TODO", + "dxDiagram-shapeCardWithImageOnTop": "TODO", + "dxDiagram-shapeCardWithImageOnRight": "TODO", + + "dxGantt-dialogTitle": "TODO", + "dxGantt-dialogStartTitle": "TODO", + "dxGantt-dialogEndTitle": "TODO", + "dxGantt-dialogProgressTitle": "TODO", + "dxGantt-dialogResourcesTitle": "TODO", + "dxGantt-dialogResourceManagerTitle": "TODO", + "dxGantt-dialogTaskDetailsTitle": "TODO", + "dxGantt-dialogEditResourceListHint": "TODO", + "dxGantt-dialogEditNoResources": "TODO", + "dxGantt-dialogButtonAdd": "TODO", + "dxGantt-contextMenuNewTask": "TODO", + "dxGantt-contextMenuNewSubtask": "TODO", + "dxGantt-contextMenuDeleteTask": "TODO", + "dxGantt-contextMenuDeleteDependency": "TODO", + "dxGantt-dialogTaskDeleteConfirmation": "TODO", + "dxGantt-dialogDependencyDeleteConfirmation": "TODO", + "dxGantt-dialogResourcesDeleteConfirmation": "TODO", + "dxGantt-dialogConstraintCriticalViolationMessage": "TODO", + "dxGantt-dialogConstraintViolationMessage": "TODO", + "dxGantt-dialogCancelOperationMessage": "TODO", + "dxGantt-dialogDeleteDependencyMessage": "TODO", + "dxGantt-dialogMoveTaskAndKeepDependencyMessage": "TODO", + "dxGantt-undo": "TODO", + "dxGantt-redo": "TODO", + "dxGantt-expandAll": "TODO", + "dxGantt-collapseAll": "TODO", + "dxGantt-addNewTask": "TODO", + "dxGantt-deleteSelectedTask": "TODO", + "dxGantt-zoomIn": "TODO", + "dxGantt-zoomOut": "TODO", + "dxGantt-fullScreen": "TODO", + "dxGantt-quarter": "TODO", + "dxGantt-sortingAscendingText": "升序排序", + "dxGantt-sortingDescendingText": "降序排序", + "dxGantt-sortingClearText": "清除排序", + "dxGantt-showResources": "TODO", + "dxGantt-showDependencies": "TODO", + "dxGantt-dialogStartDateValidation": "TODO", + "dxGantt-dialogEndDateValidation": "TODO" +} +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/number.js b/packages/f-theme-editor/farris-theme-editor/js/localization/number.js new file mode 100644 index 0000000000000000000000000000000000000000..dd1b141f81896f8948de30e466846d1b845ae8a4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/number.js @@ -0,0 +1,382 @@ +import dependencyInjector from '../core/utils/dependency_injector'; +import { inArray, find } from '../core/utils/array'; +import { escapeRegExp } from '../core/utils/common'; +import { each } from '../core/utils/iterator'; +import { isPlainObject } from '../core/utils/type'; +import { getFormatter } from './ldml/number'; +import config from '../core/config'; +import errors from '../core/errors'; +import { toFixed } from './utils'; +import currencyLocalization from './currency'; +import intlNumberLocalization from './intl/number'; + +const hasIntl = typeof Intl !== 'undefined'; +const MAX_LARGE_NUMBER_POWER = 4; +const DECIMAL_BASE = 10; + +const NUMERIC_FORMATS = ['currency', 'fixedpoint', 'exponential', 'percent', 'decimal']; + +const LargeNumberFormatPostfixes = { + 1: 'K', // kilo + 2: 'M', // mega + 3: 'B', // billions + 4: 'T' // tera +}; + +const LargeNumberFormatPowers = { + 'largenumber': 'auto', + 'thousands': 1, + 'millions': 2, + 'billions': 3, + 'trillions': 4 +}; + +const numberLocalization = dependencyInjector({ + engine: function() { + return 'base'; + }, + numericFormats: NUMERIC_FORMATS, + + defaultLargeNumberFormatPostfixes: LargeNumberFormatPostfixes, + + _parseNumberFormatString: function(formatType) { + const formatObject = {}; + + if(!formatType || typeof formatType !== 'string') return; + + const formatList = formatType.toLowerCase().split(' '); + each(formatList, (index, value) => { + if(inArray(value, NUMERIC_FORMATS) > -1) { + formatObject.formatType = value; + } else if(value in LargeNumberFormatPowers) { + formatObject.power = LargeNumberFormatPowers[value]; + } + }); + + if(formatObject.power && !formatObject.formatType) { + formatObject.formatType = 'fixedpoint'; + } + + if(formatObject.formatType) { + return formatObject; + } + }, + + _calculateNumberPower: function(value, base, minPower, maxPower) { + let number = Math.abs(value); + let power = 0; + + if(number > 1) { + while(number && number >= base && (maxPower === undefined || power < maxPower)) { + power++; + number = number / base; + } + } else if(number > 0 && number < 1) { + while(number < 1 && (minPower === undefined || power > minPower)) { + power--; + number = number * base; + } + } + + return power; + }, + _getNumberByPower: function(number, power, base) { + let result = number; + + while(power > 0) { + result = result / base; + power--; + } + + while(power < 0) { + result = result * base; + power++; + } + + return result; + }, + _formatNumber: function(value, formatObject, formatConfig) { + if(formatObject.power === 'auto') { + formatObject.power = this._calculateNumberPower(value, 1000, 0, MAX_LARGE_NUMBER_POWER); + } + + if(formatObject.power) { + value = this._getNumberByPower(value, formatObject.power, 1000); + } + + const powerPostfix = this.defaultLargeNumberFormatPostfixes[formatObject.power] || ''; + + let result = this._formatNumberCore(value, formatObject.formatType, formatConfig); + + result = result.replace(/(\d|.$)(\D*)$/, '$1' + powerPostfix + '$2'); + + return result; + }, + + _formatNumberExponential: function(value, formatConfig) { + let power = this._calculateNumberPower(value, DECIMAL_BASE); + let number = this._getNumberByPower(value, power, DECIMAL_BASE); + + if(formatConfig.precision === undefined) { + formatConfig.precision = 1; + } + + if(number.toFixed(formatConfig.precision || 0) >= DECIMAL_BASE) { + power++; + number = number / DECIMAL_BASE; + } + + const powString = (power >= 0 ? '+' : '') + power.toString(); + + return this._formatNumberCore(number, 'fixedpoint', formatConfig) + 'E' + powString; + }, + + _addZeroes: function(value, precision) { + const multiplier = Math.pow(10, precision); + const sign = value < 0 ? '-' : ''; + + value = ((Math.abs(value) * multiplier) >>> 0) / multiplier; + + let result = value.toString(); + while(result.length < precision) { + result = '0' + result; + } + + return sign + result; + }, + + _addGroupSeparators: function(value) { + const parts = value.toString().split('.'); + + return parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, config().thousandsSeparator) + (parts[1] ? config().decimalSeparator + parts[1] : ''); + }, + + _formatNumberCore: function(value, format, formatConfig) { + if(format === 'exponential') { + return this._formatNumberExponential(value, formatConfig); + } + + if(format !== 'decimal' && formatConfig.precision !== null) { + formatConfig.precision = formatConfig.precision || 0; + } + + if(format === 'percent') { + value = value * 100; + } + + if(formatConfig.precision !== undefined) { + if(format === 'decimal') { + value = this._addZeroes(value, formatConfig.precision); + } else { + value = formatConfig.precision === null ? value.toPrecision() : toFixed(value, formatConfig.precision); + } + } + + if(format !== 'decimal') { + value = this._addGroupSeparators(value); + } else { + value = value.toString().replace('.', config().decimalSeparator); + } + + if(format === 'percent') { + value += '%'; + } + + return value; + }, + + _normalizeFormat: function(format) { + if(!format) { + return {}; + } + + if(typeof (format) === 'function') { + return format; + } + + if(!isPlainObject(format)) { + format = { + type: format + }; + } + + return format; + }, + + _getSeparators: function() { + return { + decimalSeparator: this.getDecimalSeparator(), + thousandsSeparator: this.getThousandsSeparator() + }; + }, + + getThousandsSeparator: function() { + return this.format(10000, 'fixedPoint')[2]; + }, + + getDecimalSeparator: function() { + return this.format(1.2, { type: 'fixedPoint', precision: 1 })[1]; + }, + + convertDigits: function(value, toStandard) { + const digits = this.format(90, 'decimal'); + + if(typeof value !== 'string' || digits[1] === '0') { + return value; + } + + const fromFirstDigit = toStandard ? digits[1] : '0'; + const toFirstDigit = toStandard ? '0' : digits[1]; + const fromLastDigit = toStandard ? digits[0] : '9'; + const regExp = new RegExp('[' + fromFirstDigit + '-' + fromLastDigit + ']', 'g'); + + return value.replace(regExp, char => { + return String.fromCharCode(char.charCodeAt(0) + (toFirstDigit.charCodeAt(0) - fromFirstDigit.charCodeAt(0))); + }); + }, + + getNegativeEtalonRegExp: function(format) { + const separators = this._getSeparators(); + const digitalRegExp = new RegExp('[0-9' + escapeRegExp(separators.decimalSeparator + separators.thousandsSeparator) + ']+', 'g'); + const specialCharacters = ['\\', '(', ')', '[', ']', '*', '+', '$', '^', '?', '|', '{', '}']; + + let negativeEtalon = this.format(-1, format).replace(digitalRegExp, '1'); + specialCharacters.forEach(char => { + negativeEtalon = negativeEtalon.replace(char, `\\${char}`); + }); + negativeEtalon = negativeEtalon.replace(' ', '\\s'); + negativeEtalon = negativeEtalon.replace('1', '.+'); + + return new RegExp(negativeEtalon, 'g'); + }, + + getSign: function(text, format) { + if(text.replace(/[^0-9-]/g, '').charAt(0) === '-') { + return -1; + } + if(!format) { + return 1; + } + + const negativeEtalon = this.getNegativeEtalonRegExp(format); + return text.match(negativeEtalon) ? -1 : 1; + }, + + format: function(value, format) { + if(typeof value !== 'number') { + return value; + } + + if(typeof format === 'number') { + return value; + } + + format = format && format.formatter || format; + + if(typeof format === 'function') { + return format(value); + } + + format = this._normalizeFormat(format); + + if(!format.type) { + format.type = 'decimal'; + } + + const numberConfig = this._parseNumberFormatString(format.type); + + if(!numberConfig) { + const formatterConfig = this._getSeparators(); + formatterConfig.unlimitedIntegerDigits = format.unlimitedIntegerDigits; + return this.convertDigits(getFormatter(format.type, formatterConfig)(value)); + } + + return this._formatNumber(value, numberConfig, format); + }, + + parse: function(text, format) { + if(!text) { + return; + } + + if(format && format.parser) { + return format.parser(text); + } + + text = this.convertDigits(text, true); + + if(format && typeof format !== 'string') { + // Current parser functionality provided as-is and is independent of the most of capabilities of formatter. + errors.log('W0011'); + } + + const decimalSeparator = this.getDecimalSeparator(); + const regExp = new RegExp('[^0-9' + escapeRegExp(decimalSeparator) + ']', 'g'); + const cleanedText = text + .replace(regExp, '') + .replace(decimalSeparator, '.') + .replace(/\.$/g, ''); + + if(cleanedText === '.' || cleanedText === '') { + return null; + } + + if(this._calcSignificantDigits(cleanedText) > 15) { + return NaN; + } + + let parsed = (+cleanedText) * this.getSign(text, format); + + format = this._normalizeFormat(format); + const formatConfig = this._parseNumberFormatString(format.type); + + let power = formatConfig?.power; + + if(power) { + if(power === 'auto') { + const match = text.match(/\d(K|M|B|T)/); + if(match) { + power = find(Object.keys(LargeNumberFormatPostfixes), + power => LargeNumberFormatPostfixes[power] === match[1]); + } + } + parsed = parsed * Math.pow(10, (3 * power)); + } + + if(formatConfig?.formatType === 'percent') { + parsed /= 100; + } + + return parsed; + }, + + _calcSignificantDigits: function(text) { + const [ integer, fractional ] = text.split('.'); + const calcDigitsAfterLeadingZeros = digits => { + let index = -1; + for(let i = 0; i < digits.length; i++) { + if(digits[i] !== '0') { + index = i; + break; + } + } + return index > -1 ? digits.length - index : 0; + }; + let result = 0; + if(integer) { + result += calcDigitsAfterLeadingZeros(integer.split('')); + } + if(fractional) { + result += calcDigitsAfterLeadingZeros(fractional.split('').reverse()); + } + return result; + } +}); + +numberLocalization.inject(currencyLocalization); + +if(hasIntl) { + numberLocalization.inject(intlNumberLocalization); +} + +export default numberLocalization; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/open_xml_currency_format.js b/packages/f-theme-editor/farris-theme-editor/js/localization/open_xml_currency_format.js new file mode 100644 index 0000000000000000000000000000000000000000..b04dfe28d8bd12e7821f1d2934880cc93b3229c2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/open_xml_currency_format.js @@ -0,0 +1,37 @@ +export default (currencySymbol, accountingFormat) => { + if(!accountingFormat) { + return; + } + + let encodedCurrencySymbol = currencySymbol; + if(typeof currencySymbol === 'string') { + encodedCurrencySymbol = ''; + for(let i = 0; i < currencySymbol.length; i++) { + if(currencySymbol[i] !== '$') { + encodedCurrencySymbol += '\\'; + } + encodedCurrencySymbol += currencySymbol[i]; + } + } + + const encodeSymbols = { + '.00': '{0}', + '\'': '\\\'', + '\\(': '\\(', + '\\)': '\\)', + ' ': '\\ ', + '"': '"', + '\\¤': encodedCurrencySymbol + }; + + const result = accountingFormat.split(';'); + for(let i = 0; i < result.length; i++) { + for(const symbol in encodeSymbols) { + if(Object.prototype.hasOwnProperty.call(encodeSymbols, symbol)) { + result[i] = result[i].replace(new RegExp(symbol, 'g'), encodeSymbols[symbol]); + } + } + } + + return result.length === 2 ? result[0] + '_);' + result[1] : result[0]; +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/parentLocale.js b/packages/f-theme-editor/farris-theme-editor/js/localization/parentLocale.js new file mode 100644 index 0000000000000000000000000000000000000000..58862f431f315fff775851d1658c2155bde39087 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/parentLocale.js @@ -0,0 +1,12 @@ +/* eslint-disable import/no-commonjs */ +const PARENT_LOCALE_SEPARATOR = '-'; + +export default (parentLocales, locale) => { + const parentLocale = parentLocales[locale]; + + if(parentLocale) { + return parentLocale !== 'root' && parentLocale; + } + + return locale.substr(0, locale.lastIndexOf(PARENT_LOCALE_SEPARATOR)); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/localization/utils.js b/packages/f-theme-editor/farris-theme-editor/js/localization/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..0130673224888d04e10faabba2e148e023b42dec --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/localization/utils.js @@ -0,0 +1,24 @@ +import { sign } from '../core/utils/math'; + +const DECIMAL_BASE = 10; + +function roundByAbs(value) { + const valueSign = sign(value); + + return valueSign * Math.round(Math.abs(value)); +} + +function adjustValue(value, precision) { + const precisionMultiplier = Math.pow(DECIMAL_BASE, precision); + const roundMultiplier = precisionMultiplier * DECIMAL_BASE; + const intermediateValue = (value * roundMultiplier) / DECIMAL_BASE; + + return roundByAbs(intermediateValue) / precisionMultiplier; +} + +export function toFixed(value, precision) { + const valuePrecision = precision || 0; + const adjustedValue = valuePrecision > 0 ? adjustValue(...arguments) : value; + + return (adjustedValue).toFixed(valuePrecision); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_callback.js b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_callback.js new file mode 100644 index 0000000000000000000000000000000000000000..d2685da5a159b23c5c383c164f997e2642115af0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_callback.js @@ -0,0 +1,36 @@ +import { inArray } from '../core/utils/array'; + +export const hideCallback = (function() { + let callbacks = []; + return { + add: function(callback) { + const indexOfCallback = inArray(callback, callbacks); + if(indexOfCallback === -1) { + callbacks.push(callback); + } + }, + remove: function(callback) { + const indexOfCallback = inArray(callback, callbacks); + if(indexOfCallback !== -1) { + callbacks.splice(indexOfCallback, 1); + } + }, + fire: function() { + const callback = callbacks.pop(); + const result = !!callback; + if(result) { + callback(); + } + return result; + }, + hasCallback: function() { + return callbacks.length > 0; + } + ///#DEBUG + // eslint-disable-next-line comma-style + , reset: function() { + callbacks = []; + } + ///#ENDDEBUG + }; +})(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.d.ts b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..a08f6867382810de93c3855ece003afb3c96f95e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.d.ts @@ -0,0 +1,8 @@ +/** + * @docid + * @publicName hideTopOverlay() + * @return Boolean + * @namespace DevExpress + * @public + */ +export default function hideTopOverlay(): boolean; diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.js b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.js new file mode 100644 index 0000000000000000000000000000000000000000..40b4767a5021270a8b4b09902a78d001412f72e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/hide_top_overlay.js @@ -0,0 +1,5 @@ +import { hideCallback } from './hide_callback'; + +export default function() { + return hideCallback.fire(); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.d.ts b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..38c2470bb339291cdf0f411af3afa23d11195523 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.d.ts @@ -0,0 +1,10 @@ +/** + * @docid utils.initMobileViewport + * @publicName initMobileViewport(options) + * @param1_field1 allowZoom:Boolean + * @param1_field2 allowPan:Boolean + * @param1_field3 allowSelection:Boolean + * @namespace DevExpress.utils + * @public + */ +export default function initMobileViewport(options: { allowZoom?: boolean; allowPan?: boolean; allowSelection?: boolean }): void; diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.js b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.js new file mode 100644 index 0000000000000000000000000000000000000000..e653449b86fbc6c490b19cf1a08592ef069d1dd2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport.js @@ -0,0 +1,2 @@ +import { initMobileViewport } from './init_mobile_viewport/init_mobile_viewport'; +export default initMobileViewport; diff --git a/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport/init_mobile_viewport.js b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport/init_mobile_viewport.js new file mode 100644 index 0000000000000000000000000000000000000000..3d2ff07bea4e7f141d0952f65b0dd80074319093 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/mobile/init_mobile_viewport/init_mobile_viewport.js @@ -0,0 +1,94 @@ +import { getWidth, setWidth } from '../../core/utils/size'; +import $ from '../../core/renderer'; +import domAdapter from '../../core/dom_adapter'; +import { getWindow } from '../../core/utils/window'; +const window = getWindow(); +import eventsEngine from '../../events/core/events_engine'; +import { extend } from '../../core/utils/extend'; +import resizeCallbacks from '../../core/utils/resize_callbacks'; +import { supportProp, touch } from '../../core/utils/support'; +import { styleProp } from '../../core/utils/style'; +import devices from '../../core/devices'; + +export const initMobileViewport = function(options) { + options = extend({}, options); + let realDevice = devices.real(); + const allowZoom = options.allowZoom; + const allowPan = options.allowPan; + const allowSelection = ('allowSelection' in options) ? options.allowSelection : realDevice.platform === 'default'; + + const metaSelector = 'meta[name=viewport]'; + if(!$(metaSelector).length) { + $('').attr('name', 'viewport').appendTo('head'); + } + + const metaVerbs = ['width=device-width']; + const msTouchVerbs = []; + + if(allowZoom) { + msTouchVerbs.push('pinch-zoom'); + } else { + metaVerbs.push('initial-scale=1.0', 'maximum-scale=1.0, user-scalable=no'); + } + + if(allowPan) { + msTouchVerbs.push('pan-x', 'pan-y'); + } + + if(!allowPan && !allowZoom) { + $('html, body').css({ + 'msContentZooming': 'none', + 'msUserSelect': 'none', + 'overflow': 'hidden' + }); + } else { + $('html').css('msOverflowStyle', '-ms-autohiding-scrollbar'); + } + + if(!allowSelection && supportProp('userSelect')) { + $('.dx-viewport').css(styleProp('userSelect'), 'none'); + } + + $(metaSelector).attr('content', metaVerbs.join()); + $('html').css('msTouchAction', msTouchVerbs.join(' ') || 'none'); + + realDevice = devices.real(); + + if(touch) { + eventsEngine.off(domAdapter.getDocument(), '.dxInitMobileViewport'); + eventsEngine.on(domAdapter.getDocument(), 'dxpointermove.dxInitMobileViewport', function(e) { + const count = e.pointers.length; + const isTouchEvent = e.pointerType === 'touch'; + const zoomDisabled = !allowZoom && count > 1; + const panDisabled = !allowPan && count === 1 && !e.isScrollingEvent; + + if(isTouchEvent && (zoomDisabled || panDisabled)) { + e.preventDefault(); + } + }); + } + + if(realDevice.ios) { + const isPhoneGap = (domAdapter.getLocation().protocol === 'file:'); + + if(!isPhoneGap) { + // NOTE: fix app size after device rotation in Safari when keyboard was shown + resizeCallbacks.add(function() { + const windowWidth = getWidth(window); + setWidth($('body'), windowWidth); + }); + } + } + + if(realDevice.android) { + resizeCallbacks.add(function() { + setTimeout(function() { + const activeElement = domAdapter.getActiveElement(); + + activeElement.scrollIntoViewIfNeeded ? + activeElement.scrollIntoViewIfNeeded() : + activeElement.scrollIntoView(false); + }); + }); + } +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.d.ts b/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..da975f621b87c2bbb89d850b6e4f98ee50cb658f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.d.ts @@ -0,0 +1,187 @@ +import { DxPromise } from './core/utils/deferred'; +import dxDataGrid, { Column } from './ui/data_grid'; +import { ExportLoadPanel } from './exporter/export_load_panel'; +import dxGantt from './ui/gantt'; + +/** + * @docid + * @namespace DevExpress.pdfExporter + * @type object + */ +export interface PdfDataGridCell { + /** + * @docid + * @public + * @type dxDataGridColumn + */ + column?: Column; + /** + * @docid + * @public + */ + data?: any; + /** + * @docid + * @public + */ + groupIndex?: number; + /** + * @docid + * @public + */ + groupSummaryItems?: Array<{ + /** + * @docid + */ + name?: string; + /** + * @docid + */ + value?: any; + }>; + /** + * @docid + * @public + */ + rowType?: string; + /** + * @docid + * @public + */ + totalSummaryItemName?: string; + /** + * @docid + * @public + */ + value?: any; +} + +/** + * @docid + * @namespace DevExpress.pdfExporter + */ +export interface PdfExportDataGridProps { + /** + * @docid + * @default undefined + * @public + */ + jsPDFDocument?: object; + /** + * @docid + * @default undefined + * @public + */ + autoTableOptions?: object; + /** + * @docid + * @default undefined + * @public + */ + component?: dxDataGrid; + /** + * @docid + * @default false + * @public + */ + selectedRowsOnly?: boolean; + /** + * @docid + * @default true + * @public + */ + keepColumnWidths?: boolean; + /** + * @docid + * @type_function_param1 options:Object + * @type_function_param1_field2 pdfCell:Object + * @public + */ + customizeCell?: ((options: { gridCell?: PdfDataGridCell; pdfCell?: any }) => void); + /** + * @docid + * @public + */ + loadPanel?: ExportLoadPanel; +} + +/** + * @docid pdfExporter.exportDataGrid + * @publicName exportDataGrid(options) + * @return Promise + * @namespace DevExpress.pdfExporter + * @static + * @public + */ +export function exportDataGrid(options: PdfExportDataGridProps): DxPromise; + +/** + * @docid + * @namespace DevExpress.pdfExporter + */ + export interface PdfExportGanttProps { + /** + * @docid + * @type_function_param1 options:object + * @public + */ + createDocumentMethod?: ((options: any) => object); + /** + * @docid + * @default undefined + * @public + */ + jsPDFDocument?: object; + /** + * @docid + * @default undefined + * @public + */ + component?: dxGantt; + /** + * @docid + * @default undefined + * @public + */ + format?: string | object; + /** + * @docid + * @default true + * @public + */ + landscape?: boolean; + /** + * @docid + * @default undefined + * @public + */ + fileName?: string; + /** + * @docid + * @default undefined + * @public + */ + margins?: object; + /** + * @docid + * @type Enums.GanttPdfExportMode + * @public + */ + exportMode?: 'all' | 'treeList' | 'chart'; + /** + * @docid + * @type Enums.GanttPdfExportDateRange|object + * @public + */ + dateRange?: 'all' | 'visible' | object; +} + +/** + * @docid pdfExporter.exportGantt + * @publicName exportGantt(options) + * @return Promise + * @namespace DevExpress.pdfExporter + * @static + * @public + */ + export function exportGantt(options: PdfExportGanttProps): DxPromise; diff --git a/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.js b/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.js new file mode 100644 index 0000000000000000000000000000000000000000..4c268397c52761f74a4da937e06eedf447d836d7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/pdf_exporter.js @@ -0,0 +1,11 @@ +import { exportDataGrid } from './exporter/jspdf/export_data_grid'; +import { exportGantt } from './exporter/jspdf/export_gantt'; + +/** +* @name pdfExporter +* @section utils +*/ +export { + exportDataGrid, + exportGantt +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/js/renovation/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..ec0096e4610664ea73bde27b49275841715236fb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "overrides": [{ + "files": ["*.ts?(x)"], + "extends": ["devextreme/renovation-declarations"], + "excludedFiles": "**/__tests__/**/*" + }, { + "files": ["**/__tests__/**/*.ts?(x)", "**/test_utils/**/*.ts?(x)"], + "extends": ["devextreme/jest"] + }] +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/common/__tests__/config_provider.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/__tests__/config_provider.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e3f1447c579ae8b72781b86234a86e003ebbdb3f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/__tests__/config_provider.test.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { ConfigProvider, viewFunction } from '../config_provider'; + +describe('ConfigProvider', () => { + it('render', () => { + const tree = mount( + viewFunction({ + props: + { children:
, rtlEnabled: true }, + } as Partial as any), + ); + expect(tree.find('.child').exists()).toBe(true); + }); + + it('setup config provider value', () => { + const component = new ConfigProvider({ rtlEnabled: false, children: {} as JSX.Element }); + expect(component.config).toEqual({ rtlEnabled: false }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_context.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_context.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c9bf327a89d5fc6a86bb25c8a77d41659eacaed --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_context.ts @@ -0,0 +1,4 @@ +import { createContext } from '@devextreme-generator/declarations'; + +export interface ConfigContextValue { rtlEnabled?: boolean } +export const ConfigContext = createContext(undefined); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_provider.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_provider.tsx new file mode 100644 index 0000000000000000000000000000000000000000..61ce92ab81fa07e4b9537b32f64eea2fb1e5c8c5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/config_provider.tsx @@ -0,0 +1,28 @@ +import { + ComponentBindings, + JSXComponent, + OneWay, + Slot, + Provider, + Component, +} from '@devextreme-generator/declarations'; +import { ConfigContextValue, ConfigContext } from './config_context'; + +export const viewFunction = (viewModel: ConfigProvider): JSX.Element => viewModel.props.children; + +@ComponentBindings() +export class ConfigProviderProps { + @OneWay() rtlEnabled!: boolean; + + @Slot() children!: JSX.Element; +} + +@Component({ defaultOptionRules: null, view: viewFunction }) +export class ConfigProvider extends JSXComponent() { + @Provider(ConfigContext) + get config(): ConfigContextValue { + return { + rtlEnabled: this.props.rtlEnabled, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/common/types.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..3045a5fee0ac93dc98d523a5e5d10c37a15beeb6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/common/types.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type AbstractFunction = (...args: any) => any; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..0ddf84cd0585741a7477e1a88857c415cd5f287c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/.eslintrc.json @@ -0,0 +1,9 @@ +{ + "overrides": [{ + "files": ["*.ts?(x)"], + "rules": { + "no-underscore-dangle": "off", + "class-methods-use-this": "off" + } + }] +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/__tests__/data_grid.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/__tests__/data_grid.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..de0ec32232e374ff8fc1b9538fb52ab24eb48699 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/__tests__/data_grid.test.tsx @@ -0,0 +1,611 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import DataGridComponent from '../data_grid'; + +const mockInternalComponent = { + beginUpdate: jest.fn(), + endUpdate: jest.fn(), + isReady: jest.fn(), + getView: jest.fn(), + getController: jest.fn(), + state: jest.fn(), + on: jest.fn(), + option: jest.fn(), +}; + +const mockComponent = { + beginUpdate: jest.fn(), + endUpdate: jest.fn(), + _fireContentReady: jest.fn(), + _wrapKeyDownHandler: jest.fn(), + _renderWrapper: jest.fn(), + _invalidate: jest.fn(), + _setOptionsByReference: jest.fn(), + _setDeprecatedOptions: jest.fn(), + _getAdditionalProps: jest.fn(() => []), + _patchOptionValues: jest.fn((options) => options), + _notifyOptionChanged: jest.fn(), + _optionChanging: jest.fn(), + _optionChanged: jest.fn(), + silent: jest.fn(), + getOption: jest.fn(), + setOption: jest.fn(), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + beforeInitialization: (_instance) => { }, +}; +jest.mock('../common/component', () => class { + __options: Record; + + _options = { + silent: mockComponent.silent, + }; + + _isNodeReplaced = false; + + _deprecatedOptions: Record = { + }; + + _optionsByReference: Record = { + }; + + viewRef = { + getComponentInstance: () => mockInternalComponent, + }; + + constructor(_element: HTMLElement, options?: Record) { + this.__options = options ?? {}; + this._initializeComponent(); + this._initMarkup(); + } + + option(name: string, value: any) { + if (arguments.length === 0) { + return this.__options; + } + + if (arguments.length === 1) { + return mockComponent.getOption(name); + } + + if (arguments.length === 2) { + mockComponent.setOption(name, value); + this._invalidate(); + } + + return undefined; + } + + repaint() { + this._initMarkup(); + } + + _optionChanging() { + mockComponent._optionChanging(); + } + + _optionChanged() { + mockComponent._optionChanged(); + } + + _initializeComponent() { + mockComponent.beforeInitialization(this as any); + this._setDeprecatedOptions(); + this._setOptionsByReference(); + } + + _initMarkup() { + const props = { ...this.__options }; + const patchedProps = this._patchOptionValues(props); + + this._renderWrapper(patchedProps); + this._fireContentReady(); + } + + _patchOptionValues(options: Record): Record { + const result = {}; + const dataGridProps = ['dataSource', 'export']; + dataGridProps.concat(this._getAdditionalProps()).forEach((name) => { + if (name in options) { + result[name] = options[name]; + } + }); + + return result; + } + + _renderWrapper(options: Record): void { + mockComponent._renderWrapper(options); + (options.onInitialized as Function)?.({}); + this._isNodeReplaced = true; + } + + beginUpdate() { + return mockComponent.beginUpdate(); + } + + endUpdate() { + return mockComponent.endUpdate(); + } + + _fireContentReady(): void { + return mockComponent._fireContentReady(); + } + + _wrapKeyDownHandler(handler: Function): Function { + return mockComponent._wrapKeyDownHandler(handler); + } + + _invalidate(): void { + mockComponent._invalidate(); + } + + _setOptionsByReference(): void { + this._optionsByReference.baseOptionByReference = true; + } + + _setDeprecatedOptions(): void { + this._deprecatedOptions.baseDeprecatedOption = true; + } + + _getDefaultOptions(): Record { + return { baseOption: true, rowTemplate: null }; + } + + _getAdditionalProps(): string[] { + return ['baseAdditionalProp']; + } + + _notifyOptionChanged(name: string, value: any, prevValue: any): void { + mockComponent._notifyOptionChanged(name, value, prevValue); + this._invalidate(); + } +}); + +describe('DataGrid Wrapper', () => { + beforeEach(() => jest.resetAllMocks()); + + const createDataGrid = ( + options?: any, + ) => new DataGridComponent({} as HTMLElement, options); + + it('options by reference', () => { + const component = createDataGrid(); + + expect(component._optionsByReference).toEqual({ + baseOptionByReference: true, + focusedRowKey: true, + 'editing.editRowKey': true, + 'editing.changes': true, + }); + }); + + it('should not fail on server side rendering', () => { + const component = new DataGridComponent({} as any, {}); + // It's server side rendering + component._getInternalInstance = () => undefined as any; + // It's first render + component._isNodeReplaced = false; + expect(() => component._renderWrapper({})).not.toThrow(); + }); + + it('deprecated options', () => { + const component = createDataGrid(); + + expect(component._deprecatedOptions).toEqual({ + baseDeprecatedOption: true, + useKeyboard: { since: '19.2', alias: 'keyboardNavigation.enabled' }, + rowTemplate: { since: '21.2', message: 'Use the "dataRowTemplate" option instead' }, + onToolbarPreparing: { since: '21.2', message: 'Use the "toolbar" option instead' }, + }); + }); + + it('base component additional props should be passed to ViewComponent', () => { + createDataGrid({ + baseAdditionalProp: true, + }); + + expect(mockComponent._renderWrapper).toBeCalledWith({ + onInitialized: undefined, + baseAdditionalProp: true, + }); + }); + + it('additional props should be passed to ViewComponent', () => { + const viewComponentProps = { + onInitialized: () => {}, + onColumnsChanging: true, + integrationOptions: true, + adaptColumnWidthByRatio: true, + useLegacyKeyboardNavigation: true, + templatesRenderAsynchronously: true, + forceApplyBindings: true, + nestedComponentOptions: true, + }; + + createDataGrid({ + ...viewComponentProps, + customProp: true, + }); + + expect(mockComponent._renderWrapper).toBeCalledWith({ + ...viewComponentProps, + onInitialized: expect.any(Function), + }); + }); + + it('editing.customizeExcelCell should have corrent component instance', () => { + const customizeExcelCell = jest.fn(); + + const instance = createDataGrid({ + export: { + customizeExcelCell, + }, + }); + + mockComponent._renderWrapper.mock.calls[0][0].export.customizeExcelCell({}); + + expect(customizeExcelCell).toBeCalledWith({ + component: instance, + }); + }); + + it('onInitialized option should not be defined in _initializeComponent', () => { + const onInitialized = () => { }; + let onInitializedInInitializeComponent: unknown = {}; + + mockComponent.beforeInitialization = (component) => { + onInitializedInInitializeComponent = component.option().onInitialized; + }; + + createDataGrid({ onInitialized }); + + expect(onInitializedInInitializeComponent).toBe(null); + expect(mockComponent._renderWrapper).toBeCalledWith({ + onInitialized: expect.any(Function), + }); + }); + + it('onInitialized should have correct component parameter', () => { + const onInitialized = jest.fn(); + + const component = createDataGrid({ onInitialized }); + + expect(onInitialized).toBeCalledWith({ + component, + }); + }); + + it('subscribe to internal optionChanged event', () => { + createDataGrid(); + + expect(mockInternalComponent.on).toBeCalledTimes(1); + expect(mockInternalComponent.on).toBeCalledWith('optionChanged', expect.any(Function)); + }); + + it('not subscribe to internal optionChanged event on repaint', () => { + const component = createDataGrid(); + + expect(mockInternalComponent.on).toBeCalledTimes(1); + + component.repaint(); + + expect(mockInternalComponent.on).toBeCalledTimes(1); + }); + + it('_createTemplateComponent should pass template without processing', () => { + const component = createDataGrid(); + + const templateComponent = component._createTemplateComponent('myTemplate'); + + expect(templateComponent).toBe('myTemplate'); + }); + + it('_wrapKeyDownHandler should pass handler without processing', () => { + const component = createDataGrid(); + + const handler = () => { }; + + const wrappedHandler = component._wrapKeyDownHandler(handler); + + expect(wrappedHandler).toBe(handler); + }); + + describe('_optionChanging', () => { + it('no viewRef', () => { + const component: any = createDataGrid(); + component.viewRef = null; + component._optionChanging('pager.pageSize', 5, 10); + expect(mockComponent._optionChanging).toBeCalledTimes(1); + }); + + it('complex option changed', () => { + const component: any = createDataGrid(); + const prevProps = { pager: { pageSize: 5 } }; + component.__options = prevProps; + component.viewRef.prevProps = prevProps; + component._optionChanging('pager.pageSize', 5, 10); + // emulate base component mutable option change + component.__options.pager.pageSize = 10; + // value in prev props shouldn't change for future getUpdatedOptions + expect(prevProps.pager).not.toBe(component.viewRef.prevProps.pager); + expect(component.viewRef.prevProps.pager.pageSize).toBe(5); + }); + + it('option changed with complex object value', () => { + const component: any = createDataGrid(); + const options = { dataSource: { store: { data: [1] } } }; + component.__options = options; + component.viewRef.prevProps = options; + component._optionChanging('dataSource', options.dataSource, { dataSource: { store: { data: [1, 2] } } }); + // emulate base component mutable option change + component.__options.dataSource.store.data = [1, 2]; + // value in prev props shouldn't change for future getUpdatedOptions + const { prevProps } = component.viewRef; + expect(options.dataSource).not.toBe(prevProps.dataSource); + expect(options.dataSource.store).not.toBe(prevProps.dataSource.store); + expect(options.dataSource.store.data).not.toBe(prevProps.dataSource.store.data); + expect(prevProps.dataSource.store.data).toEqual([1]); + }); + + it('integrationOptions changed', () => { + const component: any = createDataGrid(); + const options = { option: 'value' }; + component.__options = options; + component.viewRef.prevProps = options; + component._optionChanging('integrationOptions', undefined, { template: { 'some.nested.string': 'value' } }); + expect(options).not.toContain('integrationOptions'); + }); + + it('editing complex option changed', () => { + const component: any = createDataGrid(); + const prevProps = { editing: { editRowKey: null } }; + component.__options = prevProps; + component.viewRef.prevProps = prevProps; + component._optionChanging('editing.editRowKey', null, 1); + // emulate base component mutable option change + component.__options.editing.editRowKey = 1; + // value in prev props shouldn't change for future getUpdatedOptions + expect(prevProps.editing).not.toBe(component.viewRef.prevProps.editing); + expect(component.viewRef.prevProps.editing.editRowKey).toBe(null); + }); + + it('option changed to same value', () => { + const component: any = createDataGrid(); + const prevProps = { selectedRowKeys: undefined }; + component.__options = { selectedRowKeys: [{ field1: 1, field2: 2 }] }; + component.viewRef.prevProps = prevProps; + component._optionChanging('selectedRowKeys', prevProps.selectedRowKeys, prevProps.selectedRowKeys); + expect(prevProps.selectedRowKeys).toBe(component.viewRef.prevProps.selectedRowKeys); + }); + }); + + describe('_optionChanged', () => { + it('no viewRef', () => { + const component: any = createDataGrid(); + component.viewRef = null; + component._optionChanged(); + expect(mockComponent._optionChanged).toBeCalledTimes(1); + }); + + it('If dataSource not changed update it directly for refresh data', () => { + const dataSource = {}; + const component: any = createDataGrid(); + component.__options = { dataSource }; + mockInternalComponent.option.mockReturnValueOnce(dataSource); + component._optionChanged({ fullName: 'dataSource', value: dataSource }); + expect(mockInternalComponent.option).toBeCalledTimes(2); + expect(mockInternalComponent.option).toBeCalledWith('dataSource', dataSource); + }); + + it('If editing.changes not changed update it directly for refresh data', () => { + const changes: Object[] = []; + const component: any = createDataGrid(); + component.__options = { editing: { changes } }; + mockInternalComponent.option.mockReturnValueOnce(changes); + changes.push({ key: 1, type: 'update', data: { updated: true } }); + component._optionChanged({ fullName: 'editing.changes', value: changes }); + expect(mockInternalComponent.option).toBeCalledTimes(2); + expect(mockInternalComponent.option).toBeCalledWith('editing.changes', changes); + }); + }); + + describe('_internalOptionChangedHandler and _invalidate', () => { + it('option change should call _invalidate', () => { + const component = createDataGrid(); + + expect(mockComponent._invalidate).toBeCalledTimes(0); + + component.option('someOption', true); + + expect(mockComponent._invalidate).toBeCalledTimes(1); + }); + + it('_notifyOptionChanged should be called if column option is changed in internal widget', () => { + const component = createDataGrid(); + + component._internalOptionChangedHandler({ + name: 'columns', + fullName: 'columns[0].visible', + previousValue: false, + value: true, + component: component._getInternalInstance(), + element: {} as HTMLElement, + }); + + expect(mockComponent._notifyOptionChanged).toBeCalledTimes(1); + expect(mockComponent._optionChanged).toBeCalledTimes(0); + }); + + it('_notifyOptionChanged should not be called if column option is changed to the same value in internal widget', () => { + const component = createDataGrid(); + + component._internalOptionChangedHandler({ + name: 'columns', + fullName: 'columns[0].visible', + previousValue: true, + value: true, + component: component._getInternalInstance(), + element: {} as HTMLElement, + }); + + expect(mockComponent._notifyOptionChanged).toBeCalledTimes(0); + }); + + it('_notifyOptionChanged should not be called if option is not changed in internal widget', () => { + const component = createDataGrid(); + + mockComponent.getOption.mockReturnValue(false); + + component._internalOptionChangedHandler({ + name: 'columns', + fullName: 'columns[0].visible', + previousValue: true, + value: false, + component: component._getInternalInstance(), + element: {} as HTMLElement, + }); + + expect(mockComponent.getOption).toBeCalledTimes(1); + expect(mockComponent.getOption).toBeCalledWith('columns[0].visible'); + expect(mockComponent._notifyOptionChanged).toBeCalledTimes(0); + }); + + it('_notifyOptionChanged and option should not be called if first level option is changed in internal widget', () => { + const component = createDataGrid(); + + component._internalOptionChangedHandler({ + name: 'selectedRowKeys', + fullName: 'selectedRowKeys', + previousValue: [], + value: [1], + component: component._getInternalInstance(), + element: {} as HTMLElement, + }); + + expect(mockComponent._notifyOptionChanged).toBeCalledTimes(0); + expect(mockComponent.setOption).toBeCalledTimes(0); + }); + + it('option should be called if second level option is changed in internal widget', () => { + const component = createDataGrid(); + + component._internalOptionChangedHandler({ + name: 'editing', + fullName: 'editing.editRowKey', + previousValue: null, + value: 1, + component: component._getInternalInstance(), + element: {} as HTMLElement, + }); + + expect(mockComponent._notifyOptionChanged).toBeCalledTimes(0); + expect(mockComponent.silent).toBeCalledTimes(1); + expect(mockComponent.silent).toBeCalledWith('editing.editRowKey', null); + expect(mockComponent.setOption).toBeCalledTimes(1); + expect(mockComponent.setOption).toBeCalledWith('editing.editRowKey', 1); + }); + }); + + describe('public methods', () => { + it('beginUpdate', () => { + const component = createDataGrid(); + + component.beginUpdate(); + + expect(mockComponent.beginUpdate).toBeCalledTimes(1); + expect(mockInternalComponent.beginUpdate).toBeCalledTimes(1); + }); + + it('endUpdate', () => { + const component = createDataGrid(); + + component.endUpdate(); + + expect(mockComponent.endUpdate).toBeCalledTimes(1); + expect(mockInternalComponent.endUpdate).toBeCalledTimes(1); + }); + + it('getController', () => { + const component = createDataGrid(); + + mockInternalComponent.getController.mockReturnValue('testController'); + + const controller = component.getController('editing'); + + expect(controller).toBe('testController'); + expect(mockInternalComponent.getController).toBeCalledWith('editing'); + }); + + it('getView', () => { + const component = createDataGrid(); + + mockInternalComponent.getView.mockReturnValue('testView'); + + const view = component.getView('rowsView'); + + expect(view).toBe('testView'); + expect(mockInternalComponent.getView).toBeCalledWith('rowsView'); + }); + + it('isReady', () => { + const component = createDataGrid(); + + mockInternalComponent.isReady.mockReturnValue(true); + + const isReady = component.isReady(); + + expect(isReady).toBe(true); + expect(mockInternalComponent.isReady).toBeCalled(); + }); + + it('state without parameters', () => { + const component = createDataGrid(); + + const state = {}; + + mockInternalComponent.state.mockReturnValue(state); + + const stateResult = component.state(); + + expect(stateResult).toBe(state); + expect(mockInternalComponent.state).toBeCalledWith(); + }); + + it('state with parameter', () => { + const component = createDataGrid(); + + const state = {}; + + const stateResult = component.state(state); + + expect(stateResult).toBe(undefined); + expect(mockInternalComponent.state).toBeCalledWith(state); + }); + + it('default options should not contain rowTemplate because it is deprecated', () => { + const dataGrid = createDataGrid({}); + + const defaultOptions = dataGrid._getDefaultOptions(); + + expect('rowTemplate' in defaultOptions).toBe(false); + expect(defaultOptions.baseOption).toBe(true); + }); + + test.each` + methodName + ${'beginUpdate'} + ${'endUpdate'} + ${'getController'} + ${'getView'} + ${'isReady'} + ${'state'} + `('$methodName call is viewRef is not defined', ({ methodName }) => { + const component = createDataGrid(); + + (component as any).viewRef = null; + + component[methodName](); + + expect.assertions(0); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/button.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/button.ts new file mode 100644 index 0000000000000000000000000000000000000000..3a20a2c6e501ac360f74b8688f800acd0901a8d8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/button.ts @@ -0,0 +1,138 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +// eslint-disable-next-line import/named +import { dxElementWrapper } from '../../core/renderer'; +import ValidationEngine from '../../ui/validation_engine'; +import Component from './common/component'; +import type { Button } from '../ui/button'; +import { Option } from './common/types'; +import { getImageSourceType } from '../../core/utils/icon'; + +export default class ButtonWrapper extends Component { + _clickAction!: (...args) => unknown; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + get _validationGroupConfig(): any { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return ValidationEngine.getGroupConfig(this._findGroup()); + } + + getDefaultTemplateNames(): string[] { + return ['content']; + } + + getSupportedKeyNames(): string[] { + return ['space', 'enter']; + } + + getProps(): Record { + const props = super.getProps(); + + props.onClick = ({ event }): void => { + this._clickAction({ event, validationGroup: this._validationGroupConfig }); + }; + + const iconType = getImageSourceType(props.icon); + if (iconType === 'svg') { + props.iconTemplate = this._createTemplateComponent(() => props.icon); + } + + return props; + } + + get _templatesInfo(): Record { + return { template: 'content' }; + } + + _toggleActiveState(_: HTMLElement, value: boolean): void { + const button = this.viewRef as Button; + value ? button.activate() : button.deactivate(); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + _getSubmitAction(): any { + let needValidate = true; + let validationStatus = 'valid'; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (this as any)._createAction(({ event, submitInput }) => { + if (needValidate) { + const validationGroup = this._validationGroupConfig; + + if (validationGroup !== undefined && validationGroup !== '') { + const { status, complete } = validationGroup.validate(); + + validationStatus = status; + + if (status === 'pending') { + needValidate = false; + this.option('disabled', true); + + complete.then(() => { + needValidate = true; + this.option('disabled', false); + + validationStatus = status; + validationStatus === 'valid' && submitInput.click(); + }); + } + } + } + + validationStatus !== 'valid' && event.preventDefault(); + event.stopPropagation(); + }); + } + + _init(): void { + super._init(); + this._addAction('onSubmit', this._getSubmitAction()); + this._clickAction = this._createClickAction(); + } + + _initMarkup(): void { + super._initMarkup(); + + const $content = (this.$element() as unknown as dxElementWrapper).find('.dx-button-content'); + const $template = $content.children().filter('.dx-template-wrapper'); + const $input = $content.children().filter('.dx-button-submit-input'); + + if ($template.length) { + $template.addClass('dx-button-content'); + $template.append($input); + $content.replaceWith($template); + } + } + + _patchOptionValues(options: Record): Record { + return super._patchOptionValues({ ...options, templateData: options._templateData }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + _findGroup(): any { + const $element = this.$element(); + const validationGroup = this.option('validationGroup'); + return validationGroup !== undefined && validationGroup !== '' + ? validationGroup + // eslint-disable-next-line @typescript-eslint/no-explicit-any + : (ValidationEngine as any).findGroup($element, (this as any)._modelByElement($element)); + } + + _createClickAction(): (...args) => unknown { + return this._createActionByOption('onClick', { + excludeValidators: ['readOnly'], + }); + } + + _optionChanged(option: Option): void { + switch (option.name) { + case 'onClick': + this._clickAction = this._createClickAction(); + break; + default: + break; + } + + super._optionChanged(option); + } +} +/* eslint-enable @typescript-eslint/no-unsafe-member-access */ diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/component.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/component.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..683d9a4c6d2f72573dc915c91ca733d7ae8a3266 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/component.test.tsx @@ -0,0 +1,1226 @@ +/** + * @jest-environment jsdom + */ +// eslint-disable-next-line import/named +import renderer, { dxElementWrapper } from '../../../../core/renderer'; +import './utils/test_components/empty'; +import './utils/test_components/base'; +import './utils/test_components/options'; +import './utils/test_components/templated'; +import './utils/test_components/non_templated'; +import './utils/test_components/children'; +import './utils/test_components/invalid'; +import './utils/test_components/aria'; +import { + defaultEvent, + emitKeyboard, + KEY, +} from '../../../test_utils/events_mock'; +import { setPublicElementWrapper } from '../../../../core/element'; +import * as UpdatePropsImmutable from '../../utils/update_props_immutable'; +import registerEvent from '../../../../events/core/event_registrator'; +import { one } from '../../../../events'; +import KeyboardProcessor from '../../../../events/core/keyboard_processor'; + +const fakeEventSingleton = new class { + handlerCount = 0; + + add() { this.handlerCount += 1; } + + remove() { this.handlerCount -= 1; } +}(); + +registerEvent('dxFakeEvent', fakeEventSingleton); + +const $ = renderer as (el: string | Element | dxElementWrapper) => dxElementWrapper & { + dxEmptyTestWidget: any; + dxTestWidget: any; + dxInvalidTestWidget: any; + dxOptionsTestWidget: any; + dxTemplatedTestWidget: any; + dxNonTemplatedTestWidget: any; + dxChildrenTestWidget: any; + dxAriaTestWidget: any; +}; + +beforeEach(() => { + document.body.innerHTML = ` +
+
+
+ `; +}); + +afterEach(() => { + $('#components').empty(); + document.body.innerHTML = ''; +}); + +describe('Misc cases', () => { + it('empty component creation does not fail', () => { + expect(() => $('#component').dxEmptyTestWidget({})).not.toThrowError(); + }); + + it('component creation does not fail if component does not have template', () => { + expect(() => { $('#component').dxNonTemplatedTestWidget({}); }).not.toThrow(); + }); + + it('on disposing should clean effects', () => { + const subscribeEffect = jest.fn(); + const unsubscribeEffect = jest.fn(); + $('#component').dxTestWidget({ + subscribeEffect, + unsubscribeEffect, + }); + + expect(subscribeEffect).toHaveBeenCalledTimes(1); + expect(unsubscribeEffect).toHaveBeenCalledTimes(0); + + $('#components').empty(); + + expect(subscribeEffect).toHaveBeenCalledTimes(1); + expect(unsubscribeEffect).toHaveBeenCalledTimes(1); + }); + + it('on repaint should clean effects', () => { + const subscribeEffect = jest.fn(); + const unsubscribeEffect = jest.fn(); + const instance = $('#component').dxTestWidget({ + subscribeEffect, + unsubscribeEffect, + }).dxTestWidget('instance'); + + expect(subscribeEffect).toHaveBeenCalledTimes(1); + expect(unsubscribeEffect).toHaveBeenCalledTimes(0); + + instance.repaint(); + + expect(subscribeEffect).toHaveBeenCalledTimes(2); + expect(unsubscribeEffect).toHaveBeenCalledTimes(1); + }); + + it('should not throw error on disposing nested widget when call "empty()" on parent node', () => { + const $component = $('#component'); + + $('
').appendTo($component).dxTemplatedTestWidget({}); + $component.dxTemplatedTestWidget({}); + + expect(() => $('#components').empty()).not.toThrowError(); + }); + + it('should forward API calls to component', () => { + $('#component').dxTestWidget({ text: 'check api' }); + const apiCallResult = $('#component').dxTestWidget('apiMethodCheck', '1', '2'); + + expect(apiCallResult).toBe('check api - 1 - 2'); + }); + + it('setAria pass aria prop to the widget', () => { + const $component = $('#component'); + $component.dxAriaTestWidget(); + + $component.dxAriaTestWidget('setAria', 'role', 'custom'); + + expect($component.dxAriaTestWidget('getLastPassedProps')).toMatchObject({ + aria: { role: 'custom' }, + }); + }); + + describe('API with Element type params/return type', () => { + it('pass DOM node to if provided parameter is jQuery wrapper', () => { + const element = document.createElement('div'); + const wrapper = $(element); + + $('#component').dxTestWidget({}); + + const checkParam = $('#component').dxTestWidget('methodWithElementParam', wrapper); + + expect(checkParam.arg).toEqual(element); + }); + + it('leave param as is if it is not jQuery wrapper', () => { + $('#component').dxTestWidget({}); + + const checkParam = $('#component').dxTestWidget('methodWithElementParam', 15); + + expect(checkParam.arg).toEqual(15); + }); + + it('wraps return value with jQuery and gets public element', () => { + const getPublicElement = jest.fn(($el) => $el.get(0)); + setPublicElementWrapper(getPublicElement); + + const element = document.createElement('div'); + + $('#component').dxTestWidget({}); + + const checkParam = $('#component').dxTestWidget('methodReturnElement', element); + + expect(checkParam).toEqual(element); + + expect(getPublicElement).toBeCalledTimes(1); + expect(getPublicElement).toHaveBeenNthCalledWith(1, $(element)); + }); + }); +}); + +describe('Widget\'s container manipulations', () => { + describe('classes', () => { + it('should add widget class', () => { + $('#component').dxTestWidget({}); + + expect($('#component')[0].className).toBe('dx-test-widget'); + }); + + it('should save container initial classes', () => { + $('#component').addClass('test-class'); + $('#component').addClass('dx-test-class'); + $('#component').dxTestWidget({}); + $('#component').addClass('runtime-added-class'); + + expect($('#component')[0].className).toBe('dx-test-widget test-class dx-test-class runtime-added-class'); + + $('#component').dxTestWidget('repaint'); + expect($('#component')[0].className).toBe('dx-test-widget test-class dx-test-class'); + }); + + it('should save classes, added in runtime', () => { + $('#component').dxTestWidget({}); + $('#component').addClass('test-class'); + $('#component').addClass('dx-test-class'); + + expect($('#component')[0].className).toBe('dx-test-widget test-class dx-test-class'); + + $('#component').dxTestWidget('instance').option('text', 'updated'); + expect($('#component')[0].className).toBe('dx-test-widget test-class dx-test-class'); + }); + + it('should allow to remove initial classes', () => { + $('#component').addClass('test-class'); + $('#component').addClass('dx-test-class'); + $('#component').dxTestWidget({}); + + $('#component').removeClass('dx-test-class'); + + $('#component').dxTestWidget('instance').option('text', 'updated'); + expect($('#component')[0].className).toBe('dx-test-widget test-class'); + }); + + it('should allow to remove added classes', () => { + $('#component').dxTestWidget({}); + $('#component').addClass('test-class'); + $('#component').addClass('dx-test-class'); + + $('#component').removeClass('dx-test-class'); + + $('#component').dxTestWidget('instance').option('text', 'updated'); + expect($('#component')[0].className).toBe('dx-test-widget test-class'); + }); + + it('should allow to switch widget classes', () => { + $('#component').dxTestWidget({}); + $('#component').addClass('test-class'); + $('#component').addClass('dx-test-class'); + + $('#component').removeClass('dx-test-widget'); + $('#component').dxTestWidget('instance').option('text', 'updated_1'); + expect($('#component')[0].className).toBe('test-class dx-test-class'); + + $('#component').addClass('dx-test-widget'); + $('#component').dxTestWidget('instance').option('text', 'updated_2'); + expect($('#component')[0].className).toBe('test-class dx-test-class dx-test-widget'); + }); + }); + + it('repaint redraws component only one time', () => { + $('#component').css('width', '123px'); + $('#component').css('height', '456px'); + $('#component').addClass('custom-css-class'); + + const subscribeEffect = jest.fn(); + $('#component').dxTestWidget({ + subscribeEffect, + }); + + $('#component').dxTestWidget('repaint'); + + expect(subscribeEffect).toHaveBeenCalledTimes(2); + + expect(subscribeEffect.mock.calls[1][0]).toMatchObject({ + className: 'custom-css-class', + style: { width: '123px', height: '456px' }, + }); + }); + + it('component\'s root replaces widget\'s container', () => { + $('#component').dxTestWidget({}); + + expect($('.dx-test-widget')[0]).toBe($('#component')[0]); + }); + + it('component\'s root is widget\'s container after repaint', () => { + $('#component').dxTestWidget({}); + $('#component').dxTestWidget('repaint'); + + expect($('.dx-test-widget')[0]).toBe($('#component')[0]); + }); + + it('component\'s root is widget\'s container after render in detached container', () => { + const $container = $('#component'); + const parent = $container.parent(''); + $container.remove($container); + $container.dxTestWidget({ text: 'test' }); + + $container.appendTo(parent); + + expect($('.dx-test-widget')[0]).not.toBe(undefined); + expect($('.dx-test-widget')[0]).toBe($('#component')[0]); + }); + + it('component\'s root is widget\'s container after render in detached container and repaint', () => { + const $container = $('#component'); + const parent = $container.parent(''); + $container.remove($container); + $container.dxTestWidget({ text: 'test' }); + + $container.appendTo(parent); + $container.dxTestWidget('repaint'); + + expect($('.dx-test-widget')[0]).not.toBe(undefined); + expect($('.dx-test-widget')[0]).toBe($('#component')[0]); + }); + + it('html tree is correct after repaint detached component', () => { + const $container = $('#component'); + const parent = $container.parent(''); + $container.remove($container); + $container.dxTestWidget({ text: 'test' }); + + $container.appendTo(parent); + $container.dxTestWidget('repaint'); + $container.detach(); + $container.dxTestWidget('repaint'); + $container.appendTo(parent); + $container.dxTestWidget('repaint'); + + expect($('.dx-test-widget')[0]).not.toBe(undefined); + expect($('.dx-test-widget')[0]).toBe($('#component')[0]); + }); + + it('pass custom class and attributes (with id) as props on first render', () => { + $('#component').attr('id', 'my-id'); + $('#my-id').addClass('custom-css-class'); + $('#my-id').addClass('dx-custom-css-class'); + $('#my-id').attr('data-custom-attr', 'attr-value'); + + $('#my-id').dxTestWidget({}); + + expect($('#my-id').dxTestWidget('getLastPassedProps')).toMatchObject({ + id: 'my-id', + className: 'custom-css-class dx-custom-css-class', + class: '', + 'data-custom-attr': 'attr-value', + }); + }); + + it('keep passing custom class and attributes (with id) props on repaint', () => { + $('#component').attr('id', 'my-id'); + $('#my-id').addClass('custom-css-class'); + $('#my-id').addClass('dx-custom-css-class'); + $('#my-id').attr('data-custom-attr', 'attr-value'); + $('#my-id').dxTestWidget({}); + + $('#my-id').dxTestWidget('repaint'); + + expect($('#my-id').dxTestWidget('getLastPassedProps')).toMatchObject({ + id: 'my-id', + className: 'custom-css-class dx-custom-css-class', + class: '', + 'data-custom-attr': 'attr-value', + }); + }); + + it('should convert elementAttr.style string to the cssText prop', () => { + const instance = $('#component') + .dxTestWidget({ elementAttr: { style: 'background-color: red;' } }) + .dxTestWidget('instance'); + + expect(instance._viewRef.current.props.cssText).toStrictEqual('background-color: red;'); + }); + + it('widget does not show className option', () => { + $('#component').addClass('custom-css-class'); + + $('#component').dxTestWidget({}); + + expect($('#component').dxTestWidget('option')).not.toHaveProperty('className'); + }); + + it('replace id on container with id from elementAttr option', () => { + $('#component').attr('id', 'my-id'); + + $('#my-id').dxTestWidget({ elementAttr: { id: 'attr-id' } }); + + expect($('#attr-id').dxTestWidget('getLastReceivedProps').id).toBe('attr-id'); + }); + + it('merge unique css classes from elementAttr option with container class', () => { + $('#component').addClass('custom-css-class attr-class'); + + $('#component').dxTestWidget({ elementAttr: { class: 'attr-css-class attr-class' } }); + + const { className } = $('#component').dxTestWidget('getLastReceivedProps'); + + expect(className).toBe('custom-css-class attr-class attr-css-class'); + }); + + it('keep elementAttr option untouched', () => { + $('component').addClass('custom-css-class attr-class'); + $('#component').attr('data-custom-attr', 'attr-value'); + + $('#component').dxTestWidget({ elementAttr: { id: 'attr-id', class: 'attr-css-class attr-class' } }); + + expect($('#attr-id').dxTestWidget('option').elementAttr).toEqual({ id: 'attr-id', class: 'attr-css-class attr-class' }); + }); + + it('pass style as key_value pair to props', () => { + $('#component').css('width', '123.5px'); + $('#component').css('height', '456.6px'); + + $('#component').dxTestWidget({}); + + expect($('#component').dxTestWidget('getLastReceivedProps').style).toEqual({ + width: '123.5px', + height: '456.6px', + }); + }); + + it('pass updated style on repaint', () => { + $('#component').css('width', '123.5px'); + $('#component').css('height', '456.6px'); + + $('#component').dxTestWidget({}); + + $('#component').css('width', '23.5px'); + $('#component').css('height', '56.6px'); + $('#component').css('display', 'inline'); + + $('#component').dxTestWidget('repaint'); + + expect($('#component').dxTestWidget('getLastReceivedProps').style).toEqual({ + width: '23.5px', + height: '56.6px', + display: 'inline', + }); + }); + + it('component container should not change its position in parent container', () => { + $('#components').append($('
')).prepend($('
')); + + $('#component').dxTestWidget({}); + + expect($('#components').children().get(1)).toBe($('#component').get(0)); + }); + + it('should be rendered not in "div" container', () => { + document.body.innerHTML = ` +
+ +
+ `; + + expect(() => $('#component').dxTestWidget({})).not.toThrowError(); + expect($('#component')[0].nodeName.toLowerCase()).toBe('a'); + }); +}); + +describe('option', () => { + it('should return default props of component', () => { + $('#component').dxOptionsTestWidget({}); + + expect($('#component').dxOptionsTestWidget('option').text).toBe('default text'); + }); + + it('should copy default props of component (not by reference)', () => { + document.body.innerHTML = ` +
+
+
+
+ `; + + $('#component1').dxOptionsTestWidget({}); + $('#component2').dxOptionsTestWidget({}); + + const objectProp1 = $('#component1').dxOptionsTestWidget('option').objectProp; + const objectProp2 = $('#component2').dxOptionsTestWidget('option').objectProp; + + expect(objectProp1).not.toBe(objectProp2); + }); + + it('nested option changed', () => { + const component = $('#component').dxOptionsTestWidget({}).dxOptionsTestWidget('instance'); + expect(component.getLastReceivedProps().nestedObject.nestedProp).toBe('default value'); + const { nestedObject } = component.getLastReceivedProps(); + const spyUpdatePropsImmutable = jest.spyOn(UpdatePropsImmutable, 'updatePropsImmutable'); + + component.option('nestedObject.nestedProp', 'new value'); + expect(spyUpdatePropsImmutable).toBeCalledWith( + // eslint-disable-next-line no-underscore-dangle + component._props, + component.option(), + 'nestedObject', + 'nestedObject.nestedProp', + ); + + expect(component.getLastReceivedProps().nestedObject).not.toBe(nestedObject); + expect(component.getLastReceivedProps().nestedObject.nestedProp).toBe('new value'); + }); + + it('should return default value of TwoWay prop', () => { + $('#component').dxOptionsTestWidget({}); + + expect($('#component').dxOptionsTestWidget('option').twoWayProp).toBe(1); + }); + + it('should return updated value of TwoWay prop', () => { + $('#component').dxOptionsTestWidget({}); + + $('#component').dxOptionsTestWidget('updateTwoWayPropCheck'); + + expect($('#component').dxOptionsTestWidget('option').twoWayProp).toBe(2); + }); + + it('fires optionChanged on TwoWay prop change', () => { + const optionChanged = jest.fn(); + $('#component').dxOptionsTestWidget({ + onOptionChanged: optionChanged, + }); + + $('#component').dxOptionsTestWidget('updateTwoWayPropCheck'); + + expect(optionChanged).toBeCalledTimes(1); + expect(optionChanged.mock.calls[0][0]).toEqual({ + fullName: 'twoWayProp', + name: 'twoWayProp', + previousValue: 1, + value: 2, + element: $('#component').get(0), + component: $('#component').dxOptionsTestWidget('instance'), + }); + }); + + it('convert `undefined` to `null` or `default value`', () => { + $('#component').dxOptionsTestWidget({ + oneWayWithValue: 15, + oneWayWithoutValue: 15, + oneWayNullWithValue: 15, + twoWayWithValue: '15', + twoWayNullWithValue: '15', + }); + + $('#component').dxOptionsTestWidget({ + oneWayWithValue: undefined, + oneWayWithoutValue: undefined, + oneWayNullWithValue: undefined, + twoWayWithValue: undefined, + twoWayNullWithValue: undefined, + }); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps')).toMatchObject({ + oneWayWithValue: 10, + oneWayWithoutValue: undefined, + oneWayNullWithValue: null, + twoWayWithValue: '10', + twoWayNullWithValue: null, + }); + + expect($('#component').dxOptionsTestWidget('option')).toMatchObject({ + oneWayWithValue: undefined, + oneWayWithoutValue: undefined, + oneWayNullWithValue: undefined, + twoWayWithValue: undefined, + twoWayNullWithValue: undefined, + }); + }); + + it('set to undefined should fall back to default value including default option rules', () => { + $('#component').dxOptionsTestWidget({ + oneWayWithDefaultRule: 10, + twoWayWithDefaultRule: 10, + oneWayWithValueDefaultRule: 10, + }); + + $('#component').dxOptionsTestWidget({ + oneWayWithDefaultRule: undefined, + oneWayWithValueDefaultRule: undefined, + twoWayWithDefaultRule: undefined, + }); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps')).toMatchObject({ + oneWayWithDefaultRule: 15, + oneWayWithValueDefaultRule: 15, + twoWayWithDefaultRule: 15, + }); + }); + + describe('Options with Element type', () => { + it('pass DOM node to component if provided option is jQuery wrapper', () => { + const element = document.createElement('div'); + const wrapper = $(element); + + $('#component').dxOptionsTestWidget({ + propWithElement: wrapper, + }); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps').propWithElement).toEqual(element); + }); + + it('leave option as is if it is not jQuery wrapper', () => { + $('#component').dxOptionsTestWidget({ + propWithElement: 15, + }); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps').propWithElement).toEqual(15); + }); + }); + + it('should return null for template option if it is not set', () => { + const widget = $('#component').dxOptionsTestWidget({}).dxOptionsTestWidget('instance'); + + expect(widget.option('contentTemplate')).toBe(null); + }); + + it('should not pass excessive options to props', () => { + const mockFunction = () => { }; + const options = { + text: 'some text', + twoWayProp: 15, + twoWayPropChange: mockFunction, + excessiveOption: { isExcessive: true }, + }; + const { excessiveOption, ...props } = options; + + $('#component').dxOptionsTestWidget(options); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps')).toMatchObject(props); + expect($('#component').dxOptionsTestWidget('option')).toMatchObject(options); + }); + + it('should still pass elementAttr to props', () => { + const mockFunction = () => { }; + const elementStyle = { backgroundColor: 'red' }; + const options = { + text: 'some text', + twoWayProp: 15, + twoWayPropChange: mockFunction, + elementAttr: { style: elementStyle }, + }; + const { elementAttr, ...props } = options; + + $('#component').dxOptionsTestWidget(options); + + expect($('#component').dxOptionsTestWidget('getLastPassedProps')).toMatchObject({ + ...props, + style: elementStyle, + }); + expect($('#component').dxOptionsTestWidget('option')).toMatchObject(options); + }); + + it('should remap "onKeyboardHandled" event to "onKeyDown"', () => { + const mockFunction = jest.fn(); + const options = { + onKeyboardHandled: mockFunction, + }; + + $('#component').dxTestWidget(options); + + emitKeyboard(KEY.space); + expect(mockFunction).toHaveBeenCalledTimes(1); + expect(mockFunction).toHaveBeenCalledWith({ + originalEvent: defaultEvent, keyName: KEY.space, which: KEY.space, + }); + }); +}); + +describe('templates and slots', () => { + it('should ignore default templates', () => { + $('#component').dxTemplatedTestWidget({ template: 'test' }); + let $template = $('#component').find('.templates-root'); + expect($template.text()).toBe('test'); + + $('#component').dxTemplatedTestWidget({ template: 'defaultTemplateName1' }); + $template = $('#component').find('.templates-root'); + expect($template.length).toBe(0); + + $('#component').dxTemplatedTestWidget({ template: 'defaultTemplateName2' }); + $template = $('#component').find('.templates-root'); + expect($template.length).toBe(0); + }); + + it('should render custom template with render function that returns dom node', () => { + $('#component').dxTemplatedTestWidget({ + template: 'test', + integrationOptions: { + templates: { + test: { + render: () => $('') + .addClass('dx-template-wrapper') + .text('template text')[0], + }, + }, + }, + }); + + const $template = $('#component').find('.dx-template-wrapper'); + expect($template.text()).toBe('template text'); + }); + + it('should render custom template when component has attibute with template name', () => { + $('#component').attr('template', 'test'); + $('#component').dxTemplatedTestWidget({ + template: 'test', + integrationOptions: { + templates: { + test: { + render: () => $('') + .addClass('dx-template-wrapper') + .text('template text')[0], + }, + }, + }, + }); + + $('#component').removeAttr('template'); + + const $template = $('#component').find('.dx-template-wrapper'); + expect($template.text()).toBe('template text'); + }); + + it('should unsubscribe from all events for nested jquery components when disposing parent component', () => { + $('#component').dxTemplatedTestWidget({ + template(_: never, element: Element) { + one(element, 'dxFakeEvent', () => {}); + $(element).html('Template content'); + }, + }); + + $('#components').empty(); + + expect(fakeEventSingleton.handlerCount).toBe(0); + }); + + it('template can be rendered without data passed', () => { + const templateMarkup = 'Template content'; + $('#component').dxTemplatedTestWidget({ + templateWithoutData() { + return templateMarkup; + }, + }); + + expect($('#component').children()[0].innerHTML).toBe(templateMarkup); + }); + + it('pass anonymous template content as children', () => { + $('#component').html('Default slot'); + + $('#component').dxTemplatedTestWidget({}); + + expect($('#component').children('').length).toBe(1); + expect($('#component')[0].innerHTML).toBe('Default slot'); + }); + + it('preserve anonymous template content element', () => { + const element = $('').html('Default slot'); + $('#component').append(element); + + $('#component').dxTemplatedTestWidget({}); + + expect($('#component').children('')[0]).toBe(element[0]); + }); + + it('pass updated anonymous content on repaint', () => { + const slotContent = $('').html('Default slot'); + $('#component').append(slotContent); + + $('#component').dxTemplatedTestWidget({}); + slotContent.html('Update slot'); + + $('#component').dxTemplatedTestWidget('repaint'); + + expect($('#component')[0].innerHTML).toBe('Update slot'); + }); + + it('change option when anonymous template exists', () => { + const slotContent = $('').html('Default slot'); + $('#component').append(slotContent); + $('#component').dxTemplatedTestWidget({}); + + expect(() => $('#component') + .dxTemplatedTestWidget('instance') + .option('someOption', 'newValue')).not.toThrow(); + }); + + describe('template function parameters', () => { + it('template without index', () => { + const template = jest.fn(); + + $('#component').dxTemplatedTestWidget({ + template, + }); + + const templateRoot = $('#component').children('.templates-root')[0]; + + expect(template).toBeCalledTimes(1); + expect(template.mock.calls[0]).toEqual([{ simpleTemplate: 'data' }, templateRoot]); + }); + + it('template with index', () => { + const template = jest.fn(); + + $('#component').dxTemplatedTestWidget({ + indexedTemplate: template, + }); + + const templateRoot = $('#component').children('.templates-root')[0]; + + expect(template).toBeCalledTimes(1); + expect(template.mock.calls[0]).toEqual([{ indexedTemplate: 'data' }, 2, templateRoot]); + }); + + it('wraps DOM nodes in "data" param with jQuery and gets public element', () => { + const getPublicElement = jest.fn(($el) => $el.get(0)); + setPublicElementWrapper(getPublicElement); + + const template = jest.fn(); + const param1 = document.createElement('div'); + const param2 = { some: 'object' }; + + $('#component').dxTemplatedTestWidget({ + elementTemplate: template, + elementTemplatePayload: { nodeParam: param1, nonNodeParam: param2 }, + }); + + expect(template).toBeCalledTimes(1); + expect(template.mock.calls[0][0]).toMatchObject({ + nodeParam: param1, nonNodeParam: param2, + }); + + const templateRoot = $('#component').children('.templates-root')[0]; + expect(getPublicElement).toBeCalledTimes(2); + expect(getPublicElement).toHaveBeenNthCalledWith(1, $(param1)); + expect(getPublicElement).toHaveBeenNthCalledWith(2, $(templateRoot)); + }); + + it('Tempate\'s data can have null/undefined values', () => { + const getPublicElement = jest.fn(($el) => $el.get(0)); + setPublicElementWrapper(getPublicElement); + + const template = jest.fn(); + + $('#component').dxTemplatedTestWidget({ + elementTemplate: template, + elementTemplatePayload: { nullParam: null, undefinedParam: undefined }, + }); + + const templateRoot = $('#component').children('.templates-root')[0]; + expect(template.mock.calls[0]).toEqual([{ + nullParam: null, + undefinedParam: undefined, + }, templateRoot]); + }); + }); + + it('insert template content to templates root', () => { + $('#component').dxTemplatedTestWidget({ + template(_data, element) { + $(element).html('Template content'); + }, + }); + + const templateRoot = $('#component').children('.templates-root')[0]; + + expect(templateRoot.innerHTML).toBe('Template content'); + }); + + it('remove old template content between renders', () => { + $('#component').dxTemplatedTestWidget({ + template(data, element) { + $(element).append(`Template - ${data.simpleTemplate}` as any); + }, + }); + const templateRoot = $('#component').children('.templates-root')[0]; + + $('#component').dxTemplatedTestWidget({ + text: 'new data', + }); + + expect(templateRoot.innerHTML).toBe('Template - new data'); + }); + + it('correctly change template at runtime', () => { + const template = () => { + const div = $('
'); + div.append('first custom template' as any); + return div; + }; + + const templateNew = () => { + const div = $('
'); + div.append('second custom template' as any); + return div; + }; + $('#component').dxTemplatedTestWidget({ + template, + }); + const templateRoot = $('#component').children('.templates-root')[0]; + + $('#component').dxTemplatedTestWidget({ + template: templateNew, + }); + + expect(templateRoot.innerHTML).toBe('
second custom template
'); + }); + + it('should not replace root with template if it returns .dx-template-wrapper node', () => { + const template = $('
').addClass('dx-template-wrapper').text('TemplateContent'); + $('#component').dxTemplatedTestWidget({ + template() { + return template; + }, + }); + const root = $('#component').children('.templates-root')[0]; + + expect($(root.firstChild)[0]).toBe(template[0]); + }); + + it('should render content in right order if children placed between other nodes', () => { + const slotContent = $('').html('Default slot'); + $('#component').append(slotContent); + const slotBefore = $('').html('Additional slot before').insertBefore(slotContent); + const slotAfter = $('').html('Additional slot after').insertAfter(slotContent); + $('#component').dxChildrenTestWidget({}); + + const children = $('#component')[0].childNodes; + expect(children.length).toBe(5); + expect(children[1]).toBe(slotBefore[0]); + expect(children[2]).toBe(slotContent[0]); + expect(children[3]).toBe(slotAfter[0]); + }); + + it('should not fail if template returned parent node', () => { + const template = (_: never, element: HTMLElement) => $(element) + .append($('').text('text')) + .addClass('modified_container'); + + expect(() => $('#component').dxTemplatedTestWidget({ template })).not.toThrowError(); + }); + + it('should have default templates for jQuery', () => { + const instance = $('#component') + .dxTemplatedTestWidget() + .dxTemplatedTestWidget('instance'); + + const templateNames = instance._propsInfo.templates; + const defaultTemplates = instance._templatesInfo; + const innerOptions = instance._props; + const publicOptions = instance.option(); + + templateNames.forEach((name) => { + expect(innerOptions[name]).toBe(defaultTemplates[name]); + expect(publicOptions[name]).toBe(null); + }); + }); + + it('should remove content after template removed', () => { + const template = () => $('
'); + + $('#component').dxTemplatedTestWidget({ + template, + }); + + expect($('#component').children('.templates-root').length).toBe(1); + + $('#component').dxTemplatedTestWidget({ + template: null, + }); + expect($('#component').children('.templates-root').length).toBe(0); + }); + + it('should not re-render template if new data shadow equal', () => { + const template = jest.fn(); + + const instance = $('#component').dxTemplatedTestWidget({ + elementTemplate: template, + elementTemplatePayload: { value: 'test' }, + }).dxTemplatedTestWidget('instance'); + + expect(template).toBeCalledTimes(1); + + instance.option('elementTemplatePayload', { value: 'test' }); + expect(template).toBeCalledTimes(1); + + instance.option('elementTemplatePayload', { value: 'newValue' }); + expect(template).toBeCalledTimes(2); + }); + + it('should not re-render template if non-related option changed', () => { + const template = jest.fn(); + + const instance = $('#component').dxTemplatedTestWidget({ + elementTemplate: template, + elementTemplatePayload: { value: 'test' }, + }).dxTemplatedTestWidget('instance'); + + expect(template).toBeCalledTimes(1); + + instance.option('text', { value: 'test' }); + expect(template).toBeCalledTimes(1); + }); +}); + +describe('events/actions', () => { + it('wraps event props with Actions with declared actionConfig', () => { + const onEventProp = jest.fn(); + $('#component').dxTestWidget({ + onEventProp, + beforeActionExecute: (_, action, actionConfig) => action(actionConfig), + }); + + $('#component').dxTestWidget('eventPropCheck', 'payload'); + + expect($('#component').dxTestWidget('option').onEventProp).toBe(onEventProp); + expect(onEventProp.mock.calls[0][0].someConfigs).toBe('action-config'); + expect(onEventProp.mock.calls[1][0]).toEqual({ + actionValue: 'payload', + component: $('#component').dxTestWidget('instance'), + element: $('#component').get(0), + }); + }); + + it('wraps DOM nodes in event args with jQuery and gets public element', () => { + const getPublicElement = jest.fn(($el) => $el.get(0)); + setPublicElementWrapper(getPublicElement); + + const onEventProp = jest.fn(); + const element1 = document.createElement('div'); + const element2 = document.createElement('div'); + const element3 = { some: 'object' }; + const element4 = null; + $('#component').dxTestWidget({ + onEventProp, + }); + + $('#component').dxTestWidget('eventPropCheck', { + eventElement: element1, + wrappedField: element2, + nonWrappedField: element3, + emptyField: element4, + }); + + expect(onEventProp.mock.calls[0][0]).toMatchObject({ + eventElement: element1, + wrappedField: element2, + nonWrappedField: element3, + emptyField: element4, + element: $('#component').get(0), + }); + + expect(getPublicElement).toBeCalledTimes(3); + expect(getPublicElement).toHaveBeenNthCalledWith(1, $(element1)); + expect(getPublicElement).toHaveBeenNthCalledWith(2, $(element2)); + expect(getPublicElement).toHaveBeenNthCalledWith(3, $('#component')); + }); + + it('re-wraps event props if it is changed', () => { + const onEventProp1 = jest.fn(); + const onEventProp2 = jest.fn(); + $('#component').dxTestWidget({ + onEventProp: onEventProp1, + }); + + $('#component').dxTestWidget({ + onEventProp: onEventProp2, + }); + + $('#component').dxTestWidget('eventPropCheck', 'payload'); + + expect($('#component').dxTestWidget('option').onEventProp).toBe(onEventProp2); + expect(onEventProp1).toBeCalledTimes(0); + expect(onEventProp2).toBeCalledTimes(1); + expect(onEventProp2.mock.calls[0][0]).toEqual({ + actionValue: 'payload', + component: $('#component').dxTestWidget('instance'), + element: $('#component').get(0), + }); + }); +}); + +describe('registerKeyHandler', () => { + it('"_supportedKeys" internal method should merge custom and default handlers', () => { + $('#component').dxTestWidget({}); + + const instance = $('#component').dxTestWidget('instance'); + + instance.registerKeyHandler('space', () => 'custom space handler'); + instance.registerKeyHandler('enter', () => 'custom enter handler'); + + const supportedKeys = instance._supportedKeys(); + + expect(supportedKeys.enter()).toBe('custom enter handler'); + expect(supportedKeys.space()).toBe('custom space handler'); + expect(supportedKeys.arrowUp()).toBe('default arrow up handler'); + }); + + it('should throw exception if the component has key handlers but does not have keyDown event', () => { + expect(() => $('#component').dxInvalidTestWidget({})).toThrow( + 'Component\'s declaration must have \'keyDown\' method.', + ); + }); + + it('Default key handlers should call keyDown method', () => { + const mockFunction = jest.fn(); + const instance = $('#component').dxTestWidget({}).dxTestWidget('instance'); + const supportedKeys = instance._supportedKeys(); + + instance._viewRef.current.keyDown = mockFunction; + supportedKeys.space(defaultEvent); + + expect(mockFunction).toHaveBeenCalledTimes(1); + expect(mockFunction).toHaveBeenCalledWith( + (KeyboardProcessor as any).createKeyDownOptions(defaultEvent), + ); + }); + + it('call custom handler only', () => { + const customHandler = jest.fn(); + const propHandler = jest.fn(); + $('#component').dxTestWidget({ + onKeyDown: propHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + + instance.registerKeyHandler('space', customHandler); + + emitKeyboard(KEY.space); + + expect(customHandler).toHaveBeenCalledTimes(1); + expect(customHandler).toHaveBeenCalledWith(defaultEvent, + { originalEvent: defaultEvent, keyName: KEY.space, which: KEY.space }); + + expect(propHandler).toHaveBeenCalledTimes(0); + }); + + it('call both handlers if custom handler returns something', () => { + const customHandler = jest.fn(() => true); + const propHandler = jest.fn(); + $('#component').dxTestWidget({ + onKeyDown: propHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + + instance.registerKeyHandler('space', customHandler); + + emitKeyboard(KEY.space); + + expect(customHandler).toHaveBeenCalledTimes(1); + expect(customHandler).toHaveBeenCalledWith(defaultEvent, + { originalEvent: defaultEvent, keyName: KEY.space, which: KEY.space }); + + expect(propHandler).toHaveBeenCalledTimes(1); + expect(propHandler).toHaveBeenCalledWith(defaultEvent, + { originalEvent: defaultEvent, keyName: KEY.space, which: KEY.space }); + }); + + it('do not call custom handler on another keyDown event', () => { + const customHandler = jest.fn(); + const propHandler = jest.fn(); + $('#component').dxTestWidget({ + onKeyDown: propHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + + instance.registerKeyHandler('space', customHandler); + + emitKeyboard(KEY.enter); + + expect(customHandler).toHaveBeenCalledTimes(0); + + expect(propHandler).toHaveBeenCalledTimes(1); + expect(propHandler).toHaveBeenCalledWith(defaultEvent, + { originalEvent: defaultEvent, keyName: KEY.enter, which: KEY.enter }); + }); +}); + +describe('onContentReady', () => { + it('should be raised on first render', () => { + const contentReadyHandler = jest.fn(); + $('#component').dxTestWidget({ + onContentReady: contentReadyHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + + expect(contentReadyHandler).toHaveBeenCalledTimes(1); + expect(contentReadyHandler) + .toHaveBeenCalledWith({ component: instance, element: instance.element() }); + }); + + it('should be raised on appropriate option change on endUpdate', () => { + const contentReadyHandler = jest.fn(); + $('#component').dxTestWidget({ + onContentReady: contentReadyHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + contentReadyHandler.mockReset(); + + instance.beginUpdate(); + instance.option('width', 100); + instance.option('height', 100); + instance.endUpdate(); + + expect(contentReadyHandler).toHaveBeenCalledTimes(1); + expect(contentReadyHandler) + .toHaveBeenCalledWith({ component: instance, element: instance.element() }); + }); + + it('should not be raised on option change if it is not specified in getContentReadyOptions', () => { + const contentReadyHandler = jest.fn(); + $('#component').dxTestWidget({ + onContentReady: contentReadyHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + contentReadyHandler.mockReset(); + + instance.option('text', 'text'); + + expect(contentReadyHandler).not.toHaveBeenCalled(); + }); + + it('should be raised on repaint', () => { + const contentReadyHandler = jest.fn(); + $('#component').dxTestWidget({ + onContentReady: contentReadyHandler, + }); + const instance = $('#component').dxTestWidget('instance'); + contentReadyHandler.mockReset(); + + instance.repaint(); + + expect(contentReadyHandler).toHaveBeenCalledTimes(1); + expect(contentReadyHandler) + .toHaveBeenCalledWith({ component: instance, element: instance.element() }); + }); + + it('should be raised on repaint if subscribe using on', () => { + const contentReadyHandler = jest.fn(); + $('#component').dxTestWidget({}); + const instance = $('#component').dxTestWidget('instance'); + instance.on('contentReady', contentReadyHandler); + + instance.repaint(); + + expect(contentReadyHandler).toHaveBeenCalledTimes(1); + expect(contentReadyHandler) + .toHaveBeenCalledWith({ component: instance, element: instance.element() }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..b25516aa9f13297d1d46cdfb6fab6a64b0073a28 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "devextreme/renovation-declarations" + ] +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/aria.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/aria.tsx new file mode 100644 index 0000000000000000000000000000000000000000..53d59dccf67df9155f5e25be5db1366157d4d2dd --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/aria.tsx @@ -0,0 +1,27 @@ +import { + Component, + ComponentBindings, + JSXComponent, + OneWay, +} from '@devextreme-generator/declarations'; +import BaseTestComponent from './component_wrapper/base'; +import { TestWidgetProps } from './base'; + +export const view = (): JSX.Element =>
; + +@ComponentBindings() +export class AriaTestWidgetProps extends TestWidgetProps { + @OneWay() aria?: Record = {}; +} + +@Component({ + jQuery: { + register: true, + component: BaseTestComponent, + }, + view, +}) +export default class AriaTestWidget extends JSXComponent(AriaTestWidgetProps) { + keyDown(): void { + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/base.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/base.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cdcf2067a0ac1bad617e06372dca9b3b21b1d936 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/base.tsx @@ -0,0 +1,120 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + Component, + ComponentBindings, + Effect, + Event, + JSXComponent, + Method, + OneWay, + Ref, + RefObject, +} from '@devextreme-generator/declarations'; +import { combineClasses } from '../../../../../utils/combine_classes'; +import { + keyboard, +} from '../../../../../../events/short'; + +import BaseTestComponent from './component_wrapper/base'; + +export const view = (viewModel: TestWidget): JSX.Element => ( +
+ {viewModel.props.text} +
+); + +@ComponentBindings() +export class TestWidgetProps { + @OneWay() height?: number; + + @OneWay() width?: number; + + @OneWay() text = 'default text'; + + @OneWay() subscribeEffect?: any; + + @OneWay() unsubscribeEffect?: any; + + @Event() onKeyDown?: (e: any) => any; + + @Event({ + actionConfig: { someConfigs: 'action-config' }, + }) onEventProp?: (e: any) => any; +} + +@Component({ + jQuery: { + register: true, + component: BaseTestComponent, + }, + view, +}) +export default class TestWidget extends JSXComponent(TestWidgetProps) { + @Ref() + rootRef!: RefObject; + + @Method() + apiMethodCheck(arg1: string, arg2: string): string { + return `${this.props.text} - ${arg1} - ${arg2}`; + } + + @Method() + eventPropCheck(arg: unknown): void { + this.props.onEventProp?.(arg); + } + + @Method() + // eslint-disable-next-line class-methods-use-this + methodWithElementParam(arg: HTMLDivElement | number): any { + return { arg }; + } + + @Method() + // eslint-disable-next-line class-methods-use-this + methodReturnElement(arg: HTMLDivElement): HTMLDivElement { + return arg; + } + + @Method() + getLastReceivedProps(): TestWidgetProps { + return this.props; + } + + @Effect({ run: 'always' }) + effectsCheck(): () => void { + this.props.subscribeEffect?.(this.props); + + return (): void => this.props.unsubscribeEffect?.(); + } + + @Effect() + registerKeyHandlerCheck(): undefined | (() => void) { + const { onKeyDown } = this.props; + + if (onKeyDown) { + const id = keyboard.on(this.rootRef.current, this.rootRef.current, (e) => onKeyDown(e)); + + return (): void => keyboard.off(id); + } + + return undefined; + } + + keyDown(): void { + return undefined; + } + + get className(): string { + return combineClasses({ + 'dx-test-widget': true, + [String(this.restAttributes.classes)]: !!this.restAttributes.classes, + [String(this.restAttributes.className)]: !!this.restAttributes.className, + }); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/children.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/children.tsx new file mode 100644 index 0000000000000000000000000000000000000000..483d52c3c6c6a3535c048a0b981c879f49d71a91 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/children.tsx @@ -0,0 +1,37 @@ +import { + Component, + ComponentBindings, + JSXComponent, + Slot, +} from '@devextreme-generator/declarations'; +import TemplatedTestComponent from './component_wrapper/templated'; + +export const view = ({ + props: { + children, + }, + restAttributes, +}: ChildrenTestWidget): JSX.Element => ( +
+
Here is Top content
+ {children} +
Here is Bottom content
+
+); + +@ComponentBindings() +export class ChildrenTestWidgetProps { + @Slot() children?: JSX.Element; +} + +@Component({ + jQuery: { + register: true, + component: TemplatedTestComponent, + }, + view, +}) +export default class ChildrenTestWidget extends JSXComponent(ChildrenTestWidgetProps) { +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/base.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/base.ts new file mode 100644 index 0000000000000000000000000000000000000000..949abf3b46e2ca38a86dc2fdd07ac1fab6d79387 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/base.ts @@ -0,0 +1,30 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-underscore-dangle */ +import Component from '../../../../component'; + +export default class BaseTestComponent extends Component { + lastPassedProps: any; + + getLastPassedProps(): any { + return this.lastPassedProps; + } + + getSupportedKeyNames(): string[] { + return ['space']; + } + + _init(): void { + super._init(); + this.defaultKeyHandlers.enter = () => 'default enter handler'; + this.defaultKeyHandlers.arrowUp = () => 'default arrow up handler'; + } + + _getContentReadyOptions(): string[] { + return [...super._getContentReadyOptions(), 'width', 'height']; + } + + _renderWrapper(props: Record): void { + this.lastPassedProps = props; + super._renderWrapper(props); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/non_templated.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/non_templated.ts new file mode 100644 index 0000000000000000000000000000000000000000..91b548808b0871952b3505662ade56dc6d8f2e05 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/non_templated.ts @@ -0,0 +1,8 @@ +import Component from '../../../../component'; + +export default class NonTemplatedTestComponent extends Component { + // eslint-disable-next-line no-underscore-dangle, class-methods-use-this + _useTemplates(): boolean { + return false; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/templated.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/templated.ts new file mode 100644 index 0000000000000000000000000000000000000000..1577a5a4ab022b28983c76bb1ea1542606aba517 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/component_wrapper/templated.ts @@ -0,0 +1,13 @@ +import Component from '../../../../component'; + +export default class TemplatedTestComponent extends Component { + // eslint-disable-next-line class-methods-use-this + get _templatesInfo(): Record { + return { + template: 'defaultTemplateName1', + indexedTemplate: 'defaultTemplateName2', + elementTemplate: 'defaultTemplateName3', + templateWithoutData: 'defaultTemplateName4', + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/empty.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/empty.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a7e7a340c41df0d836892db4e39d203719905dbc --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/empty.tsx @@ -0,0 +1,18 @@ +import { + Component, + ComponentBindings, + JSXComponent, +} from '@devextreme-generator/declarations'; + +export const view = (): JSX.Element =>
; + +@ComponentBindings() +export class EmptyTestWidgetProps { empty = true; } + +@Component({ + jQuery: { + register: true, + }, + view, +}) +export default class EmptyTestWidget extends JSXComponent(EmptyTestWidgetProps) {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/invalid.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/invalid.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9643d16a19c5c2a3039e8a2f5161d45e08e85860 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/invalid.tsx @@ -0,0 +1,28 @@ +import { + Component, + ComponentBindings, + JSXComponent, + OneWay, +} from '@devextreme-generator/declarations'; + +import BaseTestComponent from './component_wrapper/base'; + +export const view = ({ restAttributes }: InvalidTestWidget): JSX.Element => ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+); + +@ComponentBindings() +export class InvalidTestWidgetProps { + @OneWay() text = 'default text'; +} + +@Component({ + jQuery: { + register: true, + component: BaseTestComponent, + }, + view, +}) +export default class InvalidTestWidget extends JSXComponent(InvalidTestWidgetProps) { +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/non_templated.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/non_templated.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c4682d92c787aad0707a826133498225db1404a2 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/non_templated.tsx @@ -0,0 +1,20 @@ +import { + Component, + ComponentBindings, + JSXComponent, +} from '@devextreme-generator/declarations'; +import NonTemplatedTestComponent from './component_wrapper/non_templated'; + +export const view = (): JSX.Element =>
; + +@ComponentBindings() +export class NonTemplatedTestWidgetProps { nonTemplated = true; } + +@Component({ + jQuery: { + register: true, + component: NonTemplatedTestComponent, + }, + view, +}) +export default class NonTemplatedTestWidget extends JSXComponent(NonTemplatedTestWidgetProps) {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/options.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/options.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7a9f195cc0474f26f2af74ab27107d92eb639563 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/options.tsx @@ -0,0 +1,83 @@ +import { + Component, + ComponentBindings, + JSXComponent, + Method, + Nested, + OneWay, + Template, + TwoWay, +} from '@devextreme-generator/declarations'; + +import { createDefaultOptionRules } from '../../../../../../core/options/utils'; +import BaseTestComponent from './component_wrapper/base'; + +export const view = ({ restAttributes }: OptionsTestWidget): JSX.Element => ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+); + +@ComponentBindings() +export class OptionsTestWidgetProps { + @OneWay() text = 'default text'; + + @TwoWay() twoWayProp = 1; + + @OneWay() objectProp = { someVal: true }; + + @OneWay() oneWayWithoutValue?: number; + + @OneWay() oneWayWithValue = 10; + + @OneWay() oneWayNullWithValue: number | null = 20; + + @OneWay() oneWayWithValueDefaultRule?: number = 10; + + @OneWay() oneWayWithDefaultRule?: number; + + @TwoWay() twoWayWithValue = '10'; + + @TwoWay() twoWayNullWithValue: string | null = '20'; + + @TwoWay() twoWayWithDefaultRule?: number = 10; + + @OneWay() propWithElement?: HTMLDivElement | number; + + @Nested() nestedObject?: { nestedProp: string } = { nestedProp: 'default value' }; + + @Nested() nestedArray?: { nestedProp: string }[]; + + @Template() contentTemplate = (): JSX.Element =>
; +} + +export const defaultOptionRules = createDefaultOptionRules([{ + device: (): boolean => true, + options: { + oneWayWithValueDefaultRule: 15, + oneWayWithDefaultRule: 15, + twoWayWithDefaultRule: 15, + }, +}]); + +@Component({ + defaultOptionRules, + jQuery: { + register: true, + component: BaseTestComponent, + }, + view, +}) +export default class OptionsTestWidget extends JSXComponent(OptionsTestWidgetProps) { + @Method() + updateTwoWayPropCheck(): void { + this.props.twoWayProp += 1; + } + + @Method() + getLastReceivedProps(): OptionsTestWidgetProps { + return this.props; + } + + keyDown(): void { + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/templated.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/templated.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ead193e35f58a1ff3925f626161fbabfa0ddbf79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/__tests__/utils/test_components/templated.tsx @@ -0,0 +1,85 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + Component, + ComponentBindings, + JSXComponent, + Slot, + Template, + OneWay, +} from '@devextreme-generator/declarations'; +import TemplatedTestComponent from './component_wrapper/templated'; + +export const view = ({ + props: { + children, + elementTemplate: ElementTemplateComp, + elementTemplatePayload, + indexedTemplate: IndexedTemplateComp, + template: TemplateComp, + templateWithoutData: TemplateWithoutData, + text, + }, + restAttributes, +}: TemplatedTestWidget): JSX.Element => { + const hasTemplate = TemplateComp + || IndexedTemplateComp + || ElementTemplateComp + || TemplateWithoutData; + return ( +
+ {hasTemplate && ( +
+ {TemplateComp && ( + + )} + {IndexedTemplateComp && ( + + )} + {ElementTemplateComp && ( + + )} + { TemplateWithoutData && ( + + )} +
+ )} + {!hasTemplate && children} +
+ ); +}; + +@ComponentBindings() +export class TemplatedTestWidgetProps { + @OneWay() text?: string = 'data'; + + @Slot() children?: any; + + @Template() template?: any; + + @Template() indexedTemplate?: any; + + @Template() elementTemplate?: any; + + @Template() templateWithoutData?: any; + + @OneWay() elementTemplatePayload?: any; +} + +@Component({ + jQuery: { + register: true, + component: TemplatedTestComponent, + }, + view, +}) +export default class TemplatedTestWidget extends JSXComponent(TemplatedTestWidgetProps) { +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/component.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/component.ts new file mode 100644 index 0000000000000000000000000000000000000000..da8fe90a2062e1a4873194cac312497888403967 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/component.ts @@ -0,0 +1,549 @@ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import { + createRef, RefObject, VNode, Component, +} from 'inferno'; +import KeyboardProcessor from '../../../events/core/keyboard_processor'; +import renderer from '../../../core/inferno_renderer'; + +// eslint-disable-next-line import/named +import $, { dxElementWrapper } from '../../../core/renderer'; +import domAdapter from '../../../core/dom_adapter'; +import DOMComponent from '../../../core/dom_component'; +import { extend } from '../../../core/utils/extend'; +import { getPublicElement } from '../../../core/element'; +import type { UserDefinedElement } from '../../../core/element'; +import { isDefined, isRenderer, isString } from '../../../core/utils/type'; +import { TemplateModel, TemplateWrapper } from './template_wrapper'; +import { updatePropsImmutable } from '../utils/update_props_immutable'; +import type { Option, TemplateComponent } from './types'; + +const setDefaultOptionValue = ( + options: Record, + defaultValueGetter: (name: string) => unknown, +) => (name: string): void => { + if (Object.prototype.hasOwnProperty.call(options, name) && options[name] === undefined) { + // eslint-disable-next-line no-param-reassign + options[name] = defaultValueGetter(name); + } +}; + +interface ElementAttributes extends Record { + class: string; +} + +export interface ComponentWrapperProps extends Record { + onContentReady?: (e: Record) => void; + elementAttr?: ElementAttributes; +} + +export default class ComponentWrapper extends DOMComponent { + static IS_RENOVATED_WIDGET = false; + + // NOTE: We should declare all instance options with '!' because of DOMComponent life cycle + _actionsMap!: { + [name: string]: Function; + }; + + _aria!: Record; + + customKeyHandlers!: Record; + + defaultKeyHandlers!: Record; + + _documentFragment!: DocumentFragment; + + _elementAttr!: { + [name: string]: unknown; + class?: string; + }; + + _isNodeReplaced!: boolean; + + _props!: Record; + + _storedClasses?: string; + + _viewRef!: RefObject; + + _viewComponent!: typeof Component; + + _shouldRaiseContentReady = false; + + _componentTemplates!: Record; + + get _propsInfo(): { + allowNull: string[]; + twoWay: [string, string, string][]; + elements: string[]; + templates: string[]; + props: string[]; + } { + return { + allowNull: [], + twoWay: [], + elements: [], + templates: [], + props: [], + }; + } + + constructor(element: UserDefinedElement, options?: ComponentWrapperProps) { + super(element, options); + + this.validateKeyDownHandler(); + } + + validateKeyDownHandler(): void { + const supportedKeyNames = this.getSupportedKeyNames(); + const hasComponentDefaultKeyHandlers = supportedKeyNames.length > 0; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hasComponentKeyDownMethod = typeof (this._viewComponent.prototype as any).keyDown === 'function'; + + if (hasComponentDefaultKeyHandlers && !hasComponentKeyDownMethod) { + throw Error('Component\'s declaration must have \'keyDown\' method.'); + } + } + + public get viewRef(): unknown { + return this._viewRef?.current; + } + + _checkContentReadyOption(fullName: string): boolean { + const contentReadyOptions = this._getContentReadyOptions().reduce((options, name) => { + // eslint-disable-next-line no-param-reassign + options[name] = true; + return options; + }, {}); + + this._checkContentReadyOption = (optionName): boolean => !!contentReadyOptions[optionName]; + return this._checkContentReadyOption(fullName); + } + + _getContentReadyOptions(): string[] { + return ['rtlEnabled']; + } + + _fireContentReady(): void { + this._actionsMap.onContentReady({}); + } + + _getDefaultOptions(): Record { + return extend( + true, + super._getDefaultOptions(), + this._viewComponent.defaultProps, + this._propsInfo.twoWay.reduce( + ( + options: { [name: string]: unknown }, + [name, defaultName, eventName], + ) => ({ + ...options, + [name]: this._viewComponent.defaultProps[defaultName], + [eventName]: (value: unknown): void => this.option(name, value), + }), + {}, + ), + this._propsInfo.templates.reduce( + ( + options: { [name: string]: unknown }, + name, + ) => ({ + ...options, + [name]: null, + }), + {}, + ), + ) as Record; + } + + _initMarkup(): void { + const props = this.getProps(); + this._renderWrapper(props); + } + + _renderWrapper(props: Record): void { + const containerNode = this.$element()[0]; + + if (!this._isNodeReplaced) { + renderer.onPreRender(); + } + + renderer.render(this._viewComponent, props, containerNode, this._isNodeReplaced); + + if (!this._isNodeReplaced) { + this._isNodeReplaced = true; + renderer.onAfterRender(); + this._shouldRaiseContentReady = true; + } + + if (this._shouldRaiseContentReady) { + this._fireContentReady(); + this._shouldRaiseContentReady = false; + } + } + + _silent(name: string, value: unknown): void { + this._options.silent(name, value); + } + + _render(): void { } // NOTE: Inherited from DOM_Component + + _removeWidget(): void { + renderer.remove(this.$element()[0]); + } + + _dispose(): void { + this._removeWidget(); + super._dispose(); + } + + get elementAttr(): HTMLAttributes { + if (!this._elementAttr) { + const { attributes } = this.$element()[0]; + const attrs = Array.from<{ name: string; value: unknown }>(attributes) + .filter((attr) => !this._propsInfo.templates.includes(attr.name) + && attributes[attr.name]?.specified) + .reduce((result, { name, value }) => { + const updatedAttributes = result; + updatedAttributes[name] = value; + return updatedAttributes; + }, {}); + this._elementAttr = attrs; + this._storedClasses = this.$element()[0].getAttribute('class') || ''; + } + const elemStyle: CSSStyleDeclaration = this.$element()[0].style; + + const style = {}; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let i = 0; i < elemStyle.length; i += 1) { + style[elemStyle[i]] = elemStyle.getPropertyValue(elemStyle[i]); + } + this._elementAttr.style = style; + + this._elementAttr.class = this._storedClasses; + + return this._elementAttr; + } + + _getAdditionalActionConfigs(): Record> { + return { + onContentReady: { + excludeValidators: ['disabled', 'readOnly'], + }, + }; + } + + _getAdditionalProps(): string[] { + return []; + } + + _patchOptionValues(options: Record): Record { + const { + allowNull, twoWay, elements, props, + } = this._propsInfo; + const { defaultProps } = this._viewComponent; + const { ref, children, onKeyboardHandled } = options; + const onKeyDown = onKeyboardHandled + ? (_: never, event_options: unknown[]): void => { + (onKeyboardHandled as (args: unknown[]) => void)(event_options); + } + : undefined; + const widgetProps = { + ref, + children, + onKeyDown, + }; + [...props, ...this._getAdditionalProps()].forEach((propName) => { + if (Object.prototype.hasOwnProperty.call(options, propName)) { + widgetProps[propName] = options[propName]; + } + }); + + allowNull.forEach( + setDefaultOptionValue(widgetProps, () => null), + ); + + Object.keys(defaultProps).forEach( + setDefaultOptionValue( + widgetProps, + (name: string) => defaultProps[name], + ), + ); + twoWay.forEach(([name, defaultName]) => { + setDefaultOptionValue(widgetProps, () => defaultProps[defaultName])(name); + }); + + elements.forEach((name: string) => { + if (name in widgetProps) { + const value = widgetProps[name]; + if (isRenderer(value)) { + widgetProps[name] = this._patchElementParam(value); + } + } + }); + + return widgetProps; + } + + getSupportedKeyNames(): string[] { + return []; + } + + prepareStyleProp(props: Record): Record { + if (typeof props.style === 'string') { + return { ...props, style: {}, cssText: props.style }; + } + + return props; + } + + getProps(): Record { + const { elementAttr } = this.option(); + + const options = this._patchOptionValues({ + ...this._props, + ref: this._viewRef, + children: this._extractDefaultSlot(), + aria: this._aria, + }); + this._propsInfo.templates.forEach((template) => { + options[template] = this._componentTemplates[template]; + }); + + return this.prepareStyleProp({ + ...options, + ...this.elementAttr, + ...elementAttr, + className: [ + ...(this.elementAttr.class ?? '').split(' '), + ...(elementAttr?.class ?? '').split(' '), + ] + .filter((c, i, a) => c && a.indexOf(c) === i) + .join(' ') + .trim(), + class: '', + ...this._actionsMap, + }); + } + + _getActionConfigs(): Record> { + return {}; + } + + _getActionConfigsFull(): Record> { + return { + ...this._getActionConfigs(), + ...this._getAdditionalActionConfigs(), + }; + } + + getDefaultTemplates(): Record { + const defaultTemplates = Object.values(this._templatesInfo); + const result = {}; + + defaultTemplates.forEach((template) => { + result[template] = 'dx-renovation-template-mock'; + }); + + return result; + } + + get _templatesInfo(): Record { + return {}; + } + + _optionsWithDefaultTemplates(options: Record): Record { + const templateOptions = Object.entries(this._templatesInfo) + .reduce( + (result, [templateName, templateValue]) => ({ + ...result, + [templateName]: options[templateName] ?? templateValue, + }), {}, + ); + return { + ...options, + ...templateOptions, + }; + } + + _init(): void { + super._init(); + + this.customKeyHandlers = {}; + this._templateManager?.addDefaultTemplates(this.getDefaultTemplates()); + this._props = this._optionsWithDefaultTemplates(this.option()); + this._actionsMap = {}; + this._aria = {}; + + this._componentTemplates = {}; + this._propsInfo.templates.forEach((template) => { + this._componentTemplates[template] = this._createTemplateComponent(this._props[template]); + }); + + Object.keys(this._getActionConfigsFull()).forEach((name) => this._addAction(name)); + + this._viewRef = createRef(); + this.defaultKeyHandlers = this._createDefaultKeyHandlers(); + } + + _createDefaultKeyHandlers(): Record { + const result = {}; + const keys = this.getSupportedKeyNames(); + + keys.forEach((key) => { + // eslint-disable-next-line + result[key] = (e: Event): Event | undefined => (this.viewRef as any).keyDown( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (KeyboardProcessor as any).createKeyDownOptions(e), + ); + }); + return result; + } + + _addAction(event: string, actionToAdd?: Function): void { + let action = actionToAdd; + if (!action) { + const actionByOption = this._createActionByOption( + event, + this._getActionConfigsFull()[event], + ); + + action = ( + actArgs: Record, + ): void => { + Object.keys(actArgs).forEach((name) => { + if (isDefined(actArgs[name]) && domAdapter.isNode(actArgs[name])) { + // eslint-disable-next-line no-param-reassign + actArgs[name] = getPublicElement($(actArgs[name])); + } + }); + return actionByOption(actArgs) as undefined; + }; + } + this._actionsMap[event] = action; + } + + _optionChanged(option: Option): void { + const { name, fullName, value } = option; + updatePropsImmutable(this._props, this.option(), name, fullName); + + if (this._propsInfo.templates.includes(name)) { + this._componentTemplates[name] = this._createTemplateComponent(value); + } + + if (name && this._getActionConfigsFull()[name]) { + this._addAction(name); + } + + this._shouldRaiseContentReady = this._shouldRaiseContentReady + || this._checkContentReadyOption(fullName); + super._optionChanged(option); + this._invalidate(); + } + + _extractDefaultSlot(): VNode | null { + if (this.option('_hasAnonymousTemplateContent')) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return renderer.createElement(TemplateWrapper, { + template: this._getTemplate(this._templateManager.anonymousTemplateName), + transclude: true, + }); + } + return null; + } + + _createTemplateComponent(templateOption: unknown): TemplateComponent | undefined { + if (!templateOption) { + return undefined; + } + + const template = this._getTemplate(templateOption); + + if (isString(template) && template === 'dx-renovation-template-mock') { + return undefined; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + const templateWrapper = (model: TemplateModel): VNode => renderer.createElement( + TemplateWrapper, { template, model }, + ); + + return templateWrapper; + } + + _wrapKeyDownHandler(initialHandler: Function): Function { + return (options: { + originalEvent: Event & { cancel: boolean }; + keyName: string; + which: string; + }): Event => { + const { originalEvent, keyName, which } = options; + const keys = this.customKeyHandlers; + const func = keys[keyName] || keys[which]; + + // NOTE: registered handler has more priority + if (func !== undefined) { + const handler = func.bind(this); + const result = handler(originalEvent, options); + + if (!result) { + originalEvent.cancel = true; + return originalEvent; + } + } + + // NOTE: make it possible to pass onKeyDown property + return initialHandler?.(originalEvent, options) as Event; + }; + } + + _toPublicElement(element: string | Element | dxElementWrapper): Element { + return getPublicElement($(element)); + } + + _patchElementParam(value: Element): Element { + try { + const result = $(value); + const element = result?.get(0); + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return element?.nodeType ? element : value; + } catch (error) { + return value; + } + } + + // Public API + repaint(): void { + this._isNodeReplaced = false; + this._shouldRaiseContentReady = true; + this._removeWidget(); + this._refresh(); + } + + _supportedKeys(): Record { + return { + ...this.defaultKeyHandlers, + ...this.customKeyHandlers, + }; + } + + registerKeyHandler(key: string, handler: Function): void { + this.customKeyHandlers[key] = handler; + } + + // NOTE: this method will be deprecated + // aria changes should be defined in declaration or passed through property + // eslint-disable-next-line @typescript-eslint/no-unused-vars + setAria(name: string, value: string): void { + this._aria[name] = value; + this._initMarkup(); + } +} + +/// #DEBUG +ComponentWrapper.IS_RENOVATED_WIDGET = true; +/// #ENDDEBUG + +/* eslint-enable @typescript-eslint/ban-types */ +/* eslint-enable @typescript-eslint/no-unsafe-member-access */ diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/template_wrapper.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/template_wrapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c2b3fd13806d7734121e2c8ecfd04d031aba1ea --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/template_wrapper.ts @@ -0,0 +1,101 @@ +import { InfernoComponent, InfernoEffect } from '@devextreme/runtime/inferno'; +// eslint-disable-next-line spellcheck/spell-checker +import { findDOMfromVNode } from 'inferno'; +import { shallowEquals } from '../../utils/shallow_equals'; +import { replaceWith } from '../../../core/utils/dom'; +import $ from '../../../core/renderer'; +import domAdapter from '../../../core/dom_adapter'; +import { getPublicElement } from '../../../core/element'; +import { removeDifferentElements } from '../utils/utils'; +import Number from '../../../core/polyfills/number'; +import { FunctionTemplate } from '../../../core/templates/function_template'; +import { EffectReturn } from '../../utils/effect_return'; +import { isDefined } from '../../../core/utils/type'; + +export interface TemplateModel { + data: Record; + index: number; +} + +interface TemplateWrapperProps { + template: FunctionTemplate; + model?: TemplateModel; + transclude?: boolean; +} + +export class TemplateWrapper extends InfernoComponent { + constructor(props: TemplateWrapperProps) { + super(props); + this.renderTemplate = this.renderTemplate.bind(this); + } + + renderTemplate(): EffectReturn { + // eslint-disable-next-line spellcheck/spell-checker + const node = findDOMfromVNode(this.$LI, true) as Element; + const parentNode = node.parentNode as Element; + const $parent = $(parentNode); + const $children = $parent.contents(); + + const { + data, index, + } = this.props.model ?? { data: {} }; + + if (data) { + Object.keys(data).forEach((name) => { + if (data[name] && domAdapter.isNode(data[name])) { + data[name] = getPublicElement($(data[name] as Element)); + } + }); + } + + const $result = $(this.props.template.render({ + container: getPublicElement($parent), + transclude: this.props.transclude, + ...!this.props.transclude ? { model: data } : {}, + ...!this.props.transclude && Number.isFinite(index) ? { index } : {}, + })); + + replaceWith($(node), $result); + + return (): void => { + // NOTE: order is important + removeDifferentElements($children, $parent.contents()); + parentNode.appendChild(node); + }; + } + + shouldComponentUpdate(nextProps: TemplateWrapperProps): boolean { + const { template, model } = this.props; + const { template: nextTemplate, model: nextModel } = nextProps; + + const sameTemplate = template === nextTemplate; + if (!sameTemplate) { + return true; + } + + if (isDefined(model) && isDefined(nextModel)) { + const { data, index } = model; + const { data: nextData, index: nextIndex } = nextModel; + return index !== nextIndex || !shallowEquals(data, nextData); + } + + const sameModel = model === nextModel; + return !sameModel; + } + + createEffects(): InfernoEffect[] { + return [new InfernoEffect(this.renderTemplate, [this.props.template, this.props.model])]; + } + + updateEffects(): void { + this._effects[0].update([this.props.template, this.props.model]); + } + + // NOTE: Prevent nodes clearing on unmount. + // Nodes will be destroyed by inferno on markup update + componentWillUnmount(): void { } + + render(): JSX.Element | null { + return null; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/types.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..67d204c957765572ab34dcfb62fcc12252128c2b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/common/types.ts @@ -0,0 +1,11 @@ +import { VNode } from 'inferno'; +import { TemplateModel } from './template_wrapper'; + +export interface Option { + name: string; + fullName: string; + value: unknown; + previousValue: unknown; +} + +export type TemplateComponent = (model: TemplateModel) => VNode; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid.ts new file mode 100644 index 0000000000000000000000000000000000000000..15679f323fb492e895a24d9c7e122028f3fa6547 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid.ts @@ -0,0 +1,237 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import { isPlainObject } from '../../core/utils/type'; +import { getPathParts } from '../../core/utils/data'; +import Component, { ComponentWrapperProps } from './common/component'; +import type { DataGridForComponentWrapper, GridInstance } from '../ui/grids/data_grid/common/types'; +import gridCore from '../../ui/data_grid/ui.data_grid.core'; +import { updatePropsImmutable } from './utils/update_props_immutable'; +import type { TemplateComponent, Option } from './common/types'; +import type { ExcelCellInfo, Export, OptionChangedEvent } from '../../ui/data_grid'; +import { getUpdatedOptions } from '../ui/common/utils/get_updated_options'; + +import { themeReadyCallback } from '../../ui/themes_callback'; +import componentRegistratorCallbacks from '../../core/component_registrator_callbacks'; + +let dataGridClass: { defaultOptions: (options: unknown) => void } | null = null; + +/* istanbul ignore next: temporary workaround */ +// TODO remove when defaultOptionRules initialization problem will be fixed +componentRegistratorCallbacks.add((name, componentClass) => { + if (name === 'dxDataGrid') { + dataGridClass = componentClass; + } +}); + +export default class DataGridWrapper extends Component { + static registerModule = gridCore.registerModule.bind(gridCore); + + _onInitialized!: Function; + + _skipInvalidate = false; + + // TODO remove when defaultOptionRules initialization problem will be fixed + constructor(element: Element, options: ComponentWrapperProps) { + /* istanbul ignore next: temporary workaround */ + super(element, (dataGridClass?.defaultOptions({}), options)); + } + + state(state?: Record): Record | undefined { + const internalInstance = this._getInternalInstance(); + + if (internalInstance) { + if (state === undefined) { + return internalInstance.state() as Record; + } + internalInstance.state(state); + } + return undefined; + } + + getController(name: string): unknown { + return this._getInternalInstance()?.getController(name); + } + + getView(name: string): unknown { + return this._getInternalInstance()?.getView(name); + } + + beginUpdate(): void { + super.beginUpdate(); + this._getInternalInstance()?.beginUpdate(); + } + + endUpdate(): void { + super.endUpdate(); + this._getInternalInstance()?.endUpdate(); + } + + isReady(): boolean { + return this._getInternalInstance()?.isReady(); + } + + _getInternalInstance(): GridInstance { + return (this.viewRef as DataGridForComponentWrapper)?.getComponentInstance(); + } + + _fireContentReady(): void {} + + _wrapKeyDownHandler(handler: Function): Function { + return handler; + } + + _optionChanging(fullName: string, prevValue: unknown, value: unknown): void { + super._optionChanging(fullName, prevValue, value); + if (this.viewRef && prevValue !== value) { + const name = getPathParts(fullName)[0]; + const prevProps = { ...(this.viewRef as DataGridForComponentWrapper).prevProps }; + + if (name === 'integrationOptions') { + return; + } + + if (name === 'editing' && name !== fullName) { + // T751778 + // TODO remove when silent assign will be removed from editing + updatePropsImmutable(prevProps, this.option(), name, name); + } + + if (isPlainObject(prevValue) && isPlainObject(value)) { + const updatedOptions = getUpdatedOptions(prevValue, value); + updatedOptions.forEach((item) => { + updatePropsImmutable(prevProps, this.option(), name, `${fullName}.${item.path}`); + }); + } else { + updatePropsImmutable(prevProps, this.option(), name, fullName); + } + + (this.viewRef as DataGridForComponentWrapper).prevProps = prevProps; + } + } + + _optionChanged(e: Option): void { + const internalInstance = this._getInternalInstance(); + ['dataSource', 'editing.changes'].forEach((fullName) => { + if (internalInstance + && e.fullName === fullName + && e.value === internalInstance.option(fullName)) { + internalInstance.option(fullName, e.value as string); + } + }); + super._optionChanged(e); + } + + _createTemplateComponent(templateOption: unknown): TemplateComponent | undefined { + return templateOption as (TemplateComponent | undefined); + } + + _initializeComponent(): void { + const options = this.option(); + this._onInitialized = options.onInitialized as Function; + options.onInitialized = null; + super._initializeComponent(); + } + + _patchOptionValues(options: Record): Record { + // eslint-disable-next-line no-param-reassign + options.onInitialized = this._onInitialized; + + const exportOptions = options.export as Export; + const originalCustomizeExcelCell = exportOptions?.customizeExcelCell; + + if (originalCustomizeExcelCell) { + exportOptions.customizeExcelCell = (e: ExcelCellInfo): void => { + // eslint-disable-next-line + (e as any).component = this; + + return originalCustomizeExcelCell(e); + }; + } + + const { onInitialized } = options; + + if (onInitialized) { + // eslint-disable-next-line no-param-reassign + options.onInitialized = (e: { component: Component }): void => { + e.component = this; + (onInitialized as Function)(e); + }; + } + + return super._patchOptionValues(options); + } + + _renderWrapper(props: Record): void { + const isFirstRender = !this._isNodeReplaced; + + super._renderWrapper(props); + if (isFirstRender) { + this._getInternalInstance()?.on('optionChanged', this._internalOptionChangedHandler.bind(this)); + } + } + + _internalOptionChangedHandler(e: OptionChangedEvent): void { + const isSecondLevelOption = e.name !== e.fullName; + + if (isSecondLevelOption && e.value !== e.previousValue) { + if (e.fullName.startsWith('columns[')) { + if (this.option(e.fullName) !== e.value) { + this._cancelOptionChange = e.fullName; + this._notifyOptionChanged(e.fullName, e.value, e.previousValue); + this._cancelOptionChange = undefined; + } + } else { + this._skipInvalidate = true; + this._options.silent(e.fullName, e.previousValue); + this.option(e.fullName, e.value); + this._skipInvalidate = false; + } + } + } + + _invalidate(): void { + if (this._skipInvalidate) return; + + super._invalidate(); + } + + _setOptionsByReference(): void { + super._setOptionsByReference(); + + // eslint-disable-next-line @typescript-eslint/dot-notation + this._optionsByReference['focusedRowKey'] = true; + this._optionsByReference['editing.editRowKey'] = true; + this._optionsByReference['editing.changes'] = true; + } + + _setDeprecatedOptions(): void { + super._setDeprecatedOptions(); + + // eslint-disable-next-line @typescript-eslint/dot-notation + this._deprecatedOptions['useKeyboard'] = { since: '19.2', alias: 'keyboardNavigation.enabled' }; + // eslint-disable-next-line @typescript-eslint/dot-notation + this._deprecatedOptions['rowTemplate'] = { since: '21.2', message: 'Use the "dataRowTemplate" option instead' }; + // eslint-disable-next-line @typescript-eslint/dot-notation + this._deprecatedOptions['onToolbarPreparing'] = { since: '21.2', message: 'Use the "toolbar" option instead' }; + } + + _getDefaultOptions(): Record { + const defaultOptions = super._getDefaultOptions(); + delete defaultOptions.rowTemplate; + return defaultOptions; + } + + _getAdditionalProps(): string[] { + return super._getAdditionalProps().concat([ + 'onInitialized', + 'onColumnsChanging', // for dashboards + 'integrationOptions', + 'adaptColumnWidthByRatio', + 'useLegacyKeyboardNavigation', + 'templatesRenderAsynchronously', + 'forceApplyBindings', + 'nestedComponentOptions', + ]); + } +} + +themeReadyCallback.add(); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid/datagrid_component.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid/datagrid_component.ts new file mode 100644 index 0000000000000000000000000000000000000000..25fd433d39f30a509d96bfc2a07925e1c699663f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/data_grid/datagrid_component.ts @@ -0,0 +1,27 @@ +/* eslint-disable class-methods-use-this */ +/* eslint-disable no-underscore-dangle */ +import DataGridBase from '../../../ui/data_grid/ui.data_grid.base'; + +const DATA_GRID_NAME = 'dxDataGrid'; + +export class DataGridComponent extends DataGridBase { + NAME = DATA_GRID_NAME; + + _deprecatedOptions = {}; + + // eslint-disable-next-line @typescript-eslint/no-useless-constructor + constructor(element: unknown, options: unknown) { + super(element, options); + } + + _setDeprecatedOptions(): void {} + + _initTemplates(): void {} + + // prevent render + _updateDOMComponent(): void {} + + _isDimensionChangeSupported(): boolean { + return false; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/__tests__/editor.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/__tests__/editor.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fb8f52d959b154f6f6a828db455089c27c49fd7f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/__tests__/editor.test.tsx @@ -0,0 +1,20 @@ +/* eslint-disable max-classes-per-file */ +import Editor from '../editor'; +import OldEditor from '../../../../ui/editor/editor'; + +const mockIsEditorMock = jest.fn().mockReturnValue(false); + +jest.mock('../../../../ui/editor/editor', () => ( + { isEditor: (inst) => mockIsEditorMock(inst) })); +jest.mock('../../common/component'); +class TestEditor extends Editor { + +} + +describe('Static methods', () => { + it('isEditor', () => { + const instance = new TestEditor({} as any, {}); + expect((OldEditor as any).isEditor(instance)).toBe(true); + expect(mockIsEditorMock).toHaveBeenCalledWith(instance); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/check_box.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/check_box.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a6ee592da69a6e6d62b5aaa1715eb24a75ea15a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/check_box.ts @@ -0,0 +1,23 @@ +import Editor from './editor'; + +export default class CheckBox extends Editor { + // eslint-disable-next-line class-methods-use-this + _useTemplates(): boolean { + return false; + } + + getSupportedKeyNames(): string[] { + return ['space']; + } + + getProps(): Record { + const props = super.getProps(); + + if (props.value !== null) { + // NOTE: we want CheckBox to be checked if any non-nullable data is passed to value property + props.value = Boolean(props.value); + } + + return props; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/editor.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/editor.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c99a65c5394d2efd4c775a41fedacadff2b7f92 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/editors/editor.ts @@ -0,0 +1,166 @@ +import { isDefined } from '../../../core/utils/type'; +import Component from '../common/component'; +import ValidationEngine from '../../../ui/validation_engine'; +import { extend } from '../../../core/utils/extend'; +// eslint-disable-next-line import/named +import $ from '../../../core/renderer'; +import { data } from '../../../core/element_data'; +import Callbacks from '../../../core/utils/callbacks'; +import OldEditor from '../../../ui/editor/editor'; +import { Option } from '../common/types'; + +const INVALID_MESSAGE_AUTO = 'dx-invalid-message-auto'; +const VALIDATION_TARGET = 'dx-validation-target'; + +export default class Editor extends Component { + showValidationMessageTimeout?: ReturnType; + + validationRequest!: ReturnType; + + // eslint-disable-next-line @typescript-eslint/ban-types + _valueChangeAction!: Function; + + _valueChangeEventInstance?: Event; + + getProps(): Record { + const props = super.getProps(); + props.onFocusIn = (): void => { + const isValidationMessageShownOnFocus = this.option('validationMessageMode') === 'auto'; + + // NOTE: The click should be processed before the validation message is shown because + // it can change the editor's value + if (isValidationMessageShownOnFocus) { + // NOTE: Prevent the validation message from showing + const $validationMessageWrapper = $('.dx-invalid-message.dx-overlay-wrapper'); + $validationMessageWrapper?.removeClass(INVALID_MESSAGE_AUTO); + + const timeToWaitBeforeShow = 150; + if (this.showValidationMessageTimeout) { + clearTimeout(this.showValidationMessageTimeout); + } + + // NOTE: Show the validation message after a click changes the value + this.showValidationMessageTimeout = setTimeout(() => { + $validationMessageWrapper?.addClass(INVALID_MESSAGE_AUTO); + }, timeToWaitBeforeShow); + } + }; + props.saveValueChangeEvent = (e: Event): void => { + this._valueChangeEventInstance = e; + }; + + return props; + } + + _createElement(element: HTMLElement): void { + super._createElement(element); + this.showValidationMessageTimeout = undefined; + this.validationRequest = Callbacks(); + data(this.$element()[0], VALIDATION_TARGET, this); + } + + _init(): void { + super._init(); + + this._valueChangeAction = this._createActionByOption('onValueChanged', { + excludeValidators: ['disabled', 'readOnly'], + }); + } + + _initOptions(options: Record): void { + super._initOptions(options); + + this.option((ValidationEngine as unknown as ({ initValidationOptions })) + .initValidationOptions(options)); + } + + _getDefaultOptions(): Record { + return extend( + super._getDefaultOptions(), + { + validationMessageOffset: { h: 0, v: 0 }, + validationTooltipOptions: {}, + }, + ) as Record; + } + + _bindInnerWidgetOptions(innerWidget: Component, optionsContainer: string): void { + const innerWidgetOptions = extend({}, innerWidget.option()); + const syncOptions = (): void => this._silent(optionsContainer, innerWidgetOptions); + + syncOptions(); + innerWidget.on('optionChanged', syncOptions); + } + + _raiseValidation(value: unknown, previousValue: unknown): void { + const areValuesEmpty = !isDefined(value) && !isDefined(previousValue); + + if (value !== previousValue && !areValuesEmpty) { + this.validationRequest.fire({ + value, + editor: this, + }); + } + } + + _raiseValueChangeAction(value: unknown, previousValue: unknown): void { + this._valueChangeAction?.({ + element: this.$element(), + previousValue, + value, + event: this._valueChangeEventInstance, + }); + this._valueChangeEventInstance = undefined; + } + + _optionChanged(option: Option): void { + const { name, value, previousValue } = option; + + if (name && this._getActionConfigs()[name] !== undefined) { + this._addAction(name); + } + + switch (name) { + case 'value': + this._raiseValidation(value, previousValue); + this._raiseValueChangeAction(value, previousValue); + break; + case 'onValueChanged': + this._valueChangeAction = this._createActionByOption('onValueChanged', { + excludeValidators: ['disabled', 'readOnly'], + }); + break; + case 'isValid': + case 'validationError': + case 'validationErrors': + case 'validationStatus': + this.option((ValidationEngine as unknown as ({ synchronizeValidationOptions })) + .synchronizeValidationOptions(option, this.option())); + break; + default: + break; + } + + super._optionChanged(option); + } + + reset(): void { + const { value } = this._getDefaultOptions(); + this.option({ value }); + } + + _dispose(): void { + super._dispose(); + + data(this.element(), VALIDATION_TARGET, null); + if (this.showValidationMessageTimeout) { + clearTimeout(this.showValidationMessageTimeout); + } + } +} + +const prevIsEditor = (OldEditor as unknown as { isEditor: (instance: Component) => boolean }) + .isEditor; +const newIsEditor = (instance): boolean => prevIsEditor(instance) || instance instanceof Editor; +(Editor as unknown as { isEditor: (instance: Component) => boolean }).isEditor = newIsEditor; +(OldEditor as unknown as { isEditor: (instance: Component) => boolean }).isEditor = newIsEditor; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/grid_pager.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/grid_pager.ts new file mode 100644 index 0000000000000000000000000000000000000000..0e034933b0257a9fcecd4571fb4c682650ef4aaf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/grid_pager.ts @@ -0,0 +1,26 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import Component from './common/component'; +import { Option } from './common/types'; + +export class GridPagerWrapper extends Component { + _optionChanged(args: Option): void { + switch (args.name) { + case 'pageIndex': { + const pageIndexChanged = this.option('pageIndexChanged') as Function; + if (pageIndexChanged) { + pageIndexChanged(args.value); + } + break; + } + case 'pageSize': { + const pageSizeChanged = this.option('pageSizeChanged') as Function; + if (pageSizeChanged) { + pageSizeChanged(args.value); + } + break; + } + default: break; + } + super._optionChanged(args); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scroll_view.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scroll_view.ts new file mode 100644 index 0000000000000000000000000000000000000000..6896d2bae370d08b5b63b83048ecf9d2140d188a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scroll_view.ts @@ -0,0 +1,30 @@ +import Component from '../common/component'; +import { Deferred } from '../../../core/utils/deferred'; +import { Option } from '../common/types'; +import type { ScrollView } from '../../ui/scroll_view/scroll_view'; + +export class ScrollViewWrapper extends Component { + update(): unknown { + (this.viewRef as ScrollView)?.updateHandler(); + return Deferred().resolve(); + } + + // TODO: the public method in component override this method + // waits for generator squad. Need to pass. + release(preventScrollBottom: boolean): unknown { + (this.viewRef as ScrollView).release(preventScrollBottom); + return Deferred().resolve(); + } + + _dimensionChanged(): void { + (this.viewRef as ScrollView)?.updateHandler(); + } + + _optionChanged(option: Option): void { + const { name } = option; + if (name === 'useNative') { + this._isNodeReplaced = false; + } + super._optionChanged(option); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scrollable.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scrollable.ts new file mode 100644 index 0000000000000000000000000000000000000000..c74d7962b91279676ef893a64907960ed9137ee4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/navigation/scrollable.ts @@ -0,0 +1,44 @@ +import type { Scrollable } from '../../ui/scroll_view/scrollable'; +import { DxMouseEvent } from '../../ui/scroll_view/common/types'; +import Component from '../common/component'; +import { Option } from '../common/types'; +import { Deferred } from '../../../core/utils/deferred'; +import type { dxElementWrapper } from '../../../core/renderer'; + +export class ScrollableWrapper extends Component { + handleMove(event: DxMouseEvent): void { + (this.viewRef as Scrollable).scrollableRef.handleMove(event); + } + + update(): unknown { + (this.viewRef as Scrollable)?.updateHandler(); + return Deferred().resolve(); + } + + _visibilityChanged(): void {} + + _dimensionChanged(): void { + (this.viewRef as Scrollable)?.updateHandler(); + } + + $content(): dxElementWrapper { + return (this.$element() as unknown as dxElementWrapper).find('.dx-scrollable-content').eq(0); + } + + _moveIsAllowed(event: DxMouseEvent): boolean { + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return (this.viewRef as Scrollable).scrollableRef.moveIsAllowed(event); + } + + _prepareDirections(value: boolean): void { + (this.viewRef as Scrollable).scrollableRef.prepareDirections(value); + } + + _optionChanged(option: Option): void { + const { name } = option; + if (name === 'useNative') { + this._isNodeReplaced = false; + } + super._optionChanged(option); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/date_table.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/date_table.ts new file mode 100644 index 0000000000000000000000000000000000000000..d3d760a71b4556180fe62148c7914625caf95b54 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/date_table.ts @@ -0,0 +1,13 @@ +/* eslint-disable no-underscore-dangle */ +import Component from '../common/component'; + +export class DateTable extends Component { + _setOptionsByReference(): void { + super._setOptionsByReference(); + + this._optionsByReference = { + ...this._optionsByReference, + dataCellTemplate: true, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/group_panel.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/group_panel.ts new file mode 100644 index 0000000000000000000000000000000000000000..dde299e916a16d6884c7c01e8905f66f907d2abb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/group_panel.ts @@ -0,0 +1,13 @@ +/* eslint-disable no-underscore-dangle */ +import Component from '../common/component'; + +export class GroupPanelWrapper extends Component { + _setOptionsByReference(): void { + super._setOptionsByReference(); + + this._optionsByReference = { + ...this._optionsByReference, + resourceCellTemplate: true, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/header_panel.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/header_panel.ts new file mode 100644 index 0000000000000000000000000000000000000000..d60c08b38ac0c2b2600655f1f9ea3f75ce307285 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/header_panel.ts @@ -0,0 +1,16 @@ +/* eslint-disable no-underscore-dangle */ +import Component from '../common/component'; + +export class HeaderPanel extends Component { + _setOptionsByReference(): void { + super._setOptionsByReference(); + + this._optionsByReference = { + ...this._optionsByReference, + dateHeaderData: true, + resourceCellTemplate: true, + dateCellTemplate: true, + timeCellTemplate: true, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/time_panel.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/time_panel.ts new file mode 100644 index 0000000000000000000000000000000000000000..b518e0259e38ba1ee6a1083e6403854b8b55951e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/scheduler/time_panel.ts @@ -0,0 +1,13 @@ +/* eslint-disable no-underscore-dangle */ +import Component from '../common/component'; + +export class TimePanel extends Component { + _setOptionsByReference(): void { + super._setOptionsByReference(); + + this._optionsByReference = { + ...this._optionsByReference, + timeCellTemplate: true, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/__tests__/update-props-immutable.test.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/__tests__/update-props-immutable.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f19cb570dbdf133305ece0aa676993d2a75ab79 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/__tests__/update-props-immutable.test.ts @@ -0,0 +1,169 @@ +import { updatePropsImmutable } from '../update_props_immutable'; + +class Dummy { + nestedProp: string; + + constructor(nestedProp: string) { this.nestedProp = nestedProp; } +} + +it('simple value', () => { + const props = { name: 'a' }; + const option = { name: 'b' }; + updatePropsImmutable(props, option, 'name', 'name'); + expect(props.name).toBe('b'); +}); + +it('object value', () => { + const nestedObject = { nestedProp: 'initial value' }; + const newNestedObject = { nestedProp: 'new value' }; + const option = { nestedObject: newNestedObject }; + const props = { nestedObject }; + updatePropsImmutable(props, option, 'nestedObject', 'nestedObject'); + expect(props.nestedObject).not.toBe(newNestedObject); + expect(props.nestedObject.nestedProp).toBe('new value'); +}); + +it('change nested object option to plain object value', () => { + const option = { nestedObject: { nestedProp: 'new value' } }; + const props = { nestedObject: option.nestedObject }; + updatePropsImmutable(props, option, 'nestedObject', 'nestedObject.nestedProp'); + expect(props.nestedObject).not.toBe(option.nestedObject); + expect(props.nestedObject.nestedProp).toBe('new value'); +}); + +it('change second level nested object option to plain object value', () => { + const option = { nestedObject1: { nestedObject2: { nestedProp: 'new value' } } }; + const props = { nestedObject1: option.nestedObject1 }; + + updatePropsImmutable(props, option, 'nestedObject1', 'nestedObject1.nestedObject2.nestedProp'); + expect(props.nestedObject1).not.toBe(option.nestedObject1); + expect(props.nestedObject1.nestedObject2).not.toBe(option.nestedObject1.nestedObject2); + expect(props.nestedObject1.nestedObject2.nestedProp).toBe('new value'); +}); + +it('change nested object option to plain object value 1', () => { + const option = { nestedObject: { nestedProp: 'new value' } }; + const props = { nestedObject: option.nestedObject }; + updatePropsImmutable(props, option, 'nestedObject', 'nestedObject'); + expect(props.nestedObject).not.toBe(option.nestedObject); + expect(props.nestedObject.nestedProp).toBe('new value'); +}); + +it('change nested object option to class object value', () => { + const option = { nestedObject: new Dummy('value') }; + const props = { nestedObject: option.nestedObject }; + updatePropsImmutable(props, option, 'nestedObject', 'nestedObject'); + + expect(props.nestedObject).toBe(option.nestedObject); +}); + +it('change array option', () => { + const dataSource = []; + + const option = { dataSource }; + const props = { dataSource: option.dataSource }; + updatePropsImmutable(props, option, 'dataSource', 'dataSource'); + + expect(props.dataSource).toBe(dataSource); +}); + +it('change item in nested array option', () => { + const nestedArray = [{ nestedProp: 'item1' }, { nestedProp: 'item2' }, { nestedProp: 'item3' }]; + + const option = { nestedArray }; + const props = { nestedArray: option.nestedArray }; + updatePropsImmutable(props, option, 'nestedArray', 'nestedArray[1].nestedProp'); + + expect(props.nestedArray).not.toBe(nestedArray); + expect(props.nestedArray[0]).toBe(nestedArray[0]); + expect(props.nestedArray[1]).not.toBe(nestedArray[1]); + expect(props.nestedArray[2]).toBe(nestedArray[2]); +}); + +it('change several items in nested array option', () => { + const nestedArray = [{ nestedProp1: 'item11', nestedProp2: 'item12' }]; + + const option = { nestedArray }; + const props = { nestedArray: option.nestedArray }; + + updatePropsImmutable(props, option, 'nestedArray', 'nestedArray[0].nestedProp1'); + option.nestedArray[0].nestedProp1 = 'changed'; + + updatePropsImmutable(props, option, 'nestedArray', 'nestedArray[0].nestedProp2'); + option.nestedArray[0].nestedProp2 = 'changed'; + + expect(props.nestedArray).not.toBe(nestedArray); + expect(props.nestedArray[0]).not.toBe(nestedArray[0]); + expect(props.nestedArray[0].nestedProp1).toBe('item11'); + expect(props.nestedArray[0].nestedProp2).toBe('item12'); +}); + +it('change second level nested object option for empty props', () => { + const option = { nestedObject1: { nestedObject2: { nestedProp: 'new value' } } }; + const props = {} as any; + + updatePropsImmutable(props, option, 'nestedObject1', 'nestedObject1.nestedObject2.nestedProp'); + + expect(props.nestedObject1).not.toBe(option.nestedObject1); + expect(props.nestedObject1.nestedObject2).not.toBe(option.nestedObject1.nestedObject2); + expect(props.nestedObject1.nestedObject2.nestedProp).toBe('new value'); +}); + +it('change modified property in nested object if prevProps', () => { + const option = { nestedObject: { nestedProp: 'new value' } }; + const newNestedObject = { nestedProp: 'old value' }; + const props = { nestedObject: newNestedObject }; + + updatePropsImmutable(props, option, 'nestedObject', 'nestedObject.nestedProp'); + + expect(props.nestedObject).not.toBe(option.nestedObject); + expect(props.nestedObject).not.toBe(newNestedObject); + expect(props.nestedObject.nestedProp).toBe('new value'); +}); + +it('change object item in nested array option', () => { + const nestedArray = ['item1', 'item2']; + + const option = { nestedArray }; + const props = { nestedArray: option.nestedArray }; + nestedArray[1] = 'item2 modified'; + updatePropsImmutable(props, option, 'nestedArray', 'nestedArray[1]'); + + expect(props.nestedArray).not.toBe(nestedArray); + expect(props.nestedArray[1]).toBe('item2 modified'); +}); + +it('change object item in double nested array option', () => { + const objectProp = {}; + + const props = { + item: { + objectProp, + items: [{ value: 'item1' }, { value: 'item2' }], + }, + }; + const option = { item: props.item }; + option.item.items[0].value = 'item1 modified'; + + updatePropsImmutable(props, option, 'item', 'item.items[0].value'); + + expect(props.item.items[0].value).toBe('item1 modified'); + expect(props.item.items[1].value).toBe('item2'); + expect(props.item.objectProp).toBe(objectProp); +}); + +it('updating copies objects property', () => { + const props = { + item1: { item2: { value: 'item1' } }, + }; + const option = { + item1: props.item1, + }; + + option.item1 = { item2: { value: 'item1 modified' } }; + + updatePropsImmutable(props, option, 'item1', 'item1.item2'); + + expect(props.item1.item2.value).toBe('item1 modified'); + expect(props.item1.item2).not.toBe(option.item1.item2); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/update_props_immutable.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/update_props_immutable.ts new file mode 100644 index 0000000000000000000000000000000000000000..c53ffda0205192309596a14ef8ced801a9cf504d --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/update_props_immutable.ts @@ -0,0 +1,55 @@ +import { isPlainObject } from '../../../core/utils/type'; +import { getPathParts } from '../../../core/utils/data'; + +function cloneObjectValue( + value: Record | unknown[], +): Record | unknown[] { + return Array.isArray(value) ? [...value] : { ...value }; +} + +function cloneObjectProp( + value: Record | unknown[], + prevValue: Record | unknown[], + fullNameParts: (string | number)[], +): Record | unknown[] { + const result = fullNameParts.length > 0 && prevValue && value !== prevValue + ? cloneObjectValue(prevValue) + : cloneObjectValue(value); + + const name = fullNameParts[0]; + if (fullNameParts.length > 1) { + result[name] = cloneObjectProp( + value[name] as Record, + prevValue?.[name] as Record, + fullNameParts.slice(1), + ); + } else if (name) { + if (isPlainObject(value[name])) { + result[name] = cloneObjectValue(value[name]); + } else { + result[name] = value[name]; + } + } + return result; +} + +export function updatePropsImmutable( + props: Record, + option: Record, + name: string, + fullName: string, +): void { + const currentPropsValue = option[name]; + const prevPropsValue = props[name]; + const result = props; + + if (isPlainObject(currentPropsValue) || (name !== fullName && Array.isArray(currentPropsValue))) { + result[name] = cloneObjectProp( + currentPropsValue, + prevPropsValue as Record, + getPathParts(fullName).slice(1), + ); + } else { + result[name] = currentPropsValue; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/utils.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..5041f0e22da479df2b0cb716f25d0c1926425282 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/component_wrapper/utils/utils.ts @@ -0,0 +1,20 @@ +// eslint-disable-next-line import/named +import { dxElementWrapper } from '../../../core/renderer'; +import { each } from '../../../core/utils/iterator'; + +export const removeDifferentElements = ( + $children: dxElementWrapper, + $newChildren: dxElementWrapper, +): void => { + each($newChildren, (__: never, element: Element) => { + let hasComponent = false; + each($children, (_: never, oldElement: Element) => { + if (element === oldElement) { + hasComponent = true; + } + }); + if (!hasComponent && element.parentNode) { + element.parentNode.removeChild(element); + } + }); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/components.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/components.js new file mode 100644 index 0000000000000000000000000000000000000000..e261685fdcbd926b91282dcb56a3caa87e404aa6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/components.js @@ -0,0 +1,14 @@ +/* eslint-disable import/no-commonjs */ +// pathToWrapper should contains named export - WrapperWidget. WrapperWidget is predefined. +// Default export doesnt work +module.exports = [ + { name: 'Button', pathInRenovationFolder: 'ui/button.j', pathInJSFolder: 'ui/button.js' }, + { name: 'CheckBox', pathInRenovationFolder: 'ui/editors/check_box/check_box.j', pathInJSFolder: 'ui/check_box.js' }, + // { name: 'Widget', pathInRenovationFolder: 'ui/widget.j' }, + // { name: 'ScrollView', pathInRenovationFolder: 'ui/scroll_view/scroll_view.j', pathInJSFolder: 'ui/scroll_view.js', pathToWrapper: '/testing/helpers/renovationScrollViewHelper.js' }, + // { name: 'Scrollable', pathInRenovationFolder: 'ui/scroll_view/scrollable.j', pathInJSFolder: 'ui/scroll_view/ui.scrollable.js', pathToWrapper: '/testing/helpers/renovationScrollableHelper.js' }, + // { name: 'DataGrid', pathInRenovationFolder: 'ui/grids/data_grid/data_grid.j', pathInJSFolder: 'ui/data_grid.js' }, + { name: 'Scheduler', pathInRenovationFolder: 'ui/scheduler/scheduler.j', pathInJSFolder: 'ui/scheduler.js', inProgress: true }, + { name: 'Pager', pathInRenovationFolder: 'ui/pager/pager.j', pathInJSFolder: 'ui/pager.js', pathToWrapper: '/testing/helpers/renovationPagerHelper.js' }, + // { name: 'Bullet', pathInRenovationFolder: 'viz/sparklines/bullet.j', pathInJSFolder: 'viz/sparklines/bullet.js' }, +]; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/create_ref.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/create_ref.ts new file mode 100644 index 0000000000000000000000000000000000000000..d71ac2dabb72357835a4228e6f9d57251f7f7436 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/create_ref.ts @@ -0,0 +1,5 @@ +import { RefObject } from '@devextreme-generator/declarations'; + +export function createTestRef(current: unknown = {}): RefObject { + return { current } as RefObject; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/events_mock.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/events_mock.ts new file mode 100644 index 0000000000000000000000000000000000000000..9d3cf4d06cf2411f2258fce5d0b9ff095c4c4d2a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/events_mock.ts @@ -0,0 +1,145 @@ +import { keyboard } from '../../events/short'; +import { AbstractFunction } from '../common/types'; + +let eventHandlers = {}; +let keyboardHandlers = {}; +export const KEY = { + enter: 'enter', + space: 'space', + a: 'a', +}; + +export const clear = (): void => { + eventHandlers = {}; + keyboardHandlers = {}; +}; + +export const EVENT = { + active: 'dxactive', + blur: 'focusout', + click: 'click', + dxClick: 'dxclick', + focus: 'focusin', + hiding: 'dxhiding', + hoverEnd: 'dxhoverend', + hoverStart: 'dxhoverstart', + inactive: 'dxinactive', + shown: 'dxshown', + resize: 'dxresize', + dragStart: 'dxdragstart', + dragMove: 'dxdrag', + drag: 'dxdrag', + dragEnd: 'dxdragend', + dragEnter: 'dxdragenter', + dragLeave: 'dxdragleave', + drop: 'dxdrop', + scroll: 'scroll', + scrollStart: 'dxscrollstart', + scrollEnd: 'dxscrollend', + scrollCancel: 'dxscrollcancel', + scrollInit: 'dxscrollinit', + scrollStop: 'dxscrollstop', + scrollMove: 'dxscroll', + pointerDown: 'dxpointerdown', + pointerUp: 'dxpointerup', +}; + +export const defaultEvent = { + type: '', + isDefaultPrevented: (): void => undefined, + preventDefault: (): void => undefined, + stopImmediatePropagation: (): void => undefined, + stopPropagation: (): void => undefined, + screenX: 5, + offsetX: 5, + pageX: 10, + pageY: 10, +}; + +export const fakeClickEvent = { + ...defaultEvent, + screenX: 0, + offsetX: 0, + pageX: 0, + pageY: 0, +}; + +export const getEventHandlers = (e: string): Record => eventHandlers[e]; + +export const emitKeyboard = (key: string, which = key, e = defaultEvent): void => { + Object.keys(keyboardHandlers).forEach((id) => { + keyboardHandlers[id].forEach( + (handler) => handler({ originalEvent: e, keyName: key, which }), + ); + }); +}; + +export const emit = (event: string, e = defaultEvent, element: HTMLElement | null = null): void => { + eventHandlers[event]?.forEach(({ handler, el }) => { + if (!element || el === element) { + handler(e); + } + }); +}; + +let keyboardSubscriberId = 0; + +keyboard.on = (_el, _focusTarget, handler): string => { + keyboardSubscriberId += 1; + keyboardHandlers[keyboardSubscriberId] = keyboardHandlers[keyboardSubscriberId] || []; + keyboardHandlers[keyboardSubscriberId].push(handler); + + return keyboardSubscriberId.toString(); +}; + +keyboard.off = (id) => { keyboardHandlers[id] = []; }; + +jest.mock('../../events/core/events_engine', () => { + const originalEventsEngine = jest.requireActual('../../events/core/events_engine').default; + + return ( + { + ...originalEventsEngine, + + on: (el, eventName, ...args): void => { + if (typeof eventName === 'string') { + const event = eventName.split('.')[0]; + + if (!eventHandlers[event]) { + eventHandlers[event] = []; + } + eventHandlers[event].push({ + handler: args[args.length - 1], + el, + }); + } else { + Object.keys(eventName).forEach((event) => { + const name = event.split('.')[0]; + + if (!eventHandlers[name]) { + eventHandlers[name] = []; + } + eventHandlers[name].push({ + handler: eventName[event], + el, + }); + }); + } + }, + + off: (_, eventName): void => { + if (typeof eventName === 'string') { + const event = eventName.split('.')[0]; + eventHandlers[event] = []; + } else { + Object.keys(eventHandlers).forEach((event) => { + eventHandlers[event] = eventHandlers[event]?.filter(({ el }) => el !== _); + }); + } + }, + + trigger: (element, event): void => { + emit(EVENT[event], undefined, element); + }, + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/setup_enzyme.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/setup_enzyme.ts new file mode 100644 index 0000000000000000000000000000000000000000..82edfc9e5adea66e07bb315d4f289569bd066b1e --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/setup_enzyme.ts @@ -0,0 +1,4 @@ +import { configure } from 'enzyme'; +import Adapter from 'enzyme-adapter-react-16'; + +configure({ adapter: new Adapter() }); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/.eslintrc.json b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/.eslintrc.json new file mode 100644 index 0000000000000000000000000000000000000000..8e70fd97c5142cbee8e1f4e627ba0ba105adb0d4 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/.eslintrc.json @@ -0,0 +1,8 @@ +{ + "env": { + "node": true + }, + "rules": { + "import/no-commonjs": "off" + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/declaration.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/declaration.js new file mode 100644 index 0000000000000000000000000000000000000000..5ed888e74992c09a576e7d918d4c816142f69e41 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/declaration.js @@ -0,0 +1,51 @@ +const { compileCode } = require('@devextreme-generator/core'); +const { getTsConfig } = require('@devextreme-generator/build-helpers'); +const generator = require('@devextreme-generator/inferno').default; +const ts = require('typescript'); +const path = require('path'); +const fs = require('fs'); +const tsJest = require('ts-jest'); +const getCacheKey = require('./get_cache_key'); +const { BASE_GENERATOR_OPTIONS_WITH_JQUERY } = require('../../../../build/gulp/generator/generator-options'); + +const THIS_FILE = fs.readFileSync(__filename); +const jestTransformer = tsJest.createTransformer(); +const TS_CONFIG_PATH = 'build/gulp/generator/ts-configs/jest.tsconfig.json'; +const tsConfig = getTsConfig(TS_CONFIG_PATH); + +generator.options = BASE_GENERATOR_OPTIONS_WITH_JQUERY; + +module.exports = { + process(src, filename, config) { + if(filename.indexOf('test_components') !== -1 && path.extname(filename) === '.tsx') { + const result = compileCode(generator, src, { + path: filename, + dirname: path.dirname(filename), + }, + true); + + if(result && result[1]) { + const componentName = (result[1].code.match(/export default class (\w+) extends/) || [])[1]; + if(!componentName) { + return ''; + } + + return jestTransformer.process( + // eslint-disable-next-line spellcheck/spell-checker + ts.transpileModule( + `${result[0].code} + ${result[1].code + .replace('export default', 'export ') + .replace(new RegExp(`\\b${componentName}\\b`, 'g'), `${componentName}Class`) + .replace(new RegExp(`import ${componentName}Component from\\s+\\S+`), `const ${componentName}Component = ${componentName}`)}`, + tsConfig, + ).outputText, filename, config, + ); + } + } + return jestTransformer.process(src, filename, config); + }, + getCacheKey(fileData, filePath, configStr) { + return getCacheKey(fileData, filePath, configStr, THIS_FILE); + }, +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/get_cache_key.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/get_cache_key.js new file mode 100644 index 0000000000000000000000000000000000000000..46ecd6ce5792c6887122859745416ff5b0df887f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/get_cache_key.js @@ -0,0 +1,14 @@ +const crypto = require('crypto'); + +module.exports = function(fileData, filePath, configStr, transformerFileSrc) { + return crypto + .createHash('md5') + .update(transformerFileSrc) + .update('\0', 'utf8') + .update(fileData) + .update('\0', 'utf8') + .update(filePath) + .update('\0', 'utf8') + .update(configStr) + .digest('hex'); +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/tsx.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/tsx.js new file mode 100644 index 0000000000000000000000000000000000000000..f91f0695d9cf13df1924dcf85069439adebd7888 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/test_utils/transformers/tsx.js @@ -0,0 +1,16 @@ +const fs = require('fs'); +const tsJest = require('ts-jest'); +const getCacheKey = require('./get_cache_key'); + +const THIS_FILE = fs.readFileSync(__filename); +const jestTransformer = tsJest.createTransformer(); +const addCreateElementImport = (src) => `import React from 'react'; ${src}`; + +module.exports = { + process(src, filename, config) { + return jestTransformer.process(filename.indexOf('__tests__') > -1 ? src : addCreateElementImport(src), filename, config); + }, + getCacheKey(fileData, filePath, configStr) { + return getCacheKey(fileData, filePath, configStr, THIS_FILE); + }, +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/button.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/button.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3e60849bb4e34c712b782b3fbb4003bbfc3e5132 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/button.test.tsx @@ -0,0 +1,611 @@ +import React from 'react'; +import { mount, shallow } from 'enzyme'; +import devices from '../../../core/devices'; +import { convertRulesToOptions } from '../../../core/options/utils'; +import { current } from '../../../ui/themes'; +import { + clear as clearEventHandlers, + defaultEvent, + emit, + getEventHandlers, + EVENT, +} from '../../test_utils/events_mock'; +import { + Button, ButtonProps, defaultOptionRules, viewFunction, +} from '../button'; +import { Widget } from '../common/widget'; +import { Icon } from '../common/icon'; +import { InkRipple } from '../common/ink_ripple'; + +interface Mock extends jest.Mock {} + +jest.mock('../../../core/devices', () => { + const actualDevices = jest.requireActual('../../../core/devices').default; + const isSimulator = actualDevices.isSimulator.bind(actualDevices); + const real = actualDevices.real.bind(actualDevices); + + actualDevices.isSimulator = jest.fn(isSimulator); + actualDevices.real = jest.fn(real); + + return actualDevices; +}); + +jest.mock('../../../ui/themes', () => ({ + ...jest.requireActual('../../../ui/themes'), + current: jest.fn(() => 'default'), +})); + +describe('Button', () => { + describe('Render', () => { + it('should render InkRipple if useInkRipple is true', () => { + const button = shallow(viewFunction({ + props: { useInkRipple: true }, + inkRippleConfig: { isConfig: true }, + } as any) as any); + expect(button.find(InkRipple).props()).toMatchObject({ + config: { isConfig: true }, + }); + }); + + it('should render submit input if useSubmitBehavior is true', () => { + const button = shallow(viewFunction({ props: { useSubmitBehavior: true } } as any) as any); + const submitInput = button.find('input.dx-button-submit-input'); + expect(submitInput.props()).toMatchObject({ + type: 'submit', + tabIndex: -1, + }); + }); + + it('should render text', () => { + const button = shallow(viewFunction({ props: { text: 'button-text' } } as any) as any); + const buttonText = button.find('.dx-button-content .dx-button-text'); + expect(buttonText.text()).toBe('button-text'); + }); + + it('should not render text if template is defined', () => { + const button = shallow(viewFunction({ + props: { + text: 'button-text', + template: () =>
, + }, + } as any) as any); + const buttonText = button.find('.dx-button-content .dx-button-text'); + expect(buttonText.exists()).toBe(false); + }); + + it('should not render icon component if iconSource is not defined', () => { + const button = shallow(viewFunction({ + props: { + text: 'button-text', + iconPosition: 'left', + }, + } as any) as any); + expect(button.find(Icon).exists()).toBe(false); + }); + + it('should not render icon component if template is defined', () => { + const button = shallow(viewFunction({ + props: { + text: 'button-text', + template: () =>
, + }, + iconSource: 'icon-source', + } as any) as any); + expect(button.find(Icon).exists()).toBe(false); + }); + + it('should render icon component on the left side', () => { + const button = shallow(viewFunction({ + props: { + text: 'button-text', + iconPosition: 'left', + }, + iconSource: 'icon-source', + } as any) as any); + const buttonContent = button.find('.dx-button-content'); + expect(buttonContent.childAt(0).is(Icon)).toBe(true); + expect(buttonContent.find(Icon).props()).toMatchObject({ + source: 'icon-source', + position: 'left', + }); + }); + + it('should render icon component on the right side', () => { + const button = shallow(viewFunction({ + props: { + text: 'button-text', + iconPosition: 'right', + }, + iconSource: 'icon-source', + } as any) as any); + const buttonContent = button.find('.dx-button-content'); + expect(buttonContent.childAt(1).is(Icon)).toBe(true); + expect(buttonContent.childAt(0).text()).toBe('button-text'); + expect(buttonContent.find(Icon).props()).toMatchObject({ + source: 'icon-source', + position: 'right', + }); + }); + + it('should pass template data to the template function', () => { + const template = jest.fn(() =>
); + + mount(viewFunction({ + props: { + template, + }, + buttonTemplateData: { + text: 'button', + icon: 'icon', + templateField1: 'field1', + templateField2: 'field2', + }, + } as any) as any); + + expect(template).toHaveBeenCalledTimes(1); + expect(template).toHaveBeenCalledWith({ + data: { + icon: 'icon', + templateField1: 'field1', + templateField2: 'field2', + text: 'button', + }, + }, {}); + }); + + it('should render template', () => { + const template = ({ data: { text } }: { + data: { + text?: any; + icon?: any; + }; + }) =>
{`${text}_text`}
; + const button = mount(viewFunction({ + props: { template }, + buttonTemplateData: { text: 'button', icon: 'icon' }, + } as any) as any); + + const buttonContent = button.find('.dx-button-content'); + const templateContent = buttonContent.find(template); + const customContent = templateContent.find('.custom-content'); + expect(templateContent.props().data.text).toBe('button'); + expect(templateContent.props().data.icon).toBe('icon'); + expect(customContent.text()).toBe('button_text'); + }); + + it('should pass all necessary properties to the Widget', () => { + const renderOptions = { + aria: { role: 'aria' }, + onActive: () => null, + onInactive: () => null, + }; + const renderProps = { + accessKey: 'A', + activeStateEnabled: true, + disabled: true, + focusStateEnabled: true, + height: 100, + hint: 'hint', + hoverStateEnabled: true, + rtlEnabled: true, + tabIndex: -2, + visible: true, + width: 200, + }; + const cssClasses = 'cssClasses'; + const restAttributes = { attr1: 'value1', attr2: 'value2' }; + const keyDown = () => null; + const onWidgetClick = () => null; + const button = mount(viewFunction({ + ...renderOptions, + props: renderProps, + restAttributes, + cssClasses, + keyDown, + onWidgetClick, + } as any) as any); + expect(button.find(Widget).props()).toMatchObject({ + ...renderOptions, + ...renderProps, + ...restAttributes, + classes: cssClasses, + onKeyDown: keyDown, + onClick: onWidgetClick, + }); + }); + }); + + describe('Behavior', () => { + describe('Effects', () => { + afterEach(clearEventHandlers); + + describe('submitEffect', () => { + it('should be ignored if the "useSubmitBehavior" is false', () => { + const button = new Button({ useSubmitBehavior: false, onSubmit: () => false }); + expect(button.submitEffect()).toBe(undefined); + expect(getEventHandlers(EVENT.click)).toBeUndefined(); + }); + + it('should be ignored if the "onSubmit" is empty', () => { + const button = new Button({ useSubmitBehavior: true, onSubmit: undefined }); + expect(button.submitEffect()).toBe(undefined); + expect(getEventHandlers(EVENT.click)).toBeUndefined(); + }); + + it('should call "onSubmit" callback by submit input click ', () => { + const onSubmit = jest.fn(); + const button = new Button({ useSubmitBehavior: true, onSubmit }); + button.submitInputRef = { current: {} } as any; + button.submitEffect(); + emit(EVENT.click, defaultEvent, button.submitInputRef.current as any); + expect(onSubmit).toHaveBeenCalledTimes(1); + expect(onSubmit).toHaveBeenCalledWith( + { event: defaultEvent, submitInput: button.submitInputRef.current }, + ); + }); + + it('should return event detach callback', () => { + const onSubmit = jest.fn(); + const button = new Button({ useSubmitBehavior: true, onSubmit }); + button.submitInputRef = {} as any; + const detach = button.submitEffect() as () => undefined; + expect(getEventHandlers(EVENT.click).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.click).length).toBe(0); + }); + }); + }); + + describe('Methods', () => { + describe('focus', () => { + it('should focus main element', () => { + const button = new Button({}); + button.widgetRef = { current: { focus: jest.fn() } } as any; + button.focus(); + + expect(button.widgetRef.current?.focus).toHaveBeenCalledTimes(1); + expect(button.widgetRef.current?.focus).toHaveBeenCalledWith(); + }); + }); + + describe('Methods', () => { + describe('activate', () => { + it('should call widget\'s activate method', () => { + const button = new Button({}); + button.widgetRef = { current: { activate: jest.fn() } } as any; + button.activate(); + + expect(button.widgetRef.current?.activate).toHaveBeenCalledTimes(1); + expect(button.widgetRef.current?.activate).toHaveBeenCalledWith(); + }); + }); + + describe('deactivate', () => { + it('should call widget\'s deactivate method', () => { + const button = new Button({}); + button.widgetRef = { current: { deactivate: jest.fn() } } as any; + button.deactivate(); + + expect(button.widgetRef.current?.deactivate).toHaveBeenCalledTimes(1); + expect(button.widgetRef.current?.deactivate).toHaveBeenCalledWith(); + }); + }); + }); + }); + + describe('Events', () => { + describe('Widget', () => { + describe('Key down', () => { + it('should call onKeyDown callback by Widget key down', () => { + const onKeyDown = jest.fn(() => ({ cancel: true })); + const originalEvent = {} as Event & { cancel: boolean }; + const options = { keyName: '', which: '', originalEvent }; + const button = new Button({ onKeyDown }); + button.keyDown(options); + expect(onKeyDown).toHaveBeenCalledTimes(1); + expect(onKeyDown).toHaveBeenCalledWith(options); + }); + + it('should prevent key down event processing if onKeyDown event handler returns event.cancel="true"', () => { + const onKeyDown = jest.fn(() => ({ cancel: true })); + const onClick = jest.fn(); + const originalEvent = {} as Event & { cancel: boolean }; + const options = { keyName: 'enter', which: 'enter', originalEvent }; + const button = new Button({ onKeyDown, onClick }); + button.keyDown(options); + expect(onKeyDown).toBeCalled(); + expect(onClick).not.toBeCalled(); + }); + + it('should prevent default key down event and simulate click by space/enter keys', () => { + const onClick = jest.fn(); + const originalEvent = { + preventDefault: jest.fn(), + } as unknown as Event & { cancel: boolean }; + const options = { + keyName: 'enter', + which: 'enter', + originalEvent, + }; + const button = new Button({ onClick }); + button.keyDown(options); + expect(options.originalEvent.preventDefault).toBeCalled(); + expect(onClick).toHaveBeenCalledTimes(1); + expect(onClick).toHaveBeenCalledWith({ + event: options.originalEvent, + }); + }); + + it('should not simulate click by common keys down', () => { + const onClick = jest.fn(); + const button = new Button({ onClick }); + const originalEvent = {} as Event & { cancel: boolean }; + button.keyDown({ keyName: 'A', which: 'A', originalEvent }); + expect(onClick).not.toBeCalled(); + }); + }); + + describe('Click', () => { + it('should call onClick callback by Widget click', () => { + const onClick = jest.fn(); + const event = {} as Event; + const button = new Button({ onClick }); + button.onWidgetClick(event); + expect(onClick).toHaveBeenCalledTimes(1); + expect(onClick).toHaveBeenCalledWith({ + event, + }); + }); + + it('should force form submit by Widget click if the "useSubmitBehavior" is true', () => { + const event = {} as Event; + const button = new Button({ useSubmitBehavior: true }); + button.submitInputRef = { current: { click: jest.fn() } } as any; + button.onWidgetClick(event); + expect(button.submitInputRef.current?.click).toHaveBeenCalledTimes(1); + }); + + it('should not force form submit by Widget click if the "useSubmitBehavior" is false', () => { + const event = {} as Event; + const button = new Button({ useSubmitBehavior: false }); + button.submitInputRef = { current: { click: jest.fn() } } as any; + button.onWidgetClick(event); + expect(button.submitInputRef.current?.click).not.toBeCalled(); + }); + }); + + describe('Active/Inactive', () => { + it('should ignore inkripple effects if the useInkRipple is "false"', () => { + const button = new Button({ useInkRipple: false }); + button.inkRippleRef = { + current: { + showWave: jest.fn(), + hideWave: jest.fn(), + }, + } as any; + + button.onActive({} as Event); + button.onInactive({} as Event); + expect(button.inkRippleRef.current?.showWave).not.toHaveBeenCalled(); + expect(button.inkRippleRef.current?.hideWave).not.toHaveBeenCalled(); + }); + + it('should show inkripple effect on active action', () => { + const button = new Button({ useInkRipple: true }); + const contentRef = { current: {} }; + const event = {} as Event; + button.contentRef = contentRef as any; + button.inkRippleRef = { current: { showWave: jest.fn() } } as any; + button.onActive(event); + + expect(button.inkRippleRef.current?.showWave).toHaveBeenCalledTimes(1); + expect(button.inkRippleRef.current?.showWave).toHaveBeenCalledWith({ + element: contentRef.current, event, + }); + }); + + it('should hide inkripple effect on inactive action', () => { + const button = new Button({ useInkRipple: true }); + const contentRef = { current: {} }; + const event = {} as Event; + button.contentRef = contentRef as any; + button.inkRippleRef = { current: { hideWave: jest.fn() } } as any; + button.onInactive(event); + + expect(button.inkRippleRef.current?.hideWave).toHaveBeenCalledTimes(1); + expect(button.inkRippleRef.current?.hideWave).toHaveBeenCalledWith({ + element: contentRef.current, event, + }); + }); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + describe('aria', () => { + it('should compile label value from the icon if the icon source type is "image"', () => { + let button = new Button({ icon: 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==' }); + expect(button.aria).toEqual({ label: 'Base64', role: 'button' }); + + button = new Button({ icon: '.' }); + expect(button.aria).toEqual({ label: '.', role: 'button' }); + }); + + it('should not return label if the text and the icon are empty', () => { + expect(new Button({}).aria).toEqual({ role: 'button' }); + }); + + it('should return icon value if the text is empty', () => { + expect(new Button({ icon: 'icon' }).aria) + .toEqual({ label: 'icon', role: 'button' }); + }); + + it('should return text value if it is specified', () => { + expect(new Button({ text: 'text' }).aria).toEqual({ label: 'text', role: 'button' }); + }); + }); + + describe('cssClasses', () => { + it('should add button styling mode class', () => { + expect(new Button({ stylingMode: 'text' }).cssClasses) + .toEqual(expect.stringMatching('dx-button-mode-text')); + }); + + it('should add "contained" button styling mode class by default', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.stringMatching('dx-button-mode-contained')); + }); + + it('should add button type class', () => { + expect(new Button({ type: 'back' }).cssClasses) + .toEqual(expect.stringMatching('dx-button-back')); + }); + + it('should add "normal" button type class by default', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.stringMatching('dx-button-normal')); + }); + + it('should add "right" icon position class if iconPosition is not "left"', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.stringMatching('dx-button-icon-right')); + + expect(new Button({ iconPosition: 'center' }).cssClasses) + .toEqual(expect.stringMatching('dx-button-icon-right')); + }); + + it('should not add icon position class if iconPosition is "left"', () => { + expect(new Button({ iconPosition: 'left' }).cssClasses) + .toEqual(expect.not.stringMatching('dx-button-icon-')); + }); + + it('should add "dx-button" class', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.stringMatching(/dx-button(\s|$)/)); + }); + + it('should add button text class', () => { + expect(new Button({ text: 'text' }).cssClasses) + .toEqual(expect.stringMatching('dx-button-has-text')); + }); + + it('should add button icon class', () => { + expect(new Button({ icon: 'icon' }).cssClasses) + .toEqual(expect.stringMatching('dx-button-has-icon')); + }); + + it('should not add button text class by default', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.not.stringMatching('dx-button-has-text')); + }); + + it('should not add button icon class by default', () => { + expect(new Button({}).cssClasses) + .toEqual(expect.not.stringMatching('dx-button-has-icon')); + }); + }); + + describe('iconSource', () => { + it('should return "icon" property value if defined', () => { + expect(new Button({ icon: 'icon' }).iconSource).toBe('icon'); + }); + + it('should return "icon" property value if the type is "back"', () => { + expect(new Button({ icon: 'icon', type: 'back' }).iconSource) + .toBe('icon'); + }); + + it('should return "back" property value for the back button', () => { + expect(new Button({ type: 'back' }).iconSource).toBe('back'); + }); + + it('should return "back" if icon property is empty and type is "back"', () => { + expect(new Button({}).iconSource).toBe(''); + }); + + it('should return empty string if the type property value is not "back"', () => { + expect(new Button({ type: 'normal' }).iconSource).toBe(''); + }); + }); + + describe('inkRippleConfig', () => { + const rippleConfig = { + isCentered: true, + useHoldAnimation: false, + waveSizeCoefficient: 1, + }; + + it('should return empty config for the text button', () => { + expect(new Button({ text: 'text' }).inkRippleConfig).toEqual({}); + }); + + it('should return config for the icon only button', () => { + expect(new Button({ icon: 'icon' }).inkRippleConfig) + .toEqual(rippleConfig); + }); + + it('should return config for the back button', () => { + expect(new Button({ type: 'back' }).inkRippleConfig) + .toEqual(rippleConfig); + }); + }); + + describe('buttonTemplateData', () => { + it('should return icon and text as is', () => { + expect(new Button({ icon: 'icon', text: 'text' }).buttonTemplateData) + .toEqual({ icon: 'icon', text: 'text' }); + }); + + it('should add templateData fields', () => { + const templateData = { customData: 'data ' }; + + expect(new Button({ icon: 'icon', text: 'text', templateData }).buttonTemplateData) + .toEqual({ icon: 'icon', text: 'text', ...templateData }); + }); + }); + }); + + describe('Default options', () => { + const getDefaultOptions = (): ButtonProps => Object.assign(new ButtonProps(), + convertRulesToOptions(defaultOptionRules)); + + beforeEach(() => { + (devices.real as Mock).mockImplementation(() => ({ deviceType: 'desktop' })); + (devices.isSimulator as Mock).mockImplementation(() => false); + (current as Mock).mockImplementation(() => 'default'); + }); + + afterEach(() => jest.resetAllMocks()); + + describe('useInkRiple', () => { + it('should be true if material theme', () => { + (current as Mock).mockImplementation(() => 'material'); + expect(getDefaultOptions().useInkRipple).toBe(true); + }); + + it('should be false if theme is not material', () => { + (current as Mock).mockImplementation(() => 'default'); + expect(getDefaultOptions().useInkRipple).toBe(false); + }); + }); + + describe('focusStateEnabled', () => { + it('should be false if device is not desktop', () => { + (devices.real as Mock).mockImplementation(() => ({ deviceType: 'android' })); + expect(getDefaultOptions().focusStateEnabled).toBe(false); + }); + + it('should be true on desktop and not simulator', () => { + expect(getDefaultOptions().focusStateEnabled).toBe(true); + }); + + it('should be false on simulator', () => { + (devices.isSimulator as Mock).mockImplementation(() => true); + expect(getDefaultOptions().focusStateEnabled).toBe(false); + }); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/droppable.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/droppable.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d88abcc31424591146d1562fbbbddff6f2afd2bb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/droppable.test.tsx @@ -0,0 +1,219 @@ +import React, { createRef } from 'react'; +import { mount } from 'enzyme'; +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import { + emit, getEventHandlers, clear as clearEventHandlers, EVENT, +} from '../../test_utils/events_mock'; +import { Droppable, DroppableProps, viewFunction as DroppableView } from '../droppable'; +import { DisposeEffectReturn } from '../../utils/effect_return'; + +describe('Droppable', () => { + describe('View', () => { + it('default render', () => { + const mockRef = createRef(); + const props = new DroppableProps(); + const droppableProps = { + cssClasses: 'test', + widgetRef: mockRef, + restAttributes: { 'rest-attributes': 'true' }, + props, + } as unknown as Droppable; + const tree = mount( as any); + + expect(tree.find('div').props()).toMatchObject({ + className: 'test', + 'rest-attributes': 'true', + }); + + expect(tree.find('div').instance()).toBe(mockRef.current); + }); + + it('should render children', () => { + const props = { + children:
, + }; + const widget = mount(DroppableView({ + props, + } as any) as any); + + expect(widget.find('.child').exists()).toBe(true); + }); + }); + + describe('Logic', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('Getters', () => { + describe('cssClasses', () => { + it('should add \'className\' class', () => { + const droppable = new Droppable({ className: 'custom-class' }); + + expect(droppable.cssClasses).toEqual('custom-class dx-droppable'); + }); + + it('should add disabled class', () => { + const droppable = new Droppable({ disabled: true }); + + expect(droppable.cssClasses).toEqual('dx-droppable dx-state-disabled'); + }); + }); + }); + }); + + describe('Behavior', () => { + describe('Effects', () => { + describe('dropEventsEffect', () => { + beforeEach(clearEventHandlers); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should subscribe to drop events', () => { + const droppable = new Droppable({}); + + const widgetRef = createRef() as any; + droppable.widgetRef = widgetRef; + droppable.dragEnterHandler = jest.fn(); + droppable.dragLeaveHandler = jest.fn(); + droppable.dropHandler = jest.fn(); + + droppable.dropEventsEffect(); + + emit(EVENT.dragEnter); + + expect(droppable.dragEnterHandler).toHaveBeenCalledTimes(1); + expect(droppable.dragLeaveHandler).toHaveBeenCalledTimes(0); + expect(droppable.dropHandler).toHaveBeenCalledTimes(0); + + emit(EVENT.dragLeave); + + expect(droppable.dragEnterHandler).toHaveBeenCalledTimes(1); + expect(droppable.dragLeaveHandler).toHaveBeenCalledTimes(1); + expect(droppable.dropHandler).toHaveBeenCalledTimes(0); + + emit(EVENT.drop); + + expect(droppable.dragEnterHandler).toHaveBeenCalledTimes(1); + expect(droppable.dragLeaveHandler).toHaveBeenCalledTimes(1); + expect(droppable.dropHandler).toHaveBeenCalledTimes(1); + }); + + it('should return unsubscribe callback', () => { + const droppable = new Droppable({}); + + const widgetRef = createRef() as any; + droppable.widgetRef = widgetRef; + droppable.dragEnterHandler = jest.fn(); + droppable.dragLeaveHandler = jest.fn(); + droppable.dropHandler = jest.fn(); + + const detach = droppable.dropEventsEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.dragEnter).length).toBe(1); + expect(getEventHandlers(EVENT.dragLeave).length).toBe(1); + expect(getEventHandlers(EVENT.drop).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.dragEnter).length).toBe(0); + expect(getEventHandlers(EVENT.dragLeave).length).toBe(0); + expect(getEventHandlers(EVENT.drop).length).toBe(0); + }); + + it('should not subscribe to drop events if widget is disabled', () => { + const droppable = new Droppable({ disabled: true }); + + const widgetRef = createRef() as any; + droppable.widgetRef = widgetRef; + droppable.dragEnterHandler = jest.fn(); + droppable.dragLeaveHandler = jest.fn(); + droppable.dropHandler = jest.fn(); + + droppable.dropEventsEffect(); + + expect(getEventHandlers(EVENT.dragStart)).toBe(undefined); + expect(getEventHandlers(EVENT.dragMove)).toBe(undefined); + expect(getEventHandlers(EVENT.dragEnd)).toBe(undefined); + }); + }); + }); + + describe('Events', () => { + it('onDragEnter', () => { + const onDragEnter = jest.fn(); + const event = {} as Event; + const droppable = new Droppable({ onDragEnter }); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + droppable.dragEnterHandler(event); + + expect(onDragEnter).toHaveBeenCalledTimes(1); + expect(onDragEnter).toHaveBeenCalledWith({ + event, + itemElement: widgetRef.current, + }); + }); + + it('call dragEnterHandler without onDragEnter prop', () => { + const event = {} as Event; + const droppable = new Droppable({}); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + expect(droppable.dragEnterHandler.bind(droppable, event)).not.toThrow(); + }); + + it('onDragLeave', () => { + const onDragLeave = jest.fn(); + const event = {} as Event; + const droppable = new Droppable({ onDragLeave }); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + droppable.dragLeaveHandler(event); + + expect(onDragLeave).toHaveBeenCalledTimes(1); + expect(onDragLeave).toHaveBeenCalledWith({ + event, + itemElement: widgetRef.current, + }); + }); + + it('call dragLeaveHandler without onDragLeave prop', () => { + const event = {} as Event; + const droppable = new Droppable({}); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + expect(droppable.dragLeaveHandler.bind(droppable, event)).not.toThrow(); + }); + + it('onDrop', () => { + const onDrop = jest.fn(); + const event = {} as Event; + const droppable = new Droppable({ onDrop }); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + droppable.dropHandler(event); + + expect(onDrop).toHaveBeenCalledTimes(1); + expect(onDrop).toHaveBeenCalledWith({ + event, + itemElement: widgetRef.current, + }); + }); + + it('call dropHandler without onDrop prop', () => { + const event = {} as Event; + const droppable = new Droppable({}); + const widgetRef = { current: {} as any } as any; + droppable.widgetRef = widgetRef; + + expect(droppable.dropHandler.bind(droppable, event)).not.toThrow(); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/list.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/list.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..85e65891c1cbf4afe75e7d75900728d539079b13 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/__tests__/list.test.tsx @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import React from 'react'; +import { shallow } from 'enzyme'; +import LegacyList from '../../../ui/list'; +import { viewFunction as ListView, ListProps, List } from '../list'; +import { DomComponentWrapper } from '../common/dom_component_wrapper'; + +jest.mock('../../../ui/list', () => jest.fn()); + +describe('List', () => { + describe('View', () => { + it('default render', () => { + const componentProps = new ListProps(); + const props = { + props: componentProps, + restAttributes: { 'rest-attributes': 'true' }, + } as Partial; + const tree = shallow( as any); + + expect(tree.find(DomComponentWrapper).props()).toMatchObject({ + componentProps, + componentType: LegacyList, + 'rest-attributes': 'true', + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/__tests__/box.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/__tests__/box.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e962e300bb4d8a9c1f9a585a8540ef262a6a5649 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/__tests__/box.test.tsx @@ -0,0 +1,104 @@ +import { mount } from 'enzyme'; +import React from 'react'; +import each from 'jest-each'; +import { BoxProps } from '../box_props'; +import { Box, viewFunction } from '../box'; +import { Widget } from '../../common/widget'; + +it('ResponsiveBox > InitialProps', () => { + const props = new BoxProps(); + const box = mount(); + + expect(box.props()).toEqual({ + align: 'start', + crossAlign: 'stretch', + direction: 'row', + }); +}); + +describe('Box > Attrs', () => { + describe('cssClasses', () => { + it('Check has dx-box class', () => { + const responsiveBox = mount(); + const { classList } = responsiveBox.getDOMNode(); + + expect(classList.contains('dx-box')).toEqual(true); + expect(classList.contains('dx-box-flex')).toEqual(true); + }); + }); + + each([1, 'text', true, undefined, null]).describe('cssStyles: %o', (style) => { + it('Should pass styles to container from cssStyles', () => { + const box = mount(viewFunction({ cssStyles: style } as any)); + const rootContainer = box.find(Widget); + + expect(rootContainer.props().style).toEqual(style); + }); + }); + + describe('Check result of props values', () => { + it('display style', () => { + const props = {} as BoxProps; + const box = new Box(props); + expect(box.cssStyles.display).toEqual('flex'); + }); + + it('direction', () => { + let props = { direction: 'row' } as any; + expect(new Box(props).cssStyles.flexDirection).toEqual('row'); + + props = { direction: 'col' }; + expect(new Box(props).cssStyles.flexDirection).toEqual('column'); + + props = { direction: null }; + expect(new Box(props).cssStyles.flexDirection).toEqual(undefined); + + props = { direction: undefined }; + expect(new Box(props).cssStyles.flexDirection).toEqual(undefined); + }); + + it('align', () => { + let props = { align: 'center' } as any; + expect(new Box(props).cssStyles.justifyContent).toEqual('center'); + + props = { align: 'end' }; + expect(new Box(props).cssStyles.justifyContent).toEqual('flex-end'); + + props.align = 'space-around'; + props = { align: 'space-around' }; + expect(new Box(props).cssStyles.justifyContent).toEqual('space-around'); + + props = { align: 'space-between' }; + expect(new Box(props).cssStyles.justifyContent).toEqual('space-between'); + + props = { align: 'start' }; + expect(new Box(props).cssStyles.justifyContent).toEqual('flex-start'); + + props = { align: null }; + expect(new Box(props).cssStyles.justifyContent).toEqual(null); + + props = { align: undefined }; + expect(new Box(props).cssStyles.justifyContent).toEqual(undefined); + }); + + it('crossAlign', () => { + let props = { crossAlign: 'center' } as any; + expect(new Box(props).cssStyles.alignItems).toEqual('center'); + + props = { crossAlign: 'end' }; + expect(new Box(props).cssStyles.alignItems).toEqual('flex-end'); + + props = { crossAlign: 'start' }; + expect(new Box(props).cssStyles.alignItems).toEqual('flex-start'); + + props = { crossAlign: 'stretch' }; + expect(new Box(props).cssStyles.alignItems).toEqual('stretch'); + + props = { crossAlign: undefined }; + expect(new Box(props).cssStyles.alignItems).toEqual(undefined); + + props = { crossAlign: null }; + expect(new Box(props).cssStyles.alignItems).toEqual(null); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/_toDelete/box.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/_toDelete/box.js new file mode 100644 index 0000000000000000000000000000000000000000..4165086d568cdd3e6beef6c7ea8532961fe5b4ca --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/_toDelete/box.js @@ -0,0 +1,360 @@ +import $ from '../core/renderer'; +import registerComponent from '../core/component_registrator'; +import { extend } from '../core/utils/extend'; +import { noop } from '../core/utils/common'; +import { hasWindow } from '../core/utils/window'; +import { dasherize } from '../core/utils/inflector'; +import { isDefined } from '../core/utils/type'; +import { normalizeStyleProp, styleProp, stylePropPrefix } from '../core/utils/style'; +import { each } from '../core/utils/iterator'; +import CollectionWidgetItem from './collection/item'; +import CollectionWidget from './collection/ui.collection_widget.edit'; + +// STYLE box + +const BOX_ITEM_CLASS = 'dx-box-item'; +const BOX_ITEM_DATA_KEY = 'dxBoxItemData'; + +const MINSIZE_MAP = { + 'row': 'minWidth', + 'col': 'minHeight' +}; +const MAXSIZE_MAP = { + 'row': 'maxWidth', + 'col': 'maxHeight' +}; +const SHRINK = 1; + +// NEW FLEXBOX STRATEGY + +// FALLBACK STRATEGY FOR IE +const setFlexProp = (element, prop, value) => { + // NOTE: workaround for jQuery version < 1.11.1 (T181692) + value = normalizeStyleProp(prop, value); + element.style[styleProp(prop)] = value; + + // NOTE: workaround for Domino issue https://github.com/fgnass/domino/issues/119 + if(!hasWindow()) { + if(value === '' || !isDefined(value)) { + return; + } + + const cssName = dasherize(prop); + const styleExpr = cssName + ': ' + value + ';'; + + if(!element.attributes.style) { + element.setAttribute('style', styleExpr); + } else if(element.attributes.style.value.indexOf(styleExpr) < 0) { + element.attributes.style.value += ' ' + styleExpr; + } + } +}; + +class BoxItem extends CollectionWidgetItem { + _renderVisible(value, oldValue) { + super._renderVisible(value); + if(isDefined(oldValue)) { + this._options.fireItemStateChangedAction({ + name: 'visible', + state: value, + oldState: oldValue + }); + } + } +} + +class FlexLayoutStrategy { + constructor($element, option) { + this._$element = $element; + this._option = option; + this.initSize = noop; + this.update = noop; + } + + renderBox() { + + } + + renderItems($items) { + const flexPropPrefix = stylePropPrefix('flexDirection'); + const direction = this._option('direction'); + + each($items, function() { + const $item = $(this); + const item = $item.data(BOX_ITEM_DATA_KEY); + + $item.css({ display: flexPropPrefix + 'flex' }) + .css(MAXSIZE_MAP[direction], item.maxSize || 'none') + .css(MINSIZE_MAP[direction], item.minSize || '0'); + + setFlexProp($item.get(0), 'flexBasis', item.baseSize || 0); + setFlexProp($item.get(0), 'flexGrow', item.ratio); + setFlexProp($item.get(0), 'flexShrink', isDefined(item.shrink) ? item.shrink : SHRINK); + + $item.children().each((_, itemContent) => { + $(itemContent).css({ + width: 'auto', + height: 'auto', + display: stylePropPrefix('flexDirection') + 'flex', + flexBasis: 0 + }); + + setFlexProp(itemContent, 'flexGrow', 1); + setFlexProp(itemContent, 'flexDirection', $(itemContent)[0].style.flexDirection || 'column'); + }); + }); + } +} + +class Box extends CollectionWidget { + _getDefaultOptions() { + return extend(super._getDefaultOptions(), { + /** + * @name dxBoxOptions.activeStateEnabled + * @hidden + */ + activeStateEnabled: false, + + /** + * @name dxBoxOptions.focusStateEnabled + * @hidden + */ + focusStateEnabled: false, + + onItemStateChanged: undefined, + + _layoutStrategy: 'flex', + + _queue: undefined + + /** + * @name dxBoxOptions.hint + * @hidden + */ + /** + * @name dxBoxOptions.noDataText + * @hidden + */ + /** + * @name dxBoxOptions.onSelectionChanged + * @action + * @hidden + */ + /** + * @name dxBoxOptions.selectedIndex + * @hidden + */ + /** + * @name dxBoxOptions.selectedItem + * @hidden + */ + /** + * @name dxBoxOptions.selectedItems + * @hidden + */ + /** + * @name dxBoxOptions.selectedItemKeys + * @hidden + */ + /** + * @name dxBoxOptions.keyExpr + * @hidden + */ + /** + * @name dxBoxOptions.tabIndex + * @hidden + */ + /** + * @name dxBoxOptions.accessKey + * @hidden + */ + + + }); + } + + _itemClass() { + return BOX_ITEM_CLASS; + } + + _itemDataKey() { + return BOX_ITEM_DATA_KEY; + } + + _itemElements() { + return this._itemContainer().children(this._itemSelector()); + } + + _init() { + super._init(); + this._initLayout(); + this._initBoxQueue(); + } + + _initLayout() { + this._layout = new FlexLayoutStrategy(this.$element(), this.option.bind(this)); + } + + _initBoxQueue() { + this._queue = this.option('_queue') || []; + } + + _queueIsNotEmpty() { + return this.option('_queue') ? false : !!this._queue.length; + } + + _pushItemToQueue($item, config) { + this._queue.push({ $item: $item, config: config }); + } + + _shiftItemFromQueue() { + return this._queue.shift(); + } + + _initMarkup() { + this._layout.renderBox(); + super._initMarkup(); + this._renderActions(); + } + + _renderActions() { + this._onItemStateChanged = this._createActionByOption('onItemStateChanged'); + } + + _renderItems(items) { + this._layout.initSize(); + super._renderItems(items); + + while(this._queueIsNotEmpty()) { + const item = this._shiftItemFromQueue(); + this._createComponent(item.$item, Box, extend({ + _layoutStrategy: this.option('_layoutStrategy'), + itemTemplate: this.option('itemTemplate'), + itemHoldTimeout: this.option('itemHoldTimeout'), + onItemHold: this.option('onItemHold'), + onItemClick: this.option('onItemClick'), + onItemContextMenu: this.option('onItemContextMenu'), + onItemRendered: this.option('onItemRendered'), + _queue: this._queue + }, item.config)); + } + + this._layout.renderItems(this._itemElements()); + + clearTimeout(this._updateTimer); + + this._updateTimer = setTimeout(() => { + if(!this._isUpdated) { + this._layout.update(); + } + this._isUpdated = false; + this._updateTimer = null; + }); + } + + _renderItemContent(args) { + const $itemNode = args.itemData && args.itemData.node; + if($itemNode) { + return this._renderItemContentByNode(args, $itemNode); + } + + return super._renderItemContent(args); + } + + _postprocessRenderItem(args) { + const boxConfig = args.itemData.box; + if(!boxConfig) { + return; + } + + this._pushItemToQueue(args.itemContent, boxConfig); + } + + _createItemByTemplate(itemTemplate, args) { + if(args.itemData.box) { + return itemTemplate.source ? itemTemplate.source() : $(); + } + return super._createItemByTemplate(itemTemplate, args); + } + + _visibilityChanged(visible) { + if(visible) { + this._dimensionChanged(); + } + } + + _dimensionChanged() { + if(this._updateTimer) { + return; + } + + this._isUpdated = true; + this._layout.update(); + } + + _dispose() { + clearTimeout(this._updateTimer); + super._dispose.apply(this, arguments); + } + + _itemOptionChanged(item, property, value, oldValue) { + if(property === 'visible') { + this._onItemStateChanged({ + name: property, + state: value, + oldState: oldValue !== false + }); + } + super._itemOptionChanged(item, property, value); + } + + _optionChanged(args) { + switch(args.name) { + case '_layoutStrategy': + case '_queue': + case 'direction': + this._invalidate(); + break; + case 'align': + this._layout.renderAlign(); + break; + case 'crossAlign': + this._layout.renderCrossAlign(); + break; + default: + super._optionChanged(args); + } + } + + _itemOptions() { + const options = super._itemOptions(); + + options.fireItemStateChangedAction = e => { + this._onItemStateChanged(e); + }; + + return options; + } + + repaint() { + this._dimensionChanged(); + } + + /** + * @name dxBox.registerKeyHandler + * @publicName registerKeyHandler(key, handler) + * @hidden + */ + + /** + * @name dxBox.focus + * @publicName focus() + * @hidden + */ +} + +Box.ItemClass = BoxItem; + +registerComponent('dxBox', Box); + +export default Box; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fedc790b00281b2134e582f8e23ff69d9fe25b4a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box.tsx @@ -0,0 +1,49 @@ +import { + Component, JSXComponent, +} from '@devextreme-generator/declarations'; +import { Widget } from '../common/widget'; +import { BoxProps } from './box_props'; +import { combineClasses } from '../../utils/combine_classes'; + +export const viewFunction = (viewModel: Box): JSX.Element => ( + +); + +@Component({ + defaultOptionRules: null, + jQuery: { register: true }, + view: viewFunction, +}) + +export class Box extends JSXComponent() { + // eslint-disable-next-line class-methods-use-this + get cssClasses(): string { + return combineClasses({ 'dx-box dx-box-flex': true }); + } + + get cssStyles(): Record { + const DIRECTION_MAP = { row: 'row', col: 'column' }; + const tryGetFromMap = (prop: string, + map: Record): string => (prop in map ? map[prop] : prop); + return { + display: 'flex', + flexDirection: DIRECTION_MAP[this.props.direction], + justifyContent: tryGetFromMap(this.props.align, { + start: 'flex-start', + end: 'flex-end', + center: 'center', + 'space-between': 'space-between', + 'space-around': 'space-around', + }), + alignItems: tryGetFromMap(this.props.crossAlign, { + start: 'flex-start', + end: 'flex-end', + center: 'center', + stretch: 'stretch', + }), + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box_props.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box_props.ts new file mode 100644 index 0000000000000000000000000000000000000000..eaa45e2d2a84507297220263130eadf3c23d6f39 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/box_props.ts @@ -0,0 +1,11 @@ +import { ComponentBindings, OneWay } from '@devextreme-generator/declarations'; +import { BoxAlign, BoxCrossAlign, BoxDirection } from './types'; + +@ComponentBindings() +export class BoxProps { + @OneWay() direction: BoxDirection = 'row'; + + @OneWay() align: BoxAlign = 'start'; + + @OneWay() crossAlign: BoxCrossAlign = 'stretch'; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/types.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..51931cfa8b68dd931bdd9d9b53df60919fe3aed6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/box/types.ts @@ -0,0 +1,3 @@ +export type BoxDirection = 'col' | 'row'; +export type BoxAlign = 'center' | 'end' | 'space-around' | 'space-between' | 'start'; +export type BoxCrossAlign = 'center' | 'end' | 'start' | 'stretch'; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/button.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/button.tsx new file mode 100644 index 0000000000000000000000000000000000000000..762fcb17cd7d9e23855238dd14adafc3a1c2335a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/button.tsx @@ -0,0 +1,290 @@ +import { + Component, + ComponentBindings, + Effect, + Event, + JSXComponent, + Method, + OneWay, + Ref, + Template, + Slot, + RefObject, +} from '@devextreme-generator/declarations'; +import { createDefaultOptionRules } from '../../core/options/utils'; +import devices from '../../core/devices'; +import { isMaterial, current } from '../../ui/themes'; +import { click } from '../../events/short'; +import { combineClasses } from '../utils/combine_classes'; +import { getImageSourceType } from '../../core/utils/icon'; +import { Icon } from './common/icon'; +import { InkRipple, InkRippleConfig } from './common/ink_ripple'; +import { Widget } from './common/widget'; +import { BaseWidgetProps } from './common/base_props'; +// eslint-disable-next-line import/no-cycle +import BaseComponent from '../component_wrapper/button'; +import { EffectReturn } from '../utils/effect_return'; + +const stylingModes = ['outlined', 'text', 'contained']; + +const getCssClasses = (model: ButtonProps): string => { + const { + text, icon, stylingMode, type, iconPosition, + } = model; + const isValidStylingMode = stylingMode && stylingModes.includes(stylingMode); + const classesMap = { + 'dx-button': true, + [`dx-button-mode-${isValidStylingMode ? stylingMode : 'contained'}`]: true, + [`dx-button-${type ?? 'normal'}`]: true, + 'dx-button-has-text': !!text, + 'dx-button-has-icon': !!icon, + 'dx-button-icon-right': iconPosition !== 'left', + }; + + return combineClasses(classesMap); +}; +export const viewFunction = (viewModel: Button): JSX.Element => { + const { + children, iconPosition, text, + template: ButtonTemplate, + iconTemplate: IconTemplate, + } = viewModel.props; + const renderText = !ButtonTemplate && !children && text !== ''; + const isIconLeft = iconPosition === 'left'; + const iconComponent = !ButtonTemplate && !children && (viewModel.iconSource || IconTemplate) + && ( + + ); + + return ( + +
+ {ButtonTemplate && ()} + {!ButtonTemplate && children} + {isIconLeft && iconComponent} + {renderText && ({text})} + {!isIconLeft && iconComponent} + {viewModel.props.useSubmitBehavior + && } + {viewModel.props.useInkRipple + && ( + + )} +
+
+ ); +}; + +@ComponentBindings() +export class ButtonProps extends BaseWidgetProps { + @OneWay() activeStateEnabled = true; + + @OneWay() hoverStateEnabled = true; + + @OneWay() icon = ''; + + @OneWay() iconPosition?: string = 'left'; + + @Event({ + actionConfig: { excludeValidators: ['readOnly'] }, + }) + onClick?: (e: { event: Event }) => void; + + @Event() onSubmit?: (e: { event: Event; submitInput: HTMLInputElement | null }) => void; + + @OneWay() pressed?: boolean; + + @OneWay() stylingMode: 'outlined' | 'text' | 'contained' = 'contained'; + + @Template() template?: (props: { data: { icon?: string; text?: string } }) => JSX.Element; + + @Template() iconTemplate?: (props) => JSX.Element; + + @Slot() children?: JSX.Element; + + @OneWay() text = ''; + + @OneWay() type: 'back' | 'danger' | 'default' | 'normal' | 'success' = 'normal'; + + @OneWay() useInkRipple = false; + + @OneWay() useSubmitBehavior = false; + + @OneWay() templateData?: Record = {}; +} + +export const defaultOptionRules = createDefaultOptionRules([{ + device: (): boolean => devices.real().deviceType === 'desktop' && !devices.isSimulator(), + options: { focusStateEnabled: true }, +}, { + // eslint-disable-next-line import/no-named-as-default-member + device: (): boolean => isMaterial(current()), + options: { useInkRipple: true }, +}]); +@Component({ + defaultOptionRules, + jQuery: { + component: BaseComponent, + register: true, + }, + view: viewFunction, +}) + +export class Button extends JSXComponent(ButtonProps) { + @Ref() contentRef!: RefObject; + + @Ref() inkRippleRef!: RefObject; + + @Ref() submitInputRef!: RefObject; + + @Ref() widgetRef!: RefObject; + + @Method() + focus(): void { + this.widgetRef.current!.focus(); + } + + @Method() + activate(): void { + this.widgetRef.current!.activate(); + } + + @Method() + deactivate(): void { + this.widgetRef.current!.deactivate(); + } + + @Effect() + submitEffect(): EffectReturn { + const namespace = 'UIFeedback'; + const { useSubmitBehavior, onSubmit } = this.props; + + if (useSubmitBehavior && onSubmit) { + click.on(this.submitInputRef.current, + (event) => onSubmit({ event, submitInput: this.submitInputRef.current }), + { namespace }); + + return (): void => click.off(this.submitInputRef.current, { namespace }); + } + + return undefined; + } + + onActive(event: Event): void { + const { useInkRipple } = this.props; + + useInkRipple && this.inkRippleRef.current!.showWave({ + element: this.contentRef.current!, event, + }); + } + + onInactive(event: Event): void { + const { useInkRipple } = this.props; + + useInkRipple && this.inkRippleRef.current!.hideWave({ + element: this.contentRef.current!, event, + }); + } + + onWidgetClick(event: Event): void { + const { + onClick, + useSubmitBehavior, + } = this.props; + + onClick?.({ event }); + useSubmitBehavior && this.submitInputRef.current!.click(); + } + + keyDown(e: { + originalEvent: Event & { cancel: boolean }; + keyName: string; + which: string; + }): Event | undefined { + const { onKeyDown } = this.props; + const { originalEvent, keyName, which } = e; + + const result: Event & { cancel: boolean } = onKeyDown?.(e); + if (result?.cancel) { + return result; + } + + if (keyName === 'space' || which === 'space' || keyName === 'enter' || which === 'enter') { + (originalEvent as Event).preventDefault(); + this.onWidgetClick(originalEvent as Event); + } + + return undefined; + } + + get aria(): Record { + const { text, icon } = this.props; + + let label = (text ?? '') || icon; + + if (!text && icon && getImageSourceType(icon) === 'image') { + label = !icon.includes('base64') ? icon.replace(/.+\/([^.]+)\..+$/, '$1') : 'Base64'; + } + + return { + role: 'button', + ...label ? { label } : {}, + }; + } + + get cssClasses(): string { + return getCssClasses(this.props); + } + + get iconSource(): string { + const { icon, type } = this.props; + + if (icon || type === 'back') { + return (icon ?? '') || 'back'; + } + + return ''; + } + + get inkRippleConfig(): InkRippleConfig { + const { text, icon, type } = this.props; + return (!text && icon) || (type === 'back') ? { + isCentered: true, + useHoldAnimation: false, + waveSizeCoefficient: 1, + } : {}; + } + + get buttonTemplateData(): Record { + const { icon, text, templateData } = this.props; + return { icon, text, ...templateData }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/dom_component_wrapper.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/dom_component_wrapper.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c0074b9102c85b075616bcce85eac920830c445a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/dom_component_wrapper.test.tsx @@ -0,0 +1,269 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import React, { createRef } from 'react'; +import { mount, shallow } from 'enzyme'; +import { RefObject } from '@devextreme-generator/declarations'; +import { renderTemplate } from '../../../../../node_modules/@devextreme/runtime/cjs/declarations/index'; +import { DomComponentWrapper, DomComponentWrapperProps, viewFunction as DomComponentWrapperView } from '../dom_component_wrapper'; +import { getUpdatedOptions } from '../utils/get_updated_options'; + +jest.mock('../../../../../node_modules/@devextreme/runtime/esm/declarations/index', () => ({ hasTemplate: jest.fn(() => true), renderTemplate: jest.fn() })); +jest.mock('../../../../../node_modules/@devextreme/runtime/cjs/declarations/index', () => ({ hasTemplate: jest.fn(() => true), renderTemplate: jest.fn() })); + +jest.mock('../utils/get_updated_options', () => { + const defaultImplementation = jest.requireActual('../utils/get_updated_options'); + return defaultImplementation; +}); + +describe('DomComponentWrapper', () => { + describe('View', () => { + it('default render', () => { + const widgetRef = createRef(); + const props = { + props: { + componentProps: {}, + }, + widgetRef, + restAttributes: { 'rest-attributes': 'true' }, + } as any as Partial; + const tree = mount( + as any, + ); + + expect(tree.find('div').props()).toEqual({ + 'rest-attributes': 'true', + }); + expect(tree.find('div').instance()).toBe(widgetRef.current); + }); + + it('set className', () => { + const props = { + props: { + componentProps: { + className: 'custom-class', + }, + }, + } as Partial; + + const tree = shallow( as any); + + expect((tree.props() as any).className).toEqual('custom-class'); + }); + }); + + describe('Logic', () => { + describe('properties', () => { + it('itemTemplate', () => { + const component = new DomComponentWrapper({ + templateNames: ['itemTemplate'], + componentProps: { + itemTemplate: () => 'some Template', + tabIndex: 2, + disabled: true, + }, + } as Partial as any); + + const { properties } = component; + expect(renderTemplate).not.toBeCalled(); + (properties as any).itemTemplate(); + expect(renderTemplate).toBeCalledTimes(1); + expect('itemTemplate' in properties).toStrictEqual(true); + expect(properties.tabIndex).toStrictEqual(2); + expect(properties.disabled).toStrictEqual(true); + }); + + it('haven`t template', () => { + jest.resetAllMocks(); + const component = new DomComponentWrapper({ + templateNames: ['itemTemplate'], + componentProps: { + itemTemplate: () => 'some Template', + }, + } as Partial as any); + + const { properties } = component; + expect(renderTemplate).not.toBeCalled(); + (properties as any).itemTemplate(); + expect(renderTemplate).not.toBeCalled(); + }); + + it('picks props except valueChange', () => { + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: { + valueChange: () => { }, + tabIndex: 2, + disabled: true, + }, + } as Partial as any); + + const { properties } = component; + + expect('valueChange' in properties).toStrictEqual(false); + expect(properties.tabIndex).toStrictEqual(2); + expect(properties.disabled).toStrictEqual(true); + }); + + describe('rtlEnabled', () => { + it('get from props', () => { + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: { rtlEnabled: true }, + } as Partial as any); + component.config = { rtlEnabled: false }; + expect(component.properties.rtlEnabled).toBe(true); + }); + + it('get from context', () => { + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: {}, + } as Partial as any); + component.config = { rtlEnabled: true }; + expect(component.properties.rtlEnabled).toBe(true); + }); + + it('should be undefined', () => { + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: {}, + } as Partial as any); + expect(component.properties.rtlEnabled).toBe(false); + }); + }); + + it('default onValueChange', () => { + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: {}, + } as Partial as any); + + const { onValueChanged } = component.properties; + + expect(onValueChanged).toBeUndefined(); + }); + + it('onValueChange wraps valueChange prop', () => { + const fn = jest.fn(); + const component = new DomComponentWrapper({ + templateNames: [], + componentProps: { valueChange: fn }, + } as Partial as any); + const { onValueChanged } = component.properties; + + (onValueChanged as (({ value: number }) => any))({ value: 5 }); + + expect(fn.mock.calls).toEqual([[5]]); + }); + }); + + describe('effects', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + const DomComponentMock = jest.fn(); + const createWidget = () => { + const component = new DomComponentWrapper({ + componentProps: {}, + componentType: DomComponentMock as any, + templateNames: [], + } as DomComponentWrapperProps); + return component; + }; + + it('setupWidget', () => { + const widgetRef = { current: {} } as RefObject; + const component = createWidget(); + const spy = jest.spyOn(component, 'properties', 'get'); + component.widgetRef = widgetRef; + + component.setupWidget(); + + expect(DomComponentMock).toBeCalledTimes(1); + expect(DomComponentMock).toBeCalledWith(widgetRef.current, spy.mock.results[0].value); + }); + + it('setupWidget returns dispose widget callback', () => { + const disposeDom = jest.fn(); + DomComponentMock.mockImplementation(() => ({ dispose: disposeDom })); + + const component = createWidget(); + component.widgetRef = { current: {} } as RefObject; + const dispose = component.setupWidget(); + dispose(); + + expect((disposeDom as any).mock.instances[0].dispose).toBeCalledTimes(1); + }); + + it('updateWidget. Widget is not initialized', () => { + const component = createWidget(); + const spy = jest.spyOn(component, 'properties', 'get'); + + component.updateWidget(); + + expect(DomComponentMock).toBeCalledTimes(0); + expect(spy).toBeCalledTimes(0); + }); + + it('updateWidget. Widget is initialized', () => { + const component = createWidget(); + const spy = jest.spyOn(component, 'properties', 'get'); + const instance = { option: jest.fn(), beginUpdate: jest.fn(), endUpdate: jest.fn() }; + component.instance = instance as any; + + component.updateWidget(); + + expect(instance.beginUpdate).toBeCalledTimes(1); + expect(spy.mock.results[0].value).toEqual(component.properties); + expect(instance.endUpdate).toBeCalledTimes(1); + }); + + it('updateWidget. Properties are not changed', () => { + const component = createWidget(); + const instance = { option: jest.fn(), beginUpdate: jest.fn(), endUpdate: jest.fn() }; + component.instance = instance as any; + + (getUpdatedOptions as jest.Mock) = jest.fn(() => []); + component.updateWidget(); + + expect(instance.beginUpdate).toBeCalledTimes(0); + expect(instance.option).toBeCalledTimes(0); + expect(instance.endUpdate).toBeCalledTimes(0); + }); + + it('updateWidget. Properties are changed', () => { + const component = createWidget(); + const instance = { option: jest.fn(), beginUpdate: jest.fn(), endUpdate: jest.fn() }; + component.instance = instance as any; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (getUpdatedOptions as jest.Mock) = jest.fn(() => [ + { path: 'someProp', value: 'someValue' }, + ]); + component.updateWidget(); + + expect(instance.beginUpdate).toBeCalledTimes(1); + expect(instance.option).toBeCalledWith('someProp', 'someValue'); + expect(instance.endUpdate).toBeCalledTimes(1); + }); + + it('setRootElementRef, set rootElementRef to div ref', () => { + const widgetRef = { current: {} } as RefObject; + const component = new DomComponentWrapper({ + rootElementRef: {} as RefObject, + } as DomComponentWrapperProps); + component.widgetRef = widgetRef; + component.setRootElementRef(); + + expect(component.props.rootElementRef?.current).toBe(component.widgetRef.current); + }); + + it('setRootElementRef, hasnt rootElementRef', () => { + const component = new DomComponentWrapper({ } as DomComponentWrapperProps); + component.widgetRef = { current: {} } as RefObject; + component.setRootElementRef(); + expect(component.props.rootElementRef?.current).toBeUndefined(); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/error_message.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/error_message.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a08fa2fb00273e989c5f59752702abf5bc0e13ed --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/error_message.test.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { ErrorMessage } from '../error_message'; + +describe('ErrorMessage', () => { + describe('Props', () => { + it('should render `messages` inside the component', () => { + const tree = shallow(); + + expect(tree.text()).toBe('error-message'); + }); + + it('should combine `className` with predefined classes', () => { + const tree = shallow(); + + expect(tree.hasClass('dx-validationsummary')).toBe(true); + expect(tree.hasClass('dx-validationsummary-item')).toBe(true); + expect(tree.hasClass('custom-class')).toBe(true); + }); + + it('should spread restAttributes', () => { + const tree = shallow(); + + expect(tree.prop('rest-attributes')).toBe('restAttributes'); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/icon.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/icon.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f62bd8c55f7019783768db5288e7f3c55acb5f0f --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/icon.test.tsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { Icon } from '../icon'; + +describe('Icon', () => { + describe('Props', () => { + describe('source', () => { + it('should draw nothing by default', () => { + const icon = shallow(); + + expect(icon.children()).toHaveLength(0); + }); + + it('should draw dxIcon', () => { + const icon = shallow(); + const content = icon.childAt(0); + + expect(icon.children()).toHaveLength(1); + expect(content.is('i')).toBe(true); + expect(content.hasClass('dx-icon')).toBe(true); + expect(content.hasClass('dx-icon-icon_-190')).toBe(true); + }); + + it('should draw fontIcon', () => { + const icon = shallow(); + const content = icon.childAt(0); + + expect(icon.children()).toHaveLength(1); + expect(content.is('i')).toBe(true); + expect(content.hasClass('dx-icon')).toBe(true); + expect(content.hasClass('glyphicon')).toBe(true); + expect(content.hasClass('glyphicon-icon')).toBe(true); + }); + + it('should draw image icon', () => { + const icon = shallow(); + const content = icon.childAt(0); + + expect(icon.children()).toHaveLength(1); + expect(content.is('img')).toBe(true); + expect(content.hasClass('dx-icon')).toBe(true); + expect(content.prop('src')).toEqual('localhost/JFLSKDksjdhfolHWThr30oi'); + }); + + it('should draw svg icon if svg is passed using iconTemplate', () => { + const icon = shallow( } + source="" + />); + const content = icon.childAt(0); + + expect(icon.children()).toHaveLength(1); + expect(content.is('i')).toBe(true); + expect(content.hasClass('dx-icon')).toBe(true); + expect(content.hasClass('dx-svg-icon')).toBe(true); + + expect(icon.render().find('svg')).toHaveLength(1); + }); + + it('should draw icon template if it is specified', () => { + const icon = shallow( } />); + const content = icon.childAt(0); + + expect(icon.children()).toHaveLength(1); + expect(content.is('i')).toBe(true); + expect(content.hasClass('dx-icon')).toBe(false); + expect(content.hasClass('dx-svg-icon')).toBe(false); + + expect(icon.render().find('input')).toHaveLength(1); + }); + }); + + describe('position', () => { + it('should not add any modificator by default', () => { + const icon = shallow(); + const content = icon.childAt(0); + + expect(content.hasClass('dx-icon-right')).toBe(false); + }); + + it('should draw icon after text with "right" modificator', () => { + const icon = shallow(); + const content = icon.childAt(0); + + expect(content.hasClass('dx-icon')).toBe(true); + expect(content.hasClass('dx-icon-icon_-190')).toBe(true); + expect(content.hasClass('dx-icon-right')).toBe(true); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/ink_ripple.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/ink_ripple.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7a4c5133d45b84602935b042c3db40fd7cb0c5bb --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/ink_ripple.test.tsx @@ -0,0 +1,66 @@ +import { shallow } from 'enzyme'; +import { InkRipple, viewFunction } from '../ink_ripple'; +import { initConfig, showWave, hideWave } from '../../../../ui/widget/utils.ink_ripple'; + +jest.mock('../../../../ui/widget/utils.ink_ripple', () => ({ + ...jest.requireActual('../../../../ui/widget/utils.ink_ripple'), + initConfig: jest.fn(), + showWave: jest.fn(), + hideWave: jest.fn(), +})); + +describe('InkRipple', () => { + beforeEach(() => { (initConfig as any).mockImplementation(() => 'config'); }); + + afterEach(() => jest.resetAllMocks()); + + describe('Render', () => { + it('should pass all necessary properties to the root element', () => { + const inkRipple = shallow(viewFunction({ restAttributes: { 'rest-attributes': 'restAttributes' } } as any) as any); + + expect(inkRipple.props()).toEqual({ + className: 'dx-inkripple', + 'rest-attributes': 'restAttributes', + }); + }); + }); + + describe('Behavior', () => { + describe('Methods', () => { + const event: { element?: HTMLElement; event: Event } = { event: {} as Event }; + + describe('hideWave', () => { + it('should call hide wave function', () => { + new InkRipple({}).hideWave(event); + + expect(hideWave).toHaveBeenCalledTimes(1); + expect(hideWave).toHaveBeenCalledWith('config', event); + }); + }); + + describe('showWave', () => { + it('should call show wave function', () => { + new InkRipple({}).showWave(event); + + expect(showWave).toHaveBeenCalledTimes(1); + expect(showWave).toHaveBeenCalledWith('config', event); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + describe('getConfig', () => { + it('should call initConfig function with right arguments', () => { + const config = {}; + const inkRipple = new InkRipple({ config }); + + expect(inkRipple.getConfig).toBe('config'); + expect(initConfig).toBeCalledTimes(1); + expect(initConfig).toBeCalledWith(config); + }); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/widget.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/widget.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..28732d2e59174f36172842d31328ca1ec8c60cfe --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/__tests__/widget.test.tsx @@ -0,0 +1,933 @@ +import React, { createRef } from 'react'; +// Should be before component import +import { mount } from 'enzyme'; +// import { create as mount } from 'react-test-renderer'; +import { RefObject } from '@devextreme-generator/declarations'; +import { DisposeEffectReturn } from '../../../utils/effect_return'; +import { + clear as clearEventHandlers, defaultEvent, emit, + emitKeyboard, getEventHandlers, EVENT, KEY, +} from '../../../test_utils/events_mock'; +import { Widget, viewFunction, WidgetProps } from '../widget'; +import { ConfigProvider } from '../../../common/config_provider'; +import { resolveRtlEnabled, resolveRtlEnabledDefinition } from '../../../utils/resolve_rtl'; +import resizeCallbacks from '../../../../core/utils/resize_callbacks'; +import errors from '../../../../core/errors'; +import domAdapter from '../../../../core/dom_adapter'; + +jest.mock('../../../../events/utils/index', () => ({ + ...jest.requireActual('../../../../events/utils/index'), +})); +jest.mock('../../../common/config_provider', () => ({ ConfigProvider: () => null })); +jest.mock('../../../utils/resolve_rtl'); +jest.mock('../../../../core/utils/resize_callbacks'); +jest.mock('../../../../core/errors'); + +describe('Widget', () => { + describe('Render', () => { + it('should pass all necessary properties to the div element', () => { + const props = { + hint: 'hint', + visible: true, + }; + const widget = mount(viewFunction({ + props, + tabIndex: 10, + cssClasses: 'cssClasses', + styles: { display: 'none' }, + attributes: { attributes: 'attributes' }, + } as any) as any); + expect(widget.props()).toEqual({ + attributes: 'attributes', + style: { display: 'none' }, + className: 'cssClasses', + hidden: false, + title: 'hint', + tabIndex: 10, + }); + }); + + it('should pass REF into the main div element', () => { + const mockRef = createRef(); + const props = { + hint: 'hint', + visible: true, + }; + mount(viewFunction({ + widgetElementRef: mockRef, + props, + cssClasses: 'cssClasses', + } as any) as any); + + expect(mockRef.current?.className).toBe('cssClasses'); + }); + + it('should render children', () => { + const mockRef = createRef(); + const props = { + hint: 'hint', + visible: true, + children:
, + }; + const widget = mount(viewFunction({ + widgetElementRef: mockRef, + props, + cssClasses: 'cssClasses', + } as any) as any); + + expect(widget.find('.child').exists()).toBe(true); + }); + + it('should render ConfigProvider if shouldRenderConfigProvider is true', () => { + const props = { + hint: 'hint', + visible: true, + }; + const widget = mount(viewFunction({ + props, + shouldRenderConfigProvider: true, + } as any) as any); + + expect(widget.find(ConfigProvider)).toHaveLength(1); + }); + }); + + describe('Behavior', () => { + beforeEach(clearEventHandlers); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe('Effects', () => { + describe('applyCssTextEffect', () => { + it('should apply cssText value to the main element', () => { + const widget = new Widget({ cssText: 'background-color: red;' }); + widget.widgetElementRef = { current: { style: {} } } as any; + widget.applyCssTextEffect(); + expect(widget.widgetElementRef.current!.style.cssText).toStrictEqual('background-color: red;'); + }); + + it('should ignore empty cssText value', () => { + const widget = new Widget({ cssText: '' }); + widget.widgetElementRef = { current: { style: {} } } as any; + widget.applyCssTextEffect(); + expect(widget.widgetElementRef.current!.style.cssText).toStrictEqual(undefined); + }); + }); + + describe('activeEffect', () => { + const onActive = jest.fn(); + const onInactive = jest.fn(); + + it('should subscribe to active event', () => { + const e = { ...defaultEvent }; + const widget = new Widget({ + activeStateEnabled: true, disabled: false, onActive, onInactive, + }); + widget.widgetElementRef = {} as any; + widget.activeEffect(); + + emit(EVENT.active, e); + expect(widget.active).toBe(true); + + emit(EVENT.inactive, e); + expect(widget.active).toBe(false); + + expect(onActive).toHaveBeenCalledTimes(1); + expect(onActive).toHaveBeenCalledWith(e); + expect(onInactive).toHaveBeenCalledTimes(1); + expect(onInactive).toHaveBeenCalledWith(e); + }); + + it('should woork without errors if onActive and onInactive are not defined', () => { + const e = { ...defaultEvent }; + const widget = new Widget({ + activeStateEnabled: true, disabled: false, onActive: undefined, onInactive: undefined, + }); + widget.widgetElementRef = {} as any; + widget.activeEffect(); + + emit(EVENT.active, e); + expect(widget.active).toBe(true); + + emit(EVENT.inactive, e); + expect(widget.active).toBe(false); + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ activeStateEnabled: true, disabled: false }); + widget.widgetElementRef = { current: {} } as RefObject; + + const detach = widget.activeEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.active).length).toBe(1); + expect(getEventHandlers(EVENT.inactive).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.active).length).toBe(0); + expect(getEventHandlers(EVENT.inactive).length).toBe(0); + }); + + it('should not subscribe if widget is disabled', () => { + const widget = new Widget({ + activeStateEnabled: true, disabled: true, onActive, onInactive, + }); + widget.activeEffect(); + widget.active = false; + + emit(EVENT.active); + expect(widget.active).toBe(false); + + widget.active = true; + emit(EVENT.inactive); + expect(widget.active).toBe(true); + + expect(onActive).toHaveBeenCalledTimes(0); + expect(onInactive).toHaveBeenCalledTimes(0); + }); + + it('should not subscribe if widget is not focusable', () => { + const widget = new Widget({ + activeStateEnabled: false, disabled: false, onActive, onInactive, + }); + widget.activeEffect(); + widget.active = false; + + emit(EVENT.active); + expect(widget.active).toBe(false); + + widget.active = true; + emit(EVENT.inactive); + expect(widget.active).toBe(true); + + expect(onActive).toHaveBeenCalledTimes(0); + expect(onInactive).toHaveBeenCalledTimes(0); + }); + }); + + describe('clickEffect', () => { + it('should subscribe to dxClick event', () => { + const e = { ...defaultEvent }; + const onClick = jest.fn(); + const widget = new Widget({ onClick }); + widget.widgetElementRef = { current: {} } as RefObject; + + widget.clickEffect(); + emit(EVENT.dxClick, e); + + expect(onClick).toHaveBeenCalledTimes(1); + expect(onClick).toHaveBeenCalledWith(e); + }); + + it('should return unsubscribe callback', () => { + const onClick = jest.fn(); + const widget = new Widget({ onClick }); + widget.widgetElementRef = { current: {} } as RefObject; + + const detach = widget.clickEffect() as DisposeEffectReturn; + detach(); + emit(EVENT.dxClick); + + expect(onClick).toHaveBeenCalledTimes(0); + }); + + it('should return nothing if click is not defined', () => { + const widget = new Widget({ onClick: undefined }); + + const detach = widget.clickEffect(); + + expect(detach).toBe(undefined); + }); + }); + + describe('focusEffect', () => { + const e = { ...defaultEvent, isDefaultPrevented: jest.fn() }; + + it('should subscribe to focus event', () => { + const onFocusIn = jest.fn(); + const onFocusOut = jest.fn(); + const widget = new Widget({ + focusStateEnabled: true, disabled: false, onFocusIn, onFocusOut, + }); + widget.widgetElementRef = {} as any; + + widget.focusEffect(); + + emit(EVENT.focus, e); + expect(widget.focused).toBe(true); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(1); + expect(onFocusIn).toHaveBeenCalledTimes(1); + expect(onFocusIn).toHaveBeenCalledWith(e); + + emit(EVENT.blur, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(2); + expect(onFocusOut).toHaveBeenCalledTimes(1); + expect(onFocusOut).toHaveBeenCalledWith(e); + }); + + it('should not raise any error if onFocusIn or onFocusOut is undefined', () => { + const widget = new Widget({ + focusStateEnabled: true, disabled: false, onFocusIn: undefined, onFocusOut: undefined, + }); + widget.widgetElementRef = {} as any; + + widget.focusEffect(); + + emit(EVENT.focus, e); + expect(widget.focused).toBe(true); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(1); + + emit(EVENT.blur, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(2); + }); + + it('should not raise onFocusIn/onFocusOut if event is prevented', () => { + try { + e.isDefaultPrevented = jest.fn(() => true); + const onFocusIn = jest.fn(); + const onFocusOut = jest.fn(); + const widget = new Widget({ + focusStateEnabled: true, disabled: false, onFocusIn, onFocusOut, + }); + widget.widgetElementRef = {} as any; + + widget.focusEffect(); + + emit(EVENT.focus, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(1); + expect(onFocusIn).not.toHaveBeenCalled(); + + emit(EVENT.blur, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(2); + expect(onFocusOut).not.toHaveBeenCalled(); + } finally { + e.isDefaultPrevented = jest.fn(); + } + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ focusStateEnabled: true, disabled: false }); + widget.widgetElementRef = { current: {} } as RefObject; + + const detach = widget.focusEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.focus).length).toBe(1); + expect(getEventHandlers(EVENT.blur).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.focus).length).toBe(0); + expect(getEventHandlers(EVENT.blur).length).toBe(0); + }); + + it('should subscribe if widget is disabled', () => { + const widget = new Widget({ focusStateEnabled: true, disabled: true }); + widget.widgetElementRef = {} as any; + widget.focused = false; + + widget.focusEffect(); + + emit(EVENT.focus, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(0); + }); + + it('should subscribe is widget is not focusable', () => { + const onFocusIn = jest.fn(); + + const widget = new Widget({ focusStateEnabled: false, disabled: false, onFocusIn }); + widget.widgetElementRef = {} as any; + widget.focused = false; + + widget.focusEffect(); + + emit(EVENT.focus, e); + expect(widget.focused).toBe(false); + expect(e.isDefaultPrevented).toHaveBeenCalledTimes(0); + expect(onFocusIn).toHaveBeenCalledTimes(0); + }); + }); + + describe('hoverEffect', () => { + it('should subscribe to hover event', () => { + const onHoverStart = jest.fn(); + const onHoverEnd = jest.fn(); + + const widget = new Widget({ + hoverStateEnabled: true, disabled: false, onHoverStart, onHoverEnd, + }); + widget.widgetElementRef = {} as any; + widget.active = false; + widget.hoverEffect(); + + emit(EVENT.hoverStart); + expect(widget.hovered).toBe(true); + expect(onHoverStart).toHaveBeenCalledTimes(1); + expect(onHoverStart).toHaveBeenCalledWith(defaultEvent); + expect(onHoverEnd).toHaveBeenCalledTimes(0); + + emit(EVENT.hoverEnd); + expect(widget.hovered).toBe(false); + expect(onHoverEnd).toHaveBeenCalledTimes(1); + expect(onHoverEnd).toHaveBeenCalledWith(defaultEvent); + expect(onHoverStart).toHaveBeenCalledTimes(1); + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ hoverStateEnabled: true, disabled: false }); + widget.widgetElementRef = { current: {} } as RefObject; + widget.active = false; + const detach = widget.hoverEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.hoverStart).length).toBe(1); + expect(getEventHandlers(EVENT.hoverEnd).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.hoverStart).length).toBe(0); + expect(getEventHandlers(EVENT.hoverEnd).length).toBe(0); + }); + + it('should change hover state if widget is not active', () => { + const widget = new Widget({ hoverStateEnabled: true, disabled: false }); + widget.widgetElementRef = {} as any; + widget.active = true; + widget.hoverEffect(); + + emit(EVENT.hoverStart); + expect(widget.hovered).toBe(false); + + emit(EVENT.hoverEnd); + expect(widget.hovered).toBe(false); + }); + + it('should subscribe if widget is disabled', () => { + const widget = new Widget({ hoverStateEnabled: true, disabled: true }); + widget.widgetElementRef = {} as any; + widget.active = false; + widget.hoverEffect(); + + expect(widget.hovered).toBe(false); + emit(EVENT.hoverStart); + expect(widget.hovered).toBe(false); + }); + + it('should subscribe if widget is not hovered', () => { + const widget = new Widget({ hoverStateEnabled: false, disabled: false }); + widget.widgetElementRef = {} as any; + widget.active = false; + widget.hoverEffect(); + + expect(widget.hovered).toBe(false); + emit(EVENT.hoverStart); + expect(widget.hovered).toBe(false); + }); + }); + + describe('keyboardEffect', () => { + const onKeyDown = jest.fn(); + + it('should subscribe to keyboard event', () => { + const widget = new Widget({ focusStateEnabled: true, onKeyDown }); + widget.widgetElementRef = {} as any; + widget.keyboardEffect(); + + emitKeyboard(KEY.enter); + expect(onKeyDown).toHaveBeenCalledTimes(1); + emitKeyboard(KEY.space); + expect(onKeyDown).toHaveBeenCalledTimes(2); + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ focusStateEnabled: true, onKeyDown }); + widget.widgetElementRef = {} as any; + const detach = widget.keyboardEffect() as DisposeEffectReturn; + + emitKeyboard(KEY.enter); + expect(onKeyDown).toHaveBeenCalledTimes(1); + + detach(); + + emitKeyboard(KEY.enter); + expect(onKeyDown).toHaveBeenCalledTimes(1); + }); + + it('should not subscribe if focusStateEnabled is "false"', () => { + const widget = new Widget({ focusStateEnabled: false, onKeyDown }); + widget.widgetElementRef = {} as any; + widget.keyboardEffect(); + + emitKeyboard(KEY.enter); + expect(onKeyDown).toHaveBeenCalledTimes(0); + }); + + it('should return nothing if widget does not have event and is not focusable', () => { + const widget = new Widget({ }); + const detach = widget.keyboardEffect(); + + expect(detach).toBe(undefined); + }); + }); + + describe('resizeEffect', () => { + const onDimensionChanged = jest.fn(); + + it('should subscribe to resize event', () => { + const e = { ...defaultEvent }; + const widget = new Widget({ onDimensionChanged }); + widget.widgetElementRef = {} as any; + widget.resizeEffect(); + + emit(EVENT.resize, e); + expect(onDimensionChanged).toHaveBeenCalledTimes(1); + expect(onDimensionChanged).toHaveBeenCalledWith(e); + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ onDimensionChanged }); + widget.widgetElementRef = { current: {} } as RefObject; + const detach = widget.resizeEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.resize).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.resize).length).toBe(0); + }); + + it('should not subscribe if callback does not exist', () => { + const widget = new Widget({ }); + widget.resizeEffect(); + + emit(EVENT.resize); + expect(getEventHandlers(EVENT.resize)).toBe(undefined); + }); + }); + + describe('windowResizeEffect', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should subscribe on window.onresize event', () => { + const onDimensionChanged = jest.fn(); + const widget = new Widget({ onDimensionChanged }); + + const dispose = widget.windowResizeEffect() as DisposeEffectReturn; + + expect(resizeCallbacks.add).toBeCalledTimes(1); + expect(resizeCallbacks.add).toHaveBeenCalledWith(onDimensionChanged); + expect(resizeCallbacks.remove).toBeCalledTimes(0); + + dispose?.(); + }); + + it('should return window.onresize unsubscribe callback', () => { + const onDimensionChanged = jest.fn(); + const widget = new Widget({ onDimensionChanged }); + + const dispose = widget.windowResizeEffect() as DisposeEffectReturn; + + dispose?.(); + + expect(resizeCallbacks.remove).toBeCalledTimes(1); + expect(resizeCallbacks.remove).toHaveBeenCalledWith(onDimensionChanged); + }); + + it('should not subscribe on window.onresize event if onDimensionChanged callback does not defined', () => { + const widget = new Widget({ }); + const dispose = widget.windowResizeEffect(); + + expect(resizeCallbacks.add).toBeCalledTimes(0); + expect(resizeCallbacks.remove).toBeCalledTimes(0); + expect(dispose).toBe(undefined); + }); + }); + + describe('visibilityEffect', () => { + const onVisibilityChange = jest.fn(); + + it('should subscribe to visible events', () => { + const widget = new Widget({ onVisibilityChange }); + widget.widgetElementRef = {} as any; + widget.visibilityEffect(); + + emit(EVENT.shown); + expect(onVisibilityChange).toHaveBeenCalledTimes(1); + expect(onVisibilityChange).toHaveBeenCalledWith(true); + + emit(EVENT.hiding); + expect(onVisibilityChange).toHaveBeenCalledTimes(2); + expect(onVisibilityChange).toHaveBeenCalledWith(false); + }); + + it('should return unsubscribe callback', () => { + const widget = new Widget({ onVisibilityChange }); + widget.widgetElementRef = {} as any; + const detach = widget.visibilityEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.shown).length).toBe(1); + expect(getEventHandlers(EVENT.hiding).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.shown).length).toBe(0); + expect(getEventHandlers(EVENT.hiding).length).toBe(0); + }); + + it('should not subscribe if callback does not exist', () => { + const widget = new Widget({ }); + widget.visibilityEffect(); + + expect(getEventHandlers(EVENT.shown)).toBe(undefined); + expect(getEventHandlers(EVENT.hiding)).toBe(undefined); + }); + }); + + describe('setRootElementRef', () => { + it('set rootElementRef to div ref', () => { + const widgetElementRef = { current: {} } as RefObject; + const component = new Widget({ + rootElementRef: {}, + } as WidgetProps); + component.widgetElementRef = widgetElementRef; + component.setRootElementRef(); + + expect(component.props.rootElementRef?.current).toBe(component.widgetElementRef.current); + }); + + it('hasnt rootElementRef', () => { + const component = new Widget({ }); + component.widgetElementRef = { current: {} } as RefObject; + component.setRootElementRef(); + expect(component.props.rootElementRef?.current).toBeUndefined(); + }); + + it('calls onRootElementRendered handler', () => { + const onRootElementRendered = jest.fn(); + const component = new Widget({ onRootElementRendered }); + component.widgetElementRef = { current: {} } as RefObject; + + component.setRootElementRef(); + + expect(onRootElementRendered).toBeCalledTimes(1); + expect(onRootElementRendered).toBeCalledWith(component.widgetElementRef.current); + }); + + it('does not raise any error if onRootElementRendered is not passed', () => { + const component = new Widget({}); + + expect(() => { component.setRootElementRef(); }).not.toThrow(); + }); + }); + + describe('checkDeprecation', () => { + it('check deprecation error', () => { + const component = new Widget({ + width: () => {}, + height: () => {}, + } as WidgetProps); + component.checkDeprecation(); + expect(errors.log).toBeCalledTimes(2); + expect(errors.log).toHaveBeenNthCalledWith(1, 'W0017', 'width'); + expect(errors.log).toHaveBeenNthCalledWith(2, 'W0017', 'height'); + }); + + it('no deprecation error', () => { + const component = new Widget({ + width: '100px', + height: '100px', + } as WidgetProps); + component.checkDeprecation(); + expect(errors.log).toBeCalledTimes(0); + }); + }); + }); + + describe('Methods', () => { + describe('activate', () => { + it('should switch active state to "true"', () => { + const widget = new Widget({ activeStateEnabled: true }); + expect(widget.active).toBe(false); + widget.activate(); + expect(widget.active).toBe(true); + }); + }); + + describe('deactivate', () => { + it('should switch active state to "false"', () => { + const widget = new Widget({ activeStateEnabled: true }); + widget.activate(); + expect(widget.active).toBe(true); + widget.deactivate(); + expect(widget.active).toBe(false); + }); + }); + + describe('focus', () => { + it('should trigger focus at element', () => { + const widget = new Widget({ focusStateEnabled: true }); + const mockRef = jest.fn(); + widget.widgetElementRef = mockRef as any; + + widget.focusEffect(); + + expect(widget.focused).toBe(false); + widget.focus(); + expect(widget.focused).toBe(true); + }); + }); + + describe('blur', () => { + it('should trigger blur at root element if it is active element', () => { + const widget = new Widget({ focusStateEnabled: true }); + const mockRef = { current: { blur: jest.fn() } }; + widget.widgetElementRef = mockRef as any; + + const { getActiveElement } = domAdapter; + try { + domAdapter.getActiveElement = () => mockRef.current as unknown as HTMLDivElement; + widget.focusEffect(); + widget.focus(); + widget.blur(); + + expect(widget.widgetElementRef.current?.blur).toHaveBeenCalledTimes(1); + } finally { + domAdapter.getActiveElement = getActiveElement; + } + }); + + it('should not trigger blur at root element if it is not active element', () => { + const widget = new Widget({ focusStateEnabled: true }); + const mockRef = { current: { blur: jest.fn() } }; + widget.widgetElementRef = mockRef as any; + + widget.focusEffect(); + widget.focus(); + widget.blur(); + + expect(widget.widgetElementRef.current?.blur).not.toBeCalled(); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('attributes', () => { + it('should return ARIA labels', () => { + const widget = new Widget({ visible: false, aria: { id: '10', role: 'button', level: '100' } }); + + expect(widget.attributes).toEqual({ + 'aria-hidden': 'true', id: '10', role: 'button', 'aria-level': '100', 'rest-attributes': 'restAttributes', + }); + }); + + it('should not return accessKey if widget is not focusable', () => { + const widget1 = new Widget({ accessKey: 'c', visible: true }); + expect(widget1.attributes).toEqual({ 'rest-attributes': 'restAttributes' }); + }); + + it('should return accessKey if widget is focusable', () => { + const widget2 = new Widget({ accessKey: 'c', focusStateEnabled: true, visible: true }); + expect(widget2.attributes).toEqual({ accessKey: 'c', 'rest-attributes': 'restAttributes' }); + }); + + it('should not return accessKay if widget is disabled', () => { + const widget3 = new Widget({ + accessKey: 'c', focusStateEnabled: true, disabled: true, visible: true, + }); + expect(widget3.attributes).toEqual({ 'aria-disabled': 'true', 'rest-attributes': 'restAttributes' }); + }); + }); + + describe('styles', () => { + it('should spread style', () => { + const widget = new Widget({ }); + widget.restAttributes = { style: { color: 'red' } }; + + expect(widget.styles).toEqual({ color: 'red' }); + }); + + it('should add width and height as functions', () => { + const widget = new Widget({ width: () => 50, height: () => 'auto' }); + + expect(widget.styles).toEqual({ width: '50px', height: 'auto' }); + }); + + it('should add width and height as string values', () => { + const widget = new Widget({ width: '50px', height: () => '100%' }); + + expect(widget.styles).toEqual({ width: '50px', height: '100%' }); + }); + + it('should add width and height as number values', () => { + const widget = new Widget({ width: 50, height: 70 }); + + expect(widget.styles).toEqual({ width: '50px', height: '70px' }); + }); + + it('should ignore width and height undefined values', () => { + const widget = new Widget({ width: undefined, height: undefined }); + + expect(widget.styles).toEqual({}); + }); + + it('should convert string without unit into number', () => { + const widget = new Widget({ width: '50', height: '100' }); + + expect(widget.styles).toEqual({ width: '50px', height: '100px' }); + }); + }); + + describe('cssClasses', () => { + it('should not add any classes', () => { + const widget = new Widget({ visible: true }); + + expect(widget.cssClasses).toEqual(''); + }); + + it('should add widget class', () => { + const widget = new Widget({ addWidgetClass: true, visible: true }); + + expect(widget.cssClasses).toEqual('dx-widget'); + }); + + it('should add invisible class', () => { + const widget = new Widget({ visible: false }); + + expect(widget.cssClasses).toEqual('dx-state-invisible'); + }); + + it('should add className property', () => { + const widget = new Widget({ className: 'custom-class', visible: true }); + + expect(widget.cssClasses).toEqual('custom-class'); + }); + + it('should add class from classes property', () => { + const widget = new Widget({ classes: 'custom-classes', visible: true }); + + expect(widget.cssClasses).toEqual('custom-classes'); + }); + + it('should add disabled class', () => { + const widget = new Widget({ disabled: true, visible: true }); + + expect(widget.cssClasses).toEqual('dx-state-disabled'); + }); + + it('should add focused class', () => { + const widget = new Widget({ visible: true, focusStateEnabled: true, disabled: false }); + + expect(widget.cssClasses).toEqual(''); + + widget.focused = true; + expect(widget.cssClasses).toEqual('dx-state-focused'); + }); + + it('should add active class', () => { + const widget = new Widget({ visible: true, activeStateEnabled: true }); + widget.active = true; + + expect(widget.cssClasses).toEqual('dx-state-active'); + }); + + it('should not add active class if widget is disabled', () => { + const widget = new Widget({ visible: true, activeStateEnabled: true, disabled: true }); + widget.active = true; + + expect(widget.cssClasses).toEqual('dx-state-disabled'); + }); + + it('should add hovered class', () => { + const widget = new Widget({ visible: true, disabled: false, hoverStateEnabled: true }); + + widget.active = false; + widget.hovered = true; + expect(widget.cssClasses).toEqual('dx-state-hover'); + }); + + it('should add RTL class', () => { + (resolveRtlEnabled as jest.Mock).mockReturnValue(true); + const widget = new Widget({ visible: true }); + + expect(widget.cssClasses).toEqual('dx-rtl'); + (resolveRtlEnabled as jest.Mock).mockReturnValue(false); + }); + + it('should add visibility handler class', () => { + const widget = new Widget({ visible: true, onVisibilityChange: () => undefined }); + + expect(widget.cssClasses).toEqual('dx-visibility-change-handler'); + }); + }); + + describe('tabIndex', () => { + it('should return `undefined` if disabled', () => { + const widget = new Widget({ disabled: true, focusStateEnabled: true }); + + expect(widget.tabIndex).toBe(undefined); + }); + + it('should return `undefined` if widget is not focusable', () => { + const widget = new Widget({ disabled: false, focusStateEnabled: false }); + + expect(widget.tabIndex).toBe(undefined); + }); + + it('should return value if widget is focusable and not disabled', () => { + const widget = new Widget({ disabled: false, focusStateEnabled: true, tabIndex: 10 }); + + expect(widget.tabIndex).toBe(10); + }); + }); + + describe('shouldRenderConfigProvider', () => { + it('should call utils method resolveRtlEnabledDefinition', () => { + (resolveRtlEnabledDefinition as jest.Mock).mockReturnValue(true); + const widget = new Widget({ }); + const { shouldRenderConfigProvider } = widget; + + expect(shouldRenderConfigProvider).toBe(true); + expect(resolveRtlEnabledDefinition).toHaveBeenCalledTimes(1); + }); + }); + + describe('rtlEnabled', () => { + it('should call utils method resolveRtlEnabled', () => { + (resolveRtlEnabled as jest.Mock).mockReturnValue(false); + const widget = new Widget({ }); + const { rtlEnabled } = widget; + + expect(rtlEnabled).toBe(false); + expect(resolveRtlEnabled).toHaveBeenCalledTimes(1); + }); + }); + }); + }); + + describe('Default options', () => { + it('should define necessary properties', () => { + const defaultProps = new WidgetProps(); + + expect(defaultProps).toEqual({ + addWidgetClass: true, + activeStateEnabled: false, + disabled: false, + focusStateEnabled: false, + hoverStateEnabled: false, + tabIndex: 0, + visible: true, + _feedbackHideTimeout: 400, + _feedbackShowTimeout: 30, + cssText: '', + aria: {}, + classes: '', + className: '', + name: '', + rtlEnabled: false, + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/base_props.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/base_props.ts new file mode 100644 index 0000000000000000000000000000000000000000..94f217a3d75a4b3bcba29a14514c88e3a43a975c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/base_props.ts @@ -0,0 +1,36 @@ +import { + Event, OneWay, ComponentBindings, +} from '@devextreme-generator/declarations'; + +@ComponentBindings() +export class BaseWidgetProps { + @OneWay() className?: string = ''; + + @OneWay() accessKey?: string; + + @OneWay() activeStateEnabled?: boolean = false; + + @OneWay() disabled?: boolean = false; + + @OneWay() focusStateEnabled?: boolean = false; + + @OneWay() height?: string | number | (() => (string | number)); + + @OneWay() hint?: string; + + @OneWay() hoverStateEnabled?: boolean = false; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @Event() onClick?: (e: any) => void; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @Event() onKeyDown?: (e: any) => any; + + @OneWay() rtlEnabled?: boolean = false; + + @OneWay() tabIndex?: number = 0; + + @OneWay() visible?: boolean = true; + + @OneWay() width?: string | number | (() => (string | number)); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.js new file mode 100644 index 0000000000000000000000000000000000000000..4d37e21a20151df2becaf06bf8374413dda9e41c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.js @@ -0,0 +1 @@ +// This empty file is necessary for correct building Vue application with native DataGrid diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ee2b4e1098a8f2c9d1ab036442c2d0341bb6891 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/component.ts @@ -0,0 +1,6 @@ +export interface ComponentExt { + _options: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + silent: (path: any, value: any) => void; + }; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/core.d.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/core.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..eb10ff1a1a8eac798864522780ad772b9303936b --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/core.d.ts @@ -0,0 +1,27 @@ +/* eslint-disable @typescript-eslint/method-signature-style */ + +import '../../../core/component'; + +declare module '../../../core/component' { + interface Component { // eslint-disable-line @typescript-eslint/no-unused-vars + _optionsByReference: Record; + _deprecatedOptions: Record; + _options: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + silent(path: any, value: any): void; + }; + _createActionByOption(optionName: string, config: Record): ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (...args: any[]) => any + ); + _dispose(): void; + _getDefaultOptions(): Record; + _initOptions(options: Record): void; + _init(): void; + _initializeComponent(): void; + _optionChanging(name: string, value: unknown, prevValue: unknown): void; + _optionChanged(args: { name: string; value: unknown }): void; + _setOptionsByReference(): void; + _setDeprecatedOptions(): void; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/dom_component_wrapper.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/dom_component_wrapper.tsx new file mode 100644 index 0000000000000000000000000000000000000000..623fc9e6e84869ca951d7540ab933cb1ed4529ab --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/dom_component_wrapper.tsx @@ -0,0 +1,133 @@ +import { + Component, + ComponentBindings, + ForwardRef, + OneWay, + JSXComponent, + Ref, + Method, + Effect, + Consumer, + RefObject, + Mutable, +} from '@devextreme-generator/declarations'; +import { renderTemplate, hasTemplate } from '@devextreme/runtime/declarations'; +import type DomComponent from '../../../core/dom_component'; +import { ComponentClass } from '../../../core/dom_component'; // eslint-disable-line import/named +import { ConfigContextValue, ConfigContext } from '../../common/config_context'; +import { EventCallback } from './event_callback'; +import { DisposeEffectReturn } from '../../utils/effect_return'; +import { getUpdatedOptions } from './utils/get_updated_options'; + +export const viewFunction = ({ + widgetRef, + props: { componentProps: { className } }, + restAttributes, +}: DomComponentWrapper): JSX.Element => ( +
+); + +@ComponentBindings() +export class DomComponentWrapperProps { + @ForwardRef() rootElementRef?: RefObject; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @OneWay() componentType!: ComponentClass>; + + @OneWay() templateNames!: string[]; + + @OneWay() componentProps!: { + className?: string; + itemTemplate?: string | (() => string | HTMLElement); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + valueChange?: EventCallback; + }; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class DomComponentWrapper extends JSXComponent() { + @Ref() + widgetRef!: RefObject; + + @Mutable() + instance!: DomComponent | null; + + @Mutable() prevProps!: Record; + + @Consumer(ConfigContext) + config?: ConfigContextValue; + + @Method() + getInstance(): DomComponent | null { + return this.instance; + } + + @Effect({ run: 'once' }) + setupWidget(): DisposeEffectReturn { + // eslint-disable-next-line new-cap + const componentInstance = new this.props.componentType( + this.widgetRef.current!, this.properties, + ); + this.instance = componentInstance; + + return (): void => { + componentInstance.dispose(); + this.instance = null; + }; + } + + @Effect({ run: 'once' }) setRootElementRef(): void { + const { rootElementRef } = this.props; + if (rootElementRef) { + rootElementRef.current = this.widgetRef.current; + } + } + + @Effect() + updateWidget(): void { + const instance = this.getInstance(); + if (!instance) { + return; + } + + const updatedOptions = getUpdatedOptions(this.prevProps || {}, this.properties); + if (updatedOptions.length) { + instance.beginUpdate(); + updatedOptions.forEach(({ path, value }) => { instance.option(path, value); }); + instance.endUpdate(); + } + this.prevProps = this.properties; + } + + get properties(): Record { + const { + valueChange, + ...restProps + } = this.props.componentProps; + + const properties = ({ + rtlEnabled: !!this.config?.rtlEnabled, // widget expects boolean + ...restProps, + }) as Record; + if (valueChange) { + properties.onValueChanged = ({ value }): void => valueChange(value); + } + const templates = this.props.templateNames; + templates.forEach((name) => { + if (hasTemplate(name, properties, this)) { + properties[name] = (item, index, container): void => { + renderTemplate(this.props.componentProps[name], { item, index, container }, this); + }; + } + }); + return properties; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/error_message.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/error_message.tsx new file mode 100644 index 0000000000000000000000000000000000000000..87aae62b28d22529a5d9af1ca32fde7d92e98455 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/error_message.tsx @@ -0,0 +1,28 @@ +import { + ComponentBindings, OneWay, JSXComponent, Component, +} from '@devextreme-generator/declarations'; + +export const viewFunction = ( + { props: { message, className }, restAttributes }: ErrorMessage, +): JSX.Element => ( +
+ {message} +
+); + +@ComponentBindings() +export class ErrorMessageProps { + @OneWay() className?: string = ''; + + @OneWay() message?: string = ''; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class ErrorMessage extends JSXComponent(ErrorMessageProps) {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/event_callback.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/event_callback.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ce2604357002db946abc35e12f1f88bb28fe799 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/event_callback.ts @@ -0,0 +1,7 @@ +// eslint-disable-next-line @typescript-eslint/no-type-alias +export type EventCallback = T extends undefined ? () => void : (value: T) => void; + +export class WorkaroundForVue { + // TODO: empty class as a WA for https://github.com/DevExpress/devextreme-renovation/issues/725 + public dummy = ''; +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/icon.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/icon.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4a582f4d8128a31a09b6281171a26c3c6a609eae --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/icon.tsx @@ -0,0 +1,63 @@ +import { + Component, ComponentBindings, JSXComponent, OneWay, Fragment, Template, +} from '@devextreme-generator/declarations'; +import { getImageSourceType } from '../../../core/utils/icon'; +import { combineClasses } from '../../utils/combine_classes'; + +export const viewFunction = ({ + sourceType, + iconClassName, + props: { source, iconTemplate: IconTemplate }, +}: Icon): JSX.Element => ( + + {sourceType === 'dxIcon' && ()} + {sourceType === 'fontIcon' && ()} + {sourceType === 'image' && ()} + {IconTemplate && ()} + +); + +@ComponentBindings() +export class IconProps { + @OneWay() position?: string = 'left'; + + @OneWay() source?: string = ''; + + @Template() iconTemplate?: (props) => JSX.Element; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class Icon extends JSXComponent(IconProps) { + get sourceType(): string | false { + return getImageSourceType(this.props.source); + } + + get cssClass(): string { + return this.props.position !== 'left' ? 'dx-icon-right' : ''; + } + + get iconClassName(): string { + const generalClasses = { + 'dx-icon': true, + [this.cssClass]: !!this.cssClass, + }; + const { source } = this.props; + + if (this.sourceType === 'dxIcon') { + return combineClasses({ ...generalClasses, [`dx-icon-${source}`]: true }); + } + if (this.sourceType === 'fontIcon') { + return combineClasses({ ...generalClasses, [String(source)]: !!source }); + } + if (this.sourceType === 'image') { + return combineClasses(generalClasses); + } + if (this.sourceType === 'svg') { + return combineClasses({ ...generalClasses, 'dx-svg-icon': true }); + } + return ''; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/ink_ripple.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/ink_ripple.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e1a297e84bd43917a78af94c7dcc1c3f921542cf --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/ink_ripple.tsx @@ -0,0 +1,50 @@ +import { + Component, ComponentBindings, JSXComponent, OneWay, Method, +} from '@devextreme-generator/declarations'; +import { initConfig, showWave, hideWave } from '../../../ui/widget/utils.ink_ripple'; + +// TODO: remake old ink ripple in new JSX component +export const viewFunction = (model: InkRipple): JSX.Element => ( +
+); + +export interface InkRippleConfig { + isCentered?: boolean; + useHoldAnimation?: boolean; + waveSizeCoefficient?: number; + wavesNumber?: number; + durations?: { + showingScale: number; + hidingScale: number; + hidingOpacity: number; + }; +} + +@ComponentBindings() +export class InkRippleProps { + @OneWay() config?: InkRippleConfig = {}; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class InkRipple extends JSXComponent(InkRippleProps) { + @Method() + hideWave(opts: { element?: HTMLElement; event: Event }): void { + hideWave(this.getConfig, opts); + } + + @Method() + showWave(opts: { element?: HTMLElement; event: Event; wave?: number }): void { + showWave(this.getConfig, opts); + } + + get getConfig(): InkRippleConfig { + const { config } = this.props; + return initConfig(config); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/__tests__/get_updated_options.test.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/__tests__/get_updated_options.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..c4437e4d0d7934a733a1231df1e15f0aaf90afc6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/__tests__/get_updated_options.test.ts @@ -0,0 +1,177 @@ +import { getUpdatedOptions } from '../get_updated_options'; + +describe('get_updated_options', () => { + class DummyDataSource { dummy = true; } + + it('simple props changed', () => { + expect(getUpdatedOptions({ visible: true }, { visible: false })) + .toEqual([ + { path: 'visible', value: false, previousValue: true }, + ]); + }); + + it('no props changed', () => { + expect(getUpdatedOptions({ visible: true }, { visible: true })) + .toEqual([]); + }); + + it('new props', () => { + expect(getUpdatedOptions({ visible: true }, { visible: true, enabled: false } as any)) + .toEqual([ + { path: 'enabled', value: false, previousValue: undefined }, + ]); + }); + + it('old and new is undefined', () => { + expect(getUpdatedOptions({ columns: undefined }, { columns: undefined })) + .toEqual([]); + }); + + it('eventcallback props changed', () => { + const callback1 = () => { }; + const callback2 = () => { }; + expect(getUpdatedOptions( + { visible: true, onCellClick: callback1 }, + { visible: true, onCellClick: callback2 }, + )) + .toEqual([ + { path: 'onCellClick', value: callback2, previousValue: callback1 }, + ]); + }); + + it('nested props changed', () => { + expect(getUpdatedOptions( + { editing: { allowAdding: true } }, + { editing: { allowAdding: false } }, + )) + .toEqual([ + { path: 'editing.allowAdding', value: false, previousValue: true }, + ]); + }); + + it('nested props changed to empty', () => { + expect(getUpdatedOptions({ visible: true, editing: { allowAdding: true } }, { visible: true })) + .toEqual([ + { path: 'editing', value: undefined, previousValue: { allowAdding: true } }, + ]); + }); + + it('type of value in props changed', () => { + expect(getUpdatedOptions( + { visible: true, filterValue: [] }, + { visible: true, filterValue: '1' }, + )) + .toEqual([ + { path: 'filterValue', value: '1', previousValue: [] }, + ]); + }); + + it('array item props changed', () => { + const oldColumns = [{ id: 'field1', visible: true }, { id: 'field2', visible: true }]; + const columns = [oldColumns[0], { ...oldColumns[1], visible: false }]; + expect(getUpdatedOptions( + { columns: oldColumns }, + { columns }, + )) + .toEqual([ + { path: 'columns[1].visible', value: false, previousValue: true }, + ]); + }); + + it('array items count changed', () => { + const oldColumns = [{ id: 'field1', visible: true }, { id: 'field2', visible: true }]; + const columns = [...oldColumns, { id: 'field3', visible: true }]; + expect(getUpdatedOptions( + { columns: oldColumns }, + { columns }, + )) + .toEqual([ + { path: 'columns', value: columns, previousValue: oldColumns }, + ]); + }); + + it('ignore react props', () => { + expect(getUpdatedOptions( + { key: 'grid1', ref: {}, children: [] } as any, + { key: 'grid2', ref: {}, children: [] } as any, + )) + .toEqual([]); + }); + + it('not to deep equal for equal object', () => { + const obj = { ref: null }; + const refObj = { ref: obj }; + obj.ref = refObj as any; + const dataSource = [obj]; + expect(getUpdatedOptions( + { dataSource }, + { dataSource }, + )) + .toEqual([]); + }); + + it('use equal for compare array "dataSource"', () => { + const oldObj = { dataSource: [] }; + const obj = { dataSource: [] }; + expect(getUpdatedOptions(oldObj, obj)) + .toEqual([{ path: 'dataSource', value: [], previousValue: [] }]); + }); + + it('prevProps is undefined', () => { + const oldObj = { focusedRowKey: null }; + const obj = { focusedRowKey: 0 }; + expect(getUpdatedOptions(oldObj, obj)) + .toEqual([{ path: 'focusedRowKey', value: 0, previousValue: null }]); + }); + + it('deep diff if plain object', () => { + const oldObj = { items: [{ location: 'before' }] }; + const obj = { items: [{ location: 'after' }] }; + const diff = getUpdatedOptions(oldObj, obj); + expect(diff).toEqual([{ + path: 'items[0].location', + value: 'after', + previousValue: 'before', + }]); + }); + + it('deep diff only for plain object', () => { + const oldObj = { dataSource: new DummyDataSource() }; + const obj = { dataSource: new DummyDataSource() }; + expect(getUpdatedOptions(oldObj, obj)) + .toEqual([{ path: 'dataSource', value: obj.dataSource, previousValue: oldObj.dataSource }]); + }); + + it('using notDeepDiffArrays param', () => { + const oldObj = { toolbar: { items: [{ value: 1 }] } }; + const obj = { toolbar: { items: [{ value: 2 }] } }; + expect(getUpdatedOptions(oldObj, obj, ['toolbar.items'])) + .toEqual([{ path: 'toolbar.items', value: [{ value: 2 }], previousValue: [{ value: 1 }] }]); + }); + + it('using defaultNotDeepDiffArrays', () => { + const oldObj = { toolbar: { dataSource: [{ value: 1 }] } }; + const obj = { toolbar: { dataSource: [{ value: 2 }] } }; + expect(getUpdatedOptions(oldObj, obj)) + .toEqual([{ path: 'toolbar.dataSource', value: [{ value: 2 }], previousValue: [{ value: 1 }] }]); + }); + + it('integration options are ignored', () => { + expect(getUpdatedOptions( + { visible: true, integrationOptions: true }, + { visible: false, integrationOptions: undefined }, + )).toEqual([ + { path: 'visible', value: false, previousValue: true }, + ]); + }); + + it('integration options in child props are ignored', () => { + expect(getUpdatedOptions( + { visible: true, items: { integrationOptions: true, disabled: true } }, + { visible: false, items: { integrationOptions: undefined, disabled: false } }, + )).toEqual([ + { path: 'visible', value: false, previousValue: true }, + { path: 'items.disabled', value: false, previousValue: true }, + ]); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/get_updated_options.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/get_updated_options.ts new file mode 100644 index 0000000000000000000000000000000000000000..17d45a7e83b0ac3a4e824c10f89029cf1d4a1f84 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/utils/get_updated_options.ts @@ -0,0 +1,106 @@ +import { isPlainObject, type } from '../../../../core/utils/type'; + +const defaultNotDeepCopyArrays: string[] = [ + 'dataSource', + 'selectedRowKeys', +]; + +interface ResultItem { + path: string; + value: unknown; + previousValue: unknown; +} + +const propsToIgnore = { + integrationOptions: true, +}; + +function getDiffItem(key, value, previousValue): ResultItem { + return { path: key, value, previousValue }; +} + +function compare(resultPaths: ResultItem[], + item1, + item2, + key: string, + fullPropName: string, + notDeepCopyArrays: string[]): void { + if (propsToIgnore[key]) { + return; + } + + const type1 = type(item1); + const type2 = type(item2); + if (item1 === item2) return; + if (type1 !== type2) { + resultPaths.push(getDiffItem(key, item2, item1)); + } else if (type1 === 'object') { + if (!isPlainObject(item2)) { + resultPaths.push(getDiffItem(key, item2, item1)); + } else { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const diffPaths = objectDiffs(item1, item2, fullPropName, notDeepCopyArrays); + resultPaths.push(...diffPaths.map((item) => ({ ...item, path: `${key}.${item.path}` }))); + } + } else if (type1 === 'array') { + const notDeepCopy = notDeepCopyArrays.some((prop) => fullPropName.includes(prop)); + if (notDeepCopy && item1 !== item2) { + resultPaths.push(getDiffItem(key, item2, item1)); + } else if ((item1 as []).length !== (item2 as []).length) { + resultPaths.push(getDiffItem(key, item2, item1)); + } else { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const diffPaths = objectDiffs(item1, item2, fullPropName, notDeepCopyArrays); + ([] as ResultItem[]).push.apply(resultPaths, + diffPaths.map((item) => ({ ...item, path: `${key}${item.path}` }))); + } + } else { + resultPaths.push(getDiffItem(key, item2, item1)); + } +} + +const objectDiffsFiltered = (propsEnumerator: (string) => string[]) => ( + oldProps: Record, + props: Record, + fullPropName: string, + notDeepCopyArrays: string[], +): +ResultItem[] => { + const resultPaths: ResultItem[] = []; + const processItem = !Array.isArray(oldProps) + ? (propName: string): void => { + compare(resultPaths, oldProps[propName], props[propName], propName, `${fullPropName}.${propName}`, notDeepCopyArrays); + } : (propName: string): void => { + compare(resultPaths, oldProps[propName], props[propName], `[${propName}]`, `${fullPropName}.${propName}`, notDeepCopyArrays); + }; + + propsEnumerator(oldProps).forEach(processItem); + Object.keys(props) + .filter((propName) => !Object.prototype.hasOwnProperty.call(oldProps, propName) + && oldProps[propName] !== props[propName]) + .forEach((propName) => { + resultPaths.push({ + path: propName, + value: props[propName], + previousValue: oldProps[propName], + }); + }); + return resultPaths; +}; + +const objectDiffs = objectDiffsFiltered((oldProps) => Object.keys(oldProps)); +const reactProps = { + key: true, ref: true, children: true, style: true, +}; +const objectDiffsWithoutReactProps = objectDiffsFiltered((prop) => Object.keys(prop) + .filter((p) => !reactProps[p])); + +export function getUpdatedOptions( + // eslint-disable-next-line @typescript-eslint/ban-types + oldProps: {}, + // eslint-disable-next-line @typescript-eslint/ban-types + props: {}, + notDeepCopyArrays: string[] = defaultNotDeepCopyArrays, +): ResultItem[] { + return objectDiffsWithoutReactProps(oldProps, props, '', notDeepCopyArrays); +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/widget.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/widget.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f6630dba5773b6c9f5cac23d99ca50a86b188f7a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/common/widget.tsx @@ -0,0 +1,427 @@ +import { + Component, + ComponentBindings, + Effect, + Event, + InternalState, + JSXComponent, + Method, + OneWay, + Ref, + Slot, + Consumer, + ForwardRef, + RefObject, +} from '@devextreme-generator/declarations'; +import '../../../events/click'; +import '../../../events/hover'; + +import { isFunction } from '../../../core/utils/type'; +import { + active, dxClick, focus, hover, keyboard, resize, visibility, +} from '../../../events/short'; +import { combineClasses } from '../../utils/combine_classes'; +import { extend } from '../../../core/utils/extend'; +import { focusable } from '../../../ui/widget/selectors'; +import { normalizeStyleProp } from '../../../core/utils/style'; +import { BaseWidgetProps } from './base_props'; +import { EffectReturn } from '../../utils/effect_return'; +import { ConfigContextValue, ConfigContext } from '../../common/config_context'; +import { ConfigProvider } from '../../common/config_provider'; +import { resolveRtlEnabled, resolveRtlEnabledDefinition } from '../../utils/resolve_rtl'; +import resizeCallbacks from '../../../core/utils/resize_callbacks'; +import errors from '../../../core/errors'; +import domAdapter from '../../../core/dom_adapter'; + +const DEFAULT_FEEDBACK_HIDE_TIMEOUT = 400; +const DEFAULT_FEEDBACK_SHOW_TIMEOUT = 30; + +const getAria = (args: Record): Record => Object + .keys(args) + .reduce((r, key) => { + if (args[key]) { + return { + ...r, + [key === 'role' || key === 'id' ? key : `aria-${key}`]: String(args[key]), + }; + } + return r; + }, {}); + +export const viewFunction = (viewModel: Widget): JSX.Element => { + const widget = ( + + ); + return ( + viewModel.shouldRenderConfigProvider + ? ( + + {widget} + + ) + : widget + ); +}; + +@ComponentBindings() +export class WidgetProps extends BaseWidgetProps { + @ForwardRef() rootElementRef?: RefObject; + + @OneWay() _feedbackHideTimeout?: number = DEFAULT_FEEDBACK_HIDE_TIMEOUT; + + @OneWay() _feedbackShowTimeout?: number = DEFAULT_FEEDBACK_SHOW_TIMEOUT; + + @OneWay() activeStateUnit?: string; + + @OneWay() cssText = ''; + + @OneWay() aria?: Record = {}; + + @Slot() children?: JSX.Element | (JSX.Element | undefined | false | null)[]; + + @OneWay() classes?: string | undefined = ''; + + @OneWay() name?: string = ''; + + @OneWay() addWidgetClass? = true; + + @Event() onActive?: (e: Event) => void; + + @Event() onDimensionChanged?: () => void; + + @Event() onInactive?: (e: Event) => void; + + @Event() onVisibilityChange?: (args: boolean) => void; + + @Event() onFocusIn?: (e: Event) => void; + + @Event() onFocusOut?: (e: Event) => void; + + @Event() onHoverStart?: (e: Event) => void; + + @Event() onHoverEnd?: (e: Event) => void; + + @Event() onRootElementRendered?: (rootElement: HTMLDivElement) => void; +} + +@Component({ + defaultOptionRules: null, + jQuery: { + register: true, + }, + view: viewFunction, +}) + +export class Widget extends JSXComponent(WidgetProps) { + @InternalState() active = false; + + @InternalState() focused = false; + + @InternalState() hovered = false; + + @Ref() + widgetElementRef!: RefObject; + + @Consumer(ConfigContext) + config?: ConfigContextValue; + + get shouldRenderConfigProvider(): boolean { + const { rtlEnabled } = this.props; + return resolveRtlEnabledDefinition(rtlEnabled, this.config); + } + + get rtlEnabled(): boolean | undefined { + const { rtlEnabled } = this.props; + return resolveRtlEnabled(rtlEnabled, this.config); + } + + @Effect({ run: 'once' }) setRootElementRef(): void { + const { rootElementRef, onRootElementRendered } = this.props; + if (rootElementRef) { + rootElementRef.current = this.widgetElementRef.current; + } + onRootElementRendered?.(this.widgetElementRef.current!); + } + + @Effect() + activeEffect(): EffectReturn { + const { + activeStateEnabled, activeStateUnit, disabled, onInactive, + // eslint-disable-next-line @typescript-eslint/naming-convention + _feedbackShowTimeout, _feedbackHideTimeout, onActive, + } = this.props; + const selector = activeStateUnit; + const namespace = 'UIFeedback'; + + if (activeStateEnabled && !disabled) { + active.on(this.widgetElementRef.current, + ({ event }: { event: Event }) => { + this.active = true; + onActive?.(event); + }, + ({ event }: { event: Event }) => { + this.active = false; + onInactive?.(event); + }, { + hideTimeout: _feedbackHideTimeout, + namespace, + selector, + showTimeout: _feedbackShowTimeout, + }); + + return (): void => active.off(this.widgetElementRef.current, { selector, namespace }); + } + + return undefined; + } + + @Effect() + clickEffect(): EffectReturn { + const { name, onClick, disabled } = this.props; + const namespace = name; + + if (onClick && !disabled) { + dxClick.on(this.widgetElementRef.current, onClick, { namespace }); + return (): void => dxClick.off(this.widgetElementRef.current, { namespace }); + } + + return undefined; + } + + @Method() + focus(): void { + focus.trigger(this.widgetElementRef.current); + } + + @Method() + blur(): void { + const activeElement = domAdapter.getActiveElement(); + + if (this.widgetElementRef.current === activeElement) { + activeElement.blur(); + } + } + + @Method() + activate(): void { + this.active = true; + } + + @Method() + deactivate(): void { + this.active = false; + } + + @Effect() + focusEffect(): EffectReturn { + const { + disabled, focusStateEnabled, name, onFocusIn, onFocusOut, + } = this.props; + const namespace = `${name}Focus`; + const isFocusable = focusStateEnabled && !disabled; + + if (isFocusable) { + focus.on(this.widgetElementRef.current, + (e: Event & { isDefaultPrevented: () => boolean }) => { + if (!e.isDefaultPrevented()) { + this.focused = true; + onFocusIn?.(e); + } + }, + (e: Event & { isDefaultPrevented: () => boolean }) => { + if (!e.isDefaultPrevented()) { + this.focused = false; + onFocusOut?.(e); + } + }, + { + isFocusable: focusable, + namespace, + }); + return (): void => focus.off(this.widgetElementRef.current, { namespace }); + } + + return undefined; + } + + @Effect() + hoverEffect(): EffectReturn { + const namespace = 'UIFeedback'; + const { + activeStateUnit, hoverStateEnabled, disabled, onHoverStart, onHoverEnd, + } = this.props; + const selector = activeStateUnit; + const isHoverable = hoverStateEnabled && !disabled; + if (isHoverable) { + hover.on(this.widgetElementRef.current, + ({ event }: { event: Event }) => { + !this.active && (this.hovered = true); + onHoverStart?.(event); + }, + (event: Event) => { + this.hovered = false; + onHoverEnd?.(event); + }, + { selector, namespace }); + return (): void => hover.off(this.widgetElementRef.current, { selector, namespace }); + } + + return undefined; + } + + @Effect() + keyboardEffect(): EffectReturn { + const { onKeyDown, focusStateEnabled } = this.props; + + if (focusStateEnabled && onKeyDown) { + const id = keyboard.on( + this.widgetElementRef.current, + this.widgetElementRef.current, + (e: Event): void => onKeyDown(e) as undefined, + ); + + return (): void => keyboard.off(id); + } + + return undefined; + } + + @Effect() + resizeEffect(): EffectReturn { + const namespace = `${this.props.name}VisibilityChange`; + const { onDimensionChanged } = this.props; + + if (onDimensionChanged) { + resize.on(this.widgetElementRef.current, onDimensionChanged, { namespace }); + return (): void => resize.off(this.widgetElementRef.current, { namespace }); + } + + return undefined; + } + + @Effect() windowResizeEffect(): EffectReturn { + const { onDimensionChanged } = this.props; + + if (onDimensionChanged) { + resizeCallbacks.add(onDimensionChanged); + + return (): void => { resizeCallbacks.remove(onDimensionChanged); }; + } + + return undefined; + } + + @Effect() + visibilityEffect(): EffectReturn { + const { name, onVisibilityChange } = this.props; + const namespace = `${name}VisibilityChange`; + + if (onVisibilityChange) { + visibility.on(this.widgetElementRef.current, + (): void => onVisibilityChange(true), + (): void => onVisibilityChange(false), + { namespace }); + + return (): void => visibility.off(this.widgetElementRef.current, { namespace }); + } + + return undefined; + } + + @Effect() + checkDeprecation(): void { + const { width, height } = this.props; + if (isFunction(width)) { + errors.log('W0017', 'width'); + } + if (isFunction(height)) { + errors.log('W0017', 'height'); + } + } + + @Effect() + applyCssTextEffect(): void { + const { cssText } = this.props; + + if (cssText !== '') { + this.widgetElementRef.current!.style.cssText = cssText; + } + } + + get attributes(): Record { + const { + aria, + disabled, + focusStateEnabled, + visible, + } = this.props; + + const accessKey = focusStateEnabled && !disabled && this.props.accessKey; + return { + ...extend({}, this.restAttributes, accessKey && { accessKey }) as Record, + ...getAria({ ...aria, disabled, hidden: !visible }), + }; + } + + get styles(): Record { + const { width, height } = this.props; + const style = this.restAttributes.style as Record || {}; + const computedWidth = normalizeStyleProp('width', isFunction(width) ? width() : width); + const computedHeight = normalizeStyleProp('height', isFunction(height) ? height() : height); + + return { + ...style, + height: computedHeight ?? style.height, + width: computedWidth ?? style.width, + }; + } + + get cssClasses(): string { + const { + classes, + addWidgetClass, + className, + disabled, + activeStateEnabled, + focusStateEnabled, + hoverStateEnabled, + onVisibilityChange, + visible, + } = this.props; + + const isFocusable = !!focusStateEnabled && !disabled; + const isHoverable = !!hoverStateEnabled && !disabled; + const canBeActive = !!activeStateEnabled && !disabled; + const classesMap = { + 'dx-widget': !!addWidgetClass, + [String(classes)]: !!classes, + [String(className)]: !!className, + 'dx-state-disabled': !!disabled, + 'dx-state-invisible': !visible, + 'dx-state-focused': !!this.focused && isFocusable, + 'dx-state-active': !!this.active && canBeActive, + 'dx-state-hover': !!this.hovered && isHoverable && !this.active, + 'dx-rtl': !!this.rtlEnabled, + 'dx-visibility-change-handler': !!onVisibilityChange, + }; + + return combineClasses(classesMap); + } + + get tabIndex(): undefined | number { + const { focusStateEnabled, disabled, tabIndex } = this.props; + const isFocusable = focusStateEnabled && !disabled; + + return isFocusable ? tabIndex : undefined; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/__tests__/container.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/__tests__/container.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..80e973bbd72a4f2ff4fb7cc27cf410ceb8581c13 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/__tests__/container.test.tsx @@ -0,0 +1,232 @@ +import React, { createRef } from 'react'; +import { mount } from 'enzyme'; +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import { + emit, getEventHandlers, clear as clearEventHandlers, EVENT, +} from '../../../test_utils/events_mock'; +import { DraggableContainer, DraggableContainerProps, viewFunction as DraggableContainerView } from '../container'; +import { DisposeEffectReturn } from '../../../utils/effect_return'; + +describe('DraggableContainer', () => { + describe('View', () => { + it('default render', () => { + const mockRef = createRef(); + const props = new DraggableContainerProps(); + props.children = []; + const draggableProps = { + cssClasses: 'test', + widgetRef: mockRef, + restAttributes: { 'rest-attributes': 'true' }, + props, + } as unknown as DraggableContainer; + const tree = mount( as any); + + expect(tree.find('div').props()).toMatchObject({ + ...props, + className: 'test', + 'rest-attributes': 'true', + }); + + expect(tree.find('div').instance()).toBe(mockRef.current); + }); + + it('should render children', () => { + const props = { + children:
, + }; + const widget = mount(DraggableContainerView({ + props, + } as any) as any); + + expect(widget.find('.child').exists()).toBe(true); + }); + }); + + describe('Logic', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('Getters', () => { + describe('cssClasses', () => { + it('should add \'className\' class', () => { + const draggable = new DraggableContainer({ className: 'custom-class' }); + + expect(draggable.cssClasses).toEqual('custom-class dx-draggable'); + }); + + it('should add disabled class', () => { + const draggable = new DraggableContainer({ disabled: true }); + + expect(draggable.cssClasses).toEqual('dx-draggable dx-state-disabled'); + }); + + it('should add dragging class', () => { + const draggable = new DraggableContainer({}); + + draggable.isDragging = true; + + expect(draggable.cssClasses).toEqual('dx-draggable dx-draggable-dragging'); + }); + }); + }); + }); + + describe('Behavior', () => { + describe('Effects', () => { + describe('dragEffect', () => { + beforeEach(clearEventHandlers); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should subscribe to drag events', () => { + const draggable = new DraggableContainer({}); + + const widgetRef = createRef() as any; + draggable.widgetRef = widgetRef; + draggable.dragStartHandler = jest.fn(); + draggable.dragMoveHandler = jest.fn(); + draggable.dragEndHandler = jest.fn(); + + draggable.dragEffect(); + + emit(EVENT.dragStart); + + expect(draggable.dragStartHandler).toHaveBeenCalledTimes(1); + expect(draggable.dragMoveHandler).toHaveBeenCalledTimes(0); + expect(draggable.dragEndHandler).toHaveBeenCalledTimes(0); + + emit(EVENT.dragMove); + + expect(draggable.dragStartHandler).toHaveBeenCalledTimes(1); + expect(draggable.dragMoveHandler).toHaveBeenCalledTimes(1); + expect(draggable.dragEndHandler).toHaveBeenCalledTimes(0); + + emit(EVENT.dragEnd); + + expect(draggable.dragStartHandler).toHaveBeenCalledTimes(1); + expect(draggable.dragMoveHandler).toHaveBeenCalledTimes(1); + expect(draggable.dragEndHandler).toHaveBeenCalledTimes(1); + }); + + it('should return unsubscribe callback', () => { + const draggable = new DraggableContainer({}); + + const widgetRef = createRef() as any; + draggable.widgetRef = widgetRef; + draggable.dragStartHandler = jest.fn(); + draggable.dragMoveHandler = jest.fn(); + draggable.dragEndHandler = jest.fn(); + + const detach = draggable.dragEffect() as DisposeEffectReturn; + + expect(getEventHandlers(EVENT.dragStart).length).toBe(1); + expect(getEventHandlers(EVENT.dragMove).length).toBe(1); + expect(getEventHandlers(EVENT.dragEnd).length).toBe(1); + detach(); + expect(getEventHandlers(EVENT.dragStart).length).toBe(0); + expect(getEventHandlers(EVENT.dragMove).length).toBe(0); + expect(getEventHandlers(EVENT.dragEnd).length).toBe(0); + }); + + it('should not subscribe to drag events if widget is disabled', () => { + const draggable = new DraggableContainer({ disabled: true }); + + const widgetRef = createRef() as any; + draggable.widgetRef = widgetRef; + draggable.dragStartHandler = jest.fn(); + draggable.dragMoveHandler = jest.fn(); + draggable.dragEndHandler = jest.fn(); + + draggable.dragEffect(); + + expect(getEventHandlers(EVENT.dragStart)).toBe(undefined); + expect(getEventHandlers(EVENT.dragMove)).toBe(undefined); + expect(getEventHandlers(EVENT.dragEnd)).toBe(undefined); + }); + }); + }); + + describe('Events', () => { + it('onDragStart', () => { + const onDragStart = jest.fn(); + const event = {} as Event; + const draggable = new DraggableContainer({ onDragStart, data: 'test' }); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + draggable.dragStartHandler(event); + + expect(onDragStart).toHaveBeenCalledTimes(1); + expect(onDragStart).toHaveBeenCalledWith({ + event, + data: 'test', + itemElement: widgetRef.current, + }); + }); + + it('call dragStartHandler without onDragStart prop', () => { + const event = {} as Event; + const draggable = new DraggableContainer({}); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + expect(draggable.dragStartHandler.bind(draggable, event)).not.toThrow(); + }); + + it('onDragMove', () => { + const onDragMove = jest.fn(); + const event = {} as Event; + const draggable = new DraggableContainer({ onDragMove, data: 'test' }); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + draggable.dragMoveHandler(event); + + expect(onDragMove).toHaveBeenCalledTimes(1); + expect(onDragMove).toHaveBeenCalledWith({ + event, + data: 'test', + itemElement: widgetRef.current, + }); + }); + + it('call dragMoveHandler without onDragMove prop', () => { + const event = {} as Event; + const draggable = new DraggableContainer({}); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + expect(draggable.dragMoveHandler.bind(draggable, event)).not.toThrow(); + }); + + it('onDragEnd', () => { + const onDragEnd = jest.fn(); + const event = {} as Event; + const draggable = new DraggableContainer({ onDragEnd, data: 'test' }); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + draggable.dragEndHandler(event); + + expect(onDragEnd).toHaveBeenCalledTimes(1); + expect(onDragEnd).toHaveBeenCalledWith({ + event, + data: 'test', + itemElement: widgetRef.current, + }); + }); + + it('call dragEndHandler without onDragEnd prop', () => { + const event = {} as Event; + const draggable = new DraggableContainer({}); + const widgetRef = { current: {} as any } as any; + draggable.widgetRef = widgetRef; + + expect(draggable.dragEndHandler.bind(draggable, event)).not.toThrow(); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/container.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/container.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e278d3bb6caa4b0fe413318d46500603ac237945 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/draggable/container.tsx @@ -0,0 +1,131 @@ +import { + Component, + ComponentBindings, + JSXComponent, + Event, + Effect, + RefObject, + Ref, + OneWay, + InternalState, + Slot, +} from '@devextreme-generator/declarations'; +import { EffectReturn } from '../../utils/effect_return'; + +import { + start, + move, + end, +} from '../../../events/drag'; +import eventsEngine from '../../../events/core/events_engine'; +import { combineClasses } from '../../utils/combine_classes'; + +export const viewFunction = ({ + widgetRef, + restAttributes, + cssClasses, + props: { + children, + }, +}: DraggableContainer): JSX.Element => ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+ {children} +
+); + +interface DraggableContainerEvent { + event: Event; + data: unknown; + itemElement: HTMLDivElement; +} + +@ComponentBindings() +export class DraggableContainerProps { + @OneWay() data?: unknown; + + @OneWay() disabled?: boolean; + + @OneWay() className = ''; + + @Slot() children?: JSX.Element | (JSX.Element | undefined | false | null)[]; + + @Event() onDragStart?: (e: DraggableContainerEvent) => void; + + @Event() onDragMove?: (e: DraggableContainerEvent) => void; + + @Event() onDragEnd?: (e: DraggableContainerEvent) => void; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) + +export class DraggableContainer extends JSXComponent(DraggableContainerProps) { + @Ref() widgetRef!: RefObject; + + @InternalState() isDragging = false; + + get cssClasses(): string { + const { disabled, className } = this.props; + + const classesMap = { + [className]: !!className, + 'dx-draggable': true, + 'dx-draggable-dragging': this.isDragging, + 'dx-state-disabled': !!disabled, + }; + + return combineClasses(classesMap); + } + + @Effect() + dragEffect(): EffectReturn { + if (this.props.disabled) { + return undefined; + } + + eventsEngine.on(this.widgetRef.current, start, this.dragStartHandler); + eventsEngine.on(this.widgetRef.current, move, this.dragMoveHandler); + eventsEngine.on(this.widgetRef.current, end, this.dragEndHandler); + + return (): void => { + eventsEngine.off(this.widgetRef.current, start, this.dragStartHandler); + eventsEngine.off(this.widgetRef.current, move, this.dragMoveHandler); + eventsEngine.off(this.widgetRef.current, end, this.dragEndHandler); + }; + } + + dragStartHandler(event: Event): void { + this.isDragging = true; + const dragStartArgs = this.getEventArgs(event); + const { onDragStart } = this.props; + + onDragStart?.(dragStartArgs); + } + + dragMoveHandler(event: Event): void { + const dragMoveArgs = this.getEventArgs(event); + const { onDragMove } = this.props; + + onDragMove?.(dragMoveArgs); + } + + dragEndHandler(event: Event): void { + this.isDragging = false; + const dragEndArgs = this.getEventArgs(event); + const { onDragEnd } = this.props; + + onDragEnd?.(dragEndArgs); + } + + getEventArgs(e: Event): DraggableContainerEvent { + return { + event: e, + data: this.props.data, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + itemElement: this.widgetRef.current!, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/droppable.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/droppable.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3d10696db66360f3227f8ce9af8c6769a79d65e8 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/droppable.tsx @@ -0,0 +1,122 @@ +import { + Component, + ComponentBindings, + JSXComponent, + Event, + Effect, + RefObject, + Ref, + OneWay, + Slot, +} from '@devextreme-generator/declarations'; +import { EffectReturn } from '../utils/effect_return'; +import { EventCallback } from './common/event_callback'; + +import { + enter, + leave, + drop, +} from '../../events/drag'; +import eventsEngine from '../../events/core/events_engine'; +import { combineClasses } from '../utils/combine_classes'; + +export const viewFunction = ({ + widgetRef, + restAttributes, + cssClasses, + props: { + children, + }, +}: Droppable): JSX.Element => ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+ {children} +
+); + +interface DroppableEvent { + event: Event; + itemElement: HTMLDivElement; +} + +@ComponentBindings() +export class DroppableProps { + @OneWay() disabled = false; + + @OneWay() className = ''; + + @Slot() children?: JSX.Element; + + @Event() onDragEnter?: EventCallback; + + @Event() onDragLeave?: EventCallback; + + @Event() onDrop?: EventCallback; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) + +export class Droppable extends JSXComponent(DroppableProps) { + @Ref() widgetRef!: RefObject; + + get cssClasses(): string { + const { disabled, className } = this.props; + + const classesMap = { + [className]: !!className, + 'dx-droppable': true, + 'dx-state-disabled': !!disabled, + }; + + return combineClasses(classesMap); + } + + @Effect() + dropEventsEffect(): EffectReturn { + if (this.props.disabled) { + return undefined; + } + + eventsEngine.on(this.widgetRef.current, enter, this.dragEnterHandler); + eventsEngine.on(this.widgetRef.current, leave, this.dragLeaveHandler); + eventsEngine.on(this.widgetRef.current, drop, this.dropHandler); + + return (): void => { + eventsEngine.off(this.widgetRef.current, enter, this.dragEnterHandler); + eventsEngine.off(this.widgetRef.current, leave, this.dragLeaveHandler); + eventsEngine.off(this.widgetRef.current, drop, this.dropHandler); + }; + } + + dragEnterHandler(event: Event): void { + const dragEnterArgs = this.getEventArgs(event); + const { onDragEnter } = this.props; + + onDragEnter?.(dragEnterArgs); + } + + dragLeaveHandler(event: Event): void { + const dragLeaveArgs = this.getEventArgs(event); + const { onDragLeave } = this.props; + + onDragLeave?.(dragLeaveArgs); + } + + dropHandler(event: Event): void { + const dropArgs = this.getEventArgs(event); + const { onDrop } = this.props; + + onDrop?.(dropArgs); + } + + getEventArgs(e: Event): DroppableEvent { + return { + event: e, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + itemElement: this.widgetRef.current!, + }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/calendar.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/calendar.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8cbdf95e3b22aa826af87afc1c561f1200611495 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/calendar.test.tsx @@ -0,0 +1,89 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import LegacyCalendar from '../../../../ui/calendar'; +import { viewFunction as CalendarView, CalendarProps, Calendar } from '../calendar'; +import { DomComponentWrapper } from '../../common/dom_component_wrapper'; + +jest.mock('../../../../ui/calendar', () => jest.fn()); + +describe('Calendar', () => { + describe('View', () => { + it('View render', () => { + const componentProps = new CalendarProps(); + const props = { + props: componentProps, + restAttributes: { 'rest-attributes': 'true' }, + } as Partial; + const tree = shallow(); + + expect(tree.find(DomComponentWrapper).props()).toMatchObject({ + componentProps, + componentType: LegacyCalendar, + 'rest-attributes': 'true', + }); + }); + }); + + describe('Behaviour', () => { + describe('Effects', () => { + describe('saveInstance', () => { + it('should save instance', () => { + const calendar: any = new Calendar({ + ...new CalendarProps(), + }); + const instance = {}; + + calendar.domComponentWrapperRef = { + current: { + getInstance: () => instance, + }, + }; + + calendar.saveInstance(); + expect(calendar.instance).toEqual(instance); + }); + + it('should not fail if ref has no "current"', () => { + const calendar: any = new Calendar({ + ...new CalendarProps(), + }); + calendar.domComponentWrapperRef = {}; + + expect(() => { calendar.saveInstance(); }).not.toThrow(); + }); + }); + + describe('focus', () => { + it('should set the "focus" event listener to instance', () => { + const mockCallback = jest.fn(); + const calendar: any = new Calendar({ + ...new CalendarProps(), + }); + + calendar.instance = { focus: mockCallback }; + + calendar.focus(); + expect(mockCallback).toBeCalledTimes(1); + }); + + it('should not fail if instance is not set', () => { + const calendar: any = new Calendar({ + ...new CalendarProps(), + }); + + expect(() => { calendar.focus(); }).not.toThrow(); + }); + }); + }); + }); + + describe('Logic', () => { + it('props defaults', () => { + const props = new CalendarProps(); + + expect(props.skipFocusCheck).toEqual(false); + // eslint-disable-next-line no-underscore-dangle + expect(props._todayDate?.() instanceof Date).toEqual(true); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/number_box.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/number_box.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..887dceb0e025e833458411ebe723e226450387a0 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/__tests__/number_box.test.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { NumberBox, NumberBoxProps, viewFunction as NumberBoxView } from '../number_box'; +import { DomComponentWrapper } from '../../common/dom_component_wrapper'; +import LegacyNumberBox from '../../../../ui/number_box'; + +jest.mock('../../../../ui/number_box', () => jest.fn()); + +describe('NumberBox', () => { + describe('View', () => { + it('default render', () => { + const componentProps = new NumberBoxProps(); + const props = { + props: componentProps, + restAttributes: { 'rest-attributes': 'true' }, + } as Partial; + const tree = shallow( as any); + + expect(tree.find(DomComponentWrapper).props()).toMatchObject({ + componentProps, + componentType: LegacyNumberBox, + 'rest-attributes': 'true', + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/calendar.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/calendar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f0887215430421621bcb08a379408b8ccf39b5da --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/calendar.tsx @@ -0,0 +1,66 @@ +import { + Component, ComponentBindings, JSXComponent, OneWay, TwoWay, Event, + RefObject, Ref, Method, Mutable, Effect, +} from '@devextreme-generator/declarations'; +import LegacyCalendar from '../../../ui/calendar'; +import { DomComponentWrapper } from '../common/dom_component_wrapper'; +import { EventCallback } from '../common/event_callback'; +import { BaseWidgetProps } from '../common/base_props'; + +function today(): Date { return new Date(); } + +export const viewFunction = ({ + props, + restAttributes, + domComponentWrapperRef, +}: Calendar): JSX.Element => ( + +); + +@ComponentBindings() +export class CalendarProps extends BaseWidgetProps { + @OneWay() min?: Date | number | string; + + @OneWay() max?: Date | number | string; + + @OneWay() firstDayOfWeek?: number; + + @TwoWay() value?: Date | number | string | null = null; + + @Event() valueChange?: EventCallback; + + @OneWay() focusStateEnabled?: boolean; + + @OneWay() tabIndex?: number; + + // Scheduler private API + @OneWay() _todayDate? = today; + + @OneWay() skipFocusCheck?: boolean = false; +} +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class Calendar extends JSXComponent() { + @Ref() domComponentWrapperRef!: RefObject; + + @Mutable() instance!: { focus }; + + @Effect() + saveInstance(): void { + this.instance = this.domComponentWrapperRef.current?.getInstance() as unknown as { focus }; + } + + @Method() + focus(): void { + this.instance?.focus(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d49f7613a0f9513d6e6542033c54c27660700aa7 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box.test.tsx @@ -0,0 +1,326 @@ +/* eslint-disable jest/no-standalone-expect */ +import { mount, shallow } from 'enzyme'; +import each from 'jest-each'; +import { RefObject } from '@devextreme-generator/declarations'; +import devices from '../../../../../core/devices'; +import { convertRulesToOptions } from '../../../../../core/options/utils'; +import { current } from '../../../../../ui/themes'; +import { + clear as clearEventHandlers, +} from '../../../../test_utils/events_mock'; +import { + CheckBox, CheckBoxProps, defaultOptionRules, viewFunction, +} from '../check_box'; +import { Editor } from '../../internal/editor'; +import { CheckBoxIcon } from '../check_box_icon'; + +interface Mock extends jest.Mock {} + +jest.mock('../../../../utils/get_computed_style'); + +jest.mock('../../../../../core/devices', () => { + const actualDevices = jest.requireActual('../../../../../core/devices').default; + const isSimulator = actualDevices.isSimulator.bind(actualDevices); + const real = actualDevices.real.bind(actualDevices); + + actualDevices.isSimulator = jest.fn(isSimulator); + actualDevices.real = jest.fn(real); + + return actualDevices; +}); + +jest.mock('../../../../../ui/themes', () => ({ + ...jest.requireActual('../../../../../ui/themes'), + current: jest.fn(() => 'default'), +})); + +describe('CheckBox', () => { + describe('render', () => { + it('should render hidden input', () => { + const checkBox = shallow(viewFunction({ props: { value: false } } as CheckBox)); + const input = checkBox.find('input'); + expect(input.props()).toMatchObject({ + type: 'hidden', + value: 'false', + }); + }); + + each([true, false, undefined]) + .it('input should have value=%s attr if value is %s', (value) => { + const checkBox = shallow(viewFunction({ props: { value } } as CheckBox)); + const input = checkBox.find('input'); + expect(input.props()).toMatchObject({ + value: `${value}`, + }); + }); + + it('input should have name attr if name is defined', () => { + const checkBox = shallow(viewFunction({ props: { name: 'name' } } as CheckBox)); + const input = checkBox.find('input'); + expect(input.props()).toMatchObject({ + name: 'name', + }); + }); + + it('input shouldn\'t have name attr if name is not defined', () => { + const checkBox = shallow(viewFunction({ props: {} } as CheckBox)); + const input = checkBox.find('input'); + expect(input.props()).not.toHaveProperty('name'); + }); + + it('should render text if text option is defined', () => { + const checkBox = shallow(viewFunction({ props: { text: 'checkbox-text' } } as CheckBox)); + const checkBoxText = checkBox.find('.dx-checkbox-container .dx-checkbox-text'); + expect(checkBoxText.text()).toBe('checkbox-text'); + }); + + it('should not render text if option is not defined', () => { + const checkBox = shallow(viewFunction({ props: {} } as CheckBox)); + const checkBoxText = checkBox.find('.dx-checkbox-text'); + expect(checkBoxText.exists()).toBe(false); + }); + + it('should always render icon', () => { + const checkBox = shallow(viewFunction({ + props: {}, + } as CheckBox)); + expect(checkBox.find(CheckBoxIcon).exists()).toBe(true); + }); + + it('should pass all necessary properties to Editor', () => { + const renderOptions = { + aria: { role: 'aria' }, + }; + const renderProps = { + accessKey: 'A', + activeStateEnabled: true, + className: 'name', + disabled: true, + focusStateEnabled: true, + height: 100, + hint: 'hint', + hoverStateEnabled: true, + rtlEnabled: true, + tabIndex: -2, + visible: true, + width: 200, + isValid: true, + validationMessageMode: 'auto', + validationError: { message: 'error' }, + validationErrors: [], + validationStatus: 'valid', + }; + const cssClasses = 'cssClasses'; + const restAttributes = { attr1: 'value1', attr2: 'value2' }; + const keyDown = (): null => null; + const onWidgetClick = (): null => null; + const checkBox = mount(viewFunction({ + ...renderOptions, + props: renderProps, + restAttributes, + cssClasses, + keyDown, + onWidgetClick, + } as any)); + expect(checkBox.find(Editor).props()).toMatchObject({ + ...renderOptions, + ...renderProps, + ...restAttributes, + classes: cssClasses, + onKeyDown: keyDown, + onClick: onWidgetClick, + }); + }); + + it('should pass iconSize and isChecked to CheckBoxIcon', () => { + const iconSize = 15; + const checkBox = mount(viewFunction({ + props: { iconSize, value: true }, + } as any)); + expect(checkBox.find(CheckBoxIcon).props()).toMatchObject({ + size: iconSize, + isChecked: true, + }); + }); + }); + + describe('Behavior', () => { + describe('Events', () => { + afterEach(clearEventHandlers); + + describe('Widget', () => { + describe('Key down', () => { + it('should call onKeyDown callback by Widget key down', () => { + const onKeyDown = jest.fn(() => ({ cancel: true })); + const originalEvent = {} as Event & { cancel: boolean }; + const options = { keyName: '', which: '', originalEvent }; + const checkBox = new CheckBox({ onKeyDown }); + checkBox.keyDown(options); + expect(onKeyDown).toHaveBeenCalledTimes(1); + expect(onKeyDown).toHaveBeenCalledWith(options); + }); + + it('should prevent key down event processing if onKeyDown event handler returns event.cancel="true"', () => { + const onKeyDown = jest.fn(() => ({ cancel: true })); + const onClick = jest.fn(); + const originalEvent = {} as Event & { cancel: boolean }; + const options = { keyName: 'enter', which: '', originalEvent }; + const checkBox = new CheckBox({ onKeyDown, onClick }); + checkBox.keyDown(options); + expect(onKeyDown).toBeCalled(); + expect(onClick).not.toBeCalled(); + }); + + it('should prevent default key down event and simulate click by space key', () => { + const originalEvent = { + preventDefault: jest.fn(), + } as unknown as Event & { cancel: boolean }; + const options = { + keyName: 'space', + which: 'space', + originalEvent, + }; + const checkBox = new CheckBox({}); + checkBox.onWidgetClick = jest.fn(); + checkBox.keyDown(options); + expect(options.originalEvent.preventDefault).toBeCalled(); + expect(checkBox.onWidgetClick).toHaveBeenCalled(); + }); + + it('should not simulate click by keys down except space', () => { + const onClick = jest.fn(); + const checkBox = new CheckBox({ onClick }); + const originalEvent = {} as Event & { cancel: boolean }; + checkBox.keyDown({ keyName: 'enter', which: 'enter', originalEvent }); + expect(onClick).not.toBeCalled(); + }); + }); + + describe('Click', () => { + it('should change value by Widget click', () => { + const checkBox = new CheckBox({ + value: null, + }); + checkBox.onWidgetClick({} as Event); + expect(checkBox.props.value).toBe(true); + }); + + it('should call saveValueChangeEvent by Widget click', () => { + const saveValueChangeEvent = jest.fn(); + const checkBox = new CheckBox({ + saveValueChangeEvent, + value: false, + }); + const event = {} as Event; + checkBox.onWidgetClick(event); + expect(saveValueChangeEvent).toBeCalled(); + expect(saveValueChangeEvent).toBeCalledWith(event); + }); + + it('should not change value by Widget click of readOnly is true', () => { + const checkBox = new CheckBox({ + value: false, + readOnly: true, + }); + checkBox.onWidgetClick({} as Event); + expect(checkBox.props.value).toBe(false); + }); + }); + }); + }); + + describe('Methods', () => { + describe('focus', () => { + it('should call editor focus method', () => { + const checkBox = new CheckBox({}); + checkBox.editorRef = { current: { focus: jest.fn() } } as unknown as RefObject; + checkBox.focus(); + + expect(checkBox.editorRef.current?.focus).toHaveBeenCalledTimes(1); + expect(checkBox.editorRef.current?.focus).toHaveBeenCalledWith(); + }); + }); + + describe('blur', () => { + it('should call editor blur method', () => { + const checkBox = new CheckBox({}); + checkBox.editorRef = { current: { blur: jest.fn() } } as unknown as RefObject; + checkBox.blur(); + + expect(checkBox.editorRef.current?.blur).toHaveBeenCalledTimes(1); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + describe('aria', () => { + it('should have role = "checkbox"', () => { + expect(new CheckBox({}).aria).toMatchObject({ role: 'checkbox' }); + }); + + each([true, false, null]) + .it('should have "checked=%s" if value=%s', (value) => { + let expectedValue = `${value}`; + if (value === null) { + expectedValue = 'mixed'; + } + expect(new CheckBox({ value }).aria) + .toMatchObject({ checked: expectedValue }); + }); + }); + + describe('cssClasses', () => { + it('should have "dx-checkbox" class', () => { + expect(new CheckBox({}).cssClasses) + .toEqual(expect.stringMatching('dx-checkbox')); + }); + + it('should have "dx-checkbox-checked" class if value option is true', () => { + expect(new CheckBox({ value: true }).cssClasses) + .toEqual(expect.stringMatching('dx-checkbox-checked')); + }); + + it('should have "dx-checkbox-indeterminate" class if value option is undefined', () => { + expect(new CheckBox({ value: null }).cssClasses) + .toEqual(expect.stringMatching('dx-checkbox-indeterminate')); + }); + + it('should have "dx-checkbox-has-text" class if text option is defined', () => { + expect(new CheckBox({ text: 'text' }).cssClasses) + .toEqual(expect.stringMatching('dx-checkbox-has-text')); + }); + }); + }); + + describe('Default options', () => { + const getDefaultOptions = (): CheckBoxProps => Object.assign(new CheckBoxProps(), + convertRulesToOptions(defaultOptionRules)); + + beforeEach(() => { + (devices.real as Mock).mockImplementation(() => ({ deviceType: 'desktop' })); + (devices.isSimulator as Mock).mockImplementation(() => false); + (current as Mock).mockImplementation(() => 'default'); + }); + + afterEach(() => jest.resetAllMocks()); + + describe('focusStateEnabled', () => { + it('should be false if device is not desktop', () => { + (devices.real as Mock).mockImplementation(() => ({ deviceType: 'android' })); + expect(getDefaultOptions().focusStateEnabled).toBe(false); + }); + + it('should be true on desktop and not simulator', () => { + expect(getDefaultOptions().focusStateEnabled).toBe(true); + }); + + it('should be false on simulator', () => { + (devices.isSimulator as Mock).mockImplementation(() => true); + expect(getDefaultOptions().focusStateEnabled).toBe(false); + }); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box_icon.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box_icon.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..efe220d190de6b6cb0c7275466cc5b16963ac249 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/check_box_icon.test.tsx @@ -0,0 +1,238 @@ +/* eslint-disable jest/no-standalone-expect */ +import { shallow } from 'enzyme'; +import each from 'jest-each'; +import { RefObject } from '@devextreme-generator/declarations'; +import getElementComputedStyle from '../../../../utils/get_computed_style'; +import { current } from '../../../../../ui/themes'; +import { + CheckBoxIcon, viewFunction, +} from '../check_box_icon'; +import { getDefaultIconSize, getFontSizeByIconSize } from '../utils'; +import { getWindow, setWindow } from '../../../../../core/utils/window'; + +interface Mock extends jest.Mock {} + +jest.mock('../../../../utils/get_computed_style'); + +jest.mock('../../../../../ui/themes', () => ({ + ...jest.requireActual('../../../../../ui/themes'), + current: jest.fn(() => 'default'), +})); + +describe('CheckBoxIconIcon', () => { + describe('Render', () => { + it('should render span with "dx-checkbox-class" class', () => { + const checkBoxIconIcon = shallow(viewFunction({} as CheckBoxIcon)); + const span = checkBoxIconIcon.find('span'); + expect(span.props()).toMatchObject({ + className: 'dx-checkbox-icon', + }); + }); + }); + + describe('Behavior', () => { + describe('Effects', () => { + describe('updateIconFontSize', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should not do anything if there is no window', () => { + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + setWindow(getWindow(), false); + try { + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual(undefined); + } finally { + setWindow(getWindow(), true); + } + }); + + it('should not do anything if size is not specified', () => { + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + setWindow(getWindow(), false); + try { + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual(undefined); + } finally { + setWindow(getWindow(), true); + } + }); + + it('should set icon font size', () => { + const checkBoxIcon = new CheckBoxIcon({ size: 22, isChecked: true }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual('16px'); + }); + + it('should set default default theme font-size if theme is not defined (e.g. in SSR)', () => { + (current as Mock).mockReturnValue(undefined); + const checkBoxIcon = new CheckBoxIcon({ size: 22, isChecked: true }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual('16px'); + }); + + each(['material', 'default', 'material-compact', 'default-compact']) + .describe('%s theme', (theme) => { + each([true, false]) + .describe('isChecked=%s', (isChecked) => { + it('should set fontSize properly when size is specified', () => { + (current as Mock).mockReturnValue(theme); + const iconSize = getDefaultIconSize(); + + const checkBoxIcon = new CheckBoxIcon({ size: iconSize, isChecked }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + const expectedValue = `${getFontSizeByIconSize(iconSize, isChecked)}px`; + expect(icon.style.fontSize).toEqual(expectedValue); + }); + + it('should set fontSize properly when size is set using percentage format', () => { + (current as Mock).mockReturnValue(theme); + const iconSize = getDefaultIconSize(); + (getElementComputedStyle as Mock).mockReturnValue({ width: iconSize }); + + const checkBoxIcon = new CheckBoxIcon({ isChecked, size: '100%' }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + const expectedValue = `${getFontSizeByIconSize(iconSize, isChecked)}px`; + expect(icon.style.fontSize).toEqual(expectedValue); + }); + }); + }); + + it('should update icon font size correctly if size prop is specified as a pixel string', () => { + const iconSize = '22px'; + (getElementComputedStyle as Mock).mockReturnValue({ width: iconSize }); + + const checkBoxIcon = new CheckBoxIcon({ size: iconSize, isChecked: true }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual('16px'); + }); + + it('should not change font size if getComputedIconSize returns nullish value', () => { + (getElementComputedStyle as Mock).mockReturnValue(null); + + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.updateFontSize(); + + expect(icon.style.fontSize).toEqual(undefined); + }); + }); + }); + + describe('Methods', () => { + describe('setIconFontSize', () => { + it('should set element font size', () => { + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + const icon = checkBoxIcon.elementRef.current!; + + checkBoxIcon.setIconFontSize(50); + + expect(icon.style.fontSize).toEqual('50px'); + }); + }); + + describe('getComputedIconSize', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return element computed style width as a number', () => { + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + (getElementComputedStyle as Mock).mockReturnValue({ width: '200px' }); + + expect(checkBoxIcon.getComputedIconSize()).toEqual(200); + }); + + it('should not raise any error if getElementComputedStyle returns null', () => { + const checkBoxIcon = new CheckBoxIcon({}); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + (getElementComputedStyle as Mock).mockReturnValue(null); + + expect(() => { checkBoxIcon.getComputedIconSize(); }).not.toThrow(); + }); + }); + + describe('getIconSize', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('should return size prop if it is a number', () => { + const size = 17; + const checkBoxIcon = new CheckBoxIcon({ size: 17 }); + + expect(checkBoxIcon.getIconSize(size)).toEqual(17); + }); + + it('should return parsed number if size is specified as a pixel string', () => { + const size = '17px'; + const checkBoxIcon = new CheckBoxIcon({ size }); + + expect(checkBoxIcon.getIconSize(size)).toEqual(17); + }); + + it('should return computed style width if size is specified not as a number and not as a pixel string', () => { + const size = '100%'; + const checkBoxIcon = new CheckBoxIcon({ size }); + checkBoxIcon.elementRef = { current: { style: {} } } as RefObject; + (getElementComputedStyle as Mock).mockReturnValue({ width: '100px' }); + + expect(checkBoxIcon.getIconSize(size)).toEqual(100); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + describe('cssStyles', () => { + each([22, '22px']) + .it('should have "22px" width and height is size=%s', (value) => { + const checkBoxIcon = new CheckBoxIcon({ size: value }); + + expect(checkBoxIcon.cssStyles).toMatchObject({ width: '22px', height: '22px' }); + }); + + each(['50%', '1em', 'auto']) + .it('should have %s width and height if it is passed to size prop', (value) => { + const checkBoxIcon = new CheckBoxIcon({ size: value }); + + expect(checkBoxIcon.cssStyles).toMatchObject({ width: value, height: value }); + }); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/utils.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/utils.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d3a05f5d29d39cb63fea2fefb7cc9f370b9baa09 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/__tests__/utils.test.tsx @@ -0,0 +1,69 @@ +import each from 'jest-each'; +import { getDefaultIconSize, getFontSizeByIconSize, getDefaultFontSize } from '../utils'; +import { current } from '../../../../../ui/themes'; + +interface Mock extends jest.Mock {} + +jest.mock('../../../../../ui/themes', () => ({ + ...jest.requireActual('../../../../../ui/themes'), + current: jest.fn(() => 'default'), +})); + +const defaultIconSizes = { + default: 22, + material: 18, + 'default-compact': 16, + 'material-compact': 16, +}; + +const defaultFontSizes = { + true: { + default: 16, + material: 16, + 'default-compact': 10, + 'material-compact': 14, + }, + false: { + default: 12, + material: 20, + 'default-compact': 8, + 'material-compact': 18, + }, +}; + +each(['material', 'default', 'default-compact', 'material-compact']) + .describe('%s theme', (theme) => { + afterEach(() => { jest.resetAllMocks(); }); + + describe('getDefaultIconSize', () => { + it('returns correct default icon size', () => { + (current as Mock).mockReturnValue(theme); + + expect(getDefaultIconSize()).toEqual(defaultIconSizes[theme]); + }); + }); + + each([true, false]) + .describe('isChecked=%s', (isChecked) => { + describe('getDefaultFontSize', () => { + it('returns correct default font size', () => { + (current as Mock).mockReturnValue(theme); + + const resultFontSize = getDefaultFontSize(isChecked); + expect(resultFontSize).toEqual(defaultFontSizes[isChecked][theme]); + }); + }); + + describe('getFontSizeByIconSize', () => { + it('returns correct font size by icon size', () => { + (current as Mock).mockReturnValue(theme); + + const resultFontSize = getFontSizeByIconSize(1, isChecked); + const expectedFontSize = Math.ceil( + defaultFontSizes[isChecked][theme] / defaultIconSizes[theme], + ); + expect(resultFontSize).toEqual(expectedFontSize); + }); + }); + }); + }); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e4868e85c4f5a84babf0fe010a5a56efbb202f45 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box.tsx @@ -0,0 +1,191 @@ +import { + Component, + ComponentBindings, + JSXComponent, + OneWay, + TwoWay, + Ref, + RefObject, + Fragment, + Method, +} from '@devextreme-generator/declarations'; +import { createDefaultOptionRules } from '../../../../core/options/utils'; +import devices from '../../../../core/devices'; +import { Editor, EditorProps } from '../internal/editor'; +import BaseComponent from '../../../component_wrapper/editors/check_box'; +import { combineClasses } from '../../../utils/combine_classes'; +import { CheckBoxIcon } from './check_box_icon'; +import { WidgetProps } from '../../common/widget'; + +const getCssClasses = (model: CheckBoxPropsType): string => { + const { + text, value, + } = model; + + const checked = value; + const indeterminate = checked === null; + + const classesMap = { + 'dx-checkbox': true, + 'dx-checkbox-checked': checked === true, + 'dx-checkbox-has-text': !!text, + 'dx-checkbox-indeterminate': indeterminate, + }; + + return combineClasses(classesMap); +}; + +export const viewFunction = (viewModel: CheckBox): JSX.Element => { + const { + props: { + text, name, value, + validationError, validationErrors, validationMessageMode, isValid, validationStatus, + accessKey, className, hint, tabIndex, rtlEnabled, + activeStateEnabled, hoverStateEnabled, focusStateEnabled, + disabled, readOnly, visible, + width, height, + onFocusIn, + iconSize, + }, + restAttributes, + cssClasses: classes, aria, + onWidgetClick: onClick, keyDown: onKeyDown, + editorRef, + } = viewModel; + + return ( + + + {/* eslint-disable-next-line react/jsx-props-no-spreading */} + +
+ + {text && ({text})} +
+
+
+ ); +}; + +@ComponentBindings() +export class CheckBoxProps extends EditorProps { + @OneWay() text = ''; + + @OneWay() iconSize?: number | string; + + // overrides default value + @OneWay() activeStateEnabled = true; + + @OneWay() hoverStateEnabled = true; + + @TwoWay() value: boolean | null = false; + + // private + @OneWay() saveValueChangeEvent?: (event: Event) => void; +} + +export type CheckBoxPropsType = CheckBoxProps +// eslint-disable-next-line @typescript-eslint/no-type-alias +& Pick; + +export const defaultOptionRules = createDefaultOptionRules([{ + device: (): boolean => devices.real().deviceType === 'desktop' && !devices.isSimulator(), + options: { focusStateEnabled: true }, +}]); + +@Component({ + defaultOptionRules, + jQuery: { + component: BaseComponent, + register: true, + }, + view: viewFunction, +}) + +export class CheckBox extends JSXComponent() { + @Ref() editorRef!: RefObject; + + @Method() + focus(): void { + this.editorRef.current!.focus(); + } + + @Method() + blur(): void { + this.editorRef.current!.blur(); + } + + onWidgetClick(event: Event): void { + const { readOnly, saveValueChangeEvent } = this.props; + const value = this.props.value ?? false; + + if (!readOnly) { + saveValueChangeEvent?.(event); + this.props.value = !value; + } + } + + keyDown(e: { + originalEvent: Event & { cancel: boolean }; + keyName: string; + which: string; + }): Event | undefined { + const { onKeyDown } = this.props; + const { originalEvent, keyName, which } = e; + + const result: Event & { cancel: boolean } = onKeyDown?.(e); + if (result?.cancel) { + return result; + } + + if (keyName === 'space' || which === 'space') { + (originalEvent as Event).preventDefault(); + this.onWidgetClick(originalEvent as Event); + } + + return undefined; + } + + get cssClasses(): string { + return getCssClasses(this.props); + } + + get aria(): Record { + const { value } = this.props; + const checked = value === true; + const indeterminate = value === null; + + const result = { + role: 'checkbox', + checked: indeterminate ? 'mixed' : `${checked}`, + }; + + return { ...result, ...this.props.aria }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box_icon.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box_icon.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8c53a90858856a2543a93a95d3b1862278d49ea9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/check_box_icon.tsx @@ -0,0 +1,77 @@ +import { + Component, ComponentBindings, JSXComponent, Ref, Effect, OneWay, RefObject, +} from '@devextreme-generator/declarations'; +import getElementComputedStyle from '../../../utils/get_computed_style'; +import { hasWindow } from '../../../../core/utils/window'; +import { normalizeStyleProp } from '../../../../core/utils/style'; +import { isNumeric as isNumber } from '../../../../core/utils/type'; +import { getFontSizeByIconSize } from './utils'; + +export const viewFunction = (viewModel: CheckBoxIcon): JSX.Element => { + const { elementRef, cssStyles } = viewModel; + return ( + + ); +}; + +@ComponentBindings() +export class CheckBoxIconProps { + @OneWay() size?: number | string; + + @OneWay() isChecked = false; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class CheckBoxIcon extends JSXComponent(CheckBoxIconProps) { + @Ref() elementRef!: RefObject; + + @Effect() + updateFontSize(): void { + const { size, isChecked } = this.props; + + if (hasWindow() && size) { + const newIconSize = this.getIconSize(size); + const newFontSize = getFontSizeByIconSize(newIconSize, isChecked); + + this.setIconFontSize(newFontSize); + } + } + + setIconFontSize(fontSize: number): void { + const element = this.elementRef.current!; + + element.style.fontSize = `${fontSize}px`; + } + + getIconSize(size: number | string): number { + if (isNumber(size)) { + return size; + } + + if (size.endsWith('px')) { + return parseInt(size, 10); + } + + return this.getComputedIconSize(); + } + + getComputedIconSize(): number { + const element = this.elementRef.current!; + + const iconComputedStyle = getElementComputedStyle(element) as CSSStyleDeclaration; + const computedIconSize = parseInt(iconComputedStyle?.width, 10); + + return computedIconSize; + } + + get cssStyles(): { [key: string]: string | number } { + const { size } = this.props; + const width = normalizeStyleProp('width', size); + const height = normalizeStyleProp('height', size); + + return { height, width }; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/utils.ts b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..0b137c8ad02e7032419be1f144f07b3475b0ad12 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/check_box/utils.ts @@ -0,0 +1,56 @@ +import { isMaterial, isCompact, current } from '../../../../ui/themes'; + +const defaultIconSizes = [ + [22, 16], // default, default-compact + [18, 16], // material, material-compact +]; + +const defaultFontSizes = [ + [ // for not checked checkbox + [12, 8], // default, default-compact + [20, 18], // material, material-compact + ], + [ // for checked checkbox + [16, 10], // default, default-compact + [16, 14], // material, material-compact + ], +]; + +function getThemeType(): { isMaterialTheme: boolean; isCompactTheme: boolean } { + const theme = current(); + + return { + isMaterialTheme: isMaterial(theme), + isCompactTheme: isCompact(theme), + }; +} + +function getDefaultIconSize(): number { + const { isMaterialTheme, isCompactTheme } = getThemeType(); + + return defaultIconSizes[+isMaterialTheme][+isCompactTheme]; +} + +function getDefaultFontSize(isChecked: boolean): number { + const { isMaterialTheme, isCompactTheme } = getThemeType(); + + return defaultFontSizes[+isChecked][+isMaterialTheme][+isCompactTheme]; +} + +function getFontSizeByIconSize( + iconSize: number, + isChecked: boolean, +): number { + const defaultFontSize = getDefaultFontSize(isChecked); + const defaultIconSize = getDefaultIconSize(); + + const fontToIconSizeRatio = defaultFontSize / defaultIconSize; + + return Math.ceil(fontToIconSizeRatio * iconSize); +} + +export { + getDefaultFontSize, + getDefaultIconSize, + getFontSizeByIconSize, +}; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/date_box.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/date_box.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..582b542ffed876b56064c3634c06e65920bfe6ac --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/date_box.test.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import LegacyDateBox from '../../../../../ui/date_box'; +import { viewFunction as DateBoxView, DateBoxProps, DateBox } from '../date_box'; +import { DomComponentWrapper } from '../../../common/dom_component_wrapper'; + +jest.mock('../../../../../ui/date_box', () => jest.fn()); + +describe('DateBox', () => { + describe('View', () => { + it('View render', () => { + const componentProps = new DateBoxProps(); + const props = { + props: componentProps, + restAttributes: { 'rest-attributes': 'true' }, + } as Partial; + const tree = shallow(); + + expect(tree.find(DomComponentWrapper).props()).toMatchObject({ + componentProps, + componentType: LegacyDateBox, + 'rest-attributes': 'true', + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/select_box.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/select_box.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3c392402f659e438eafd82ab398e4bf0f963892a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/__tests__/select_box.test.tsx @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import React from 'react'; +import { shallow } from 'enzyme'; +import LegacySelectBox from '../../../../../ui/select_box'; +import { viewFunction as SelectBoxView, SelectBoxProps, SelectBox } from '../select_box'; +import { DomComponentWrapper } from '../../../common/dom_component_wrapper'; + +jest.mock('../../../../../ui/select_box', () => jest.fn()); + +describe('Selectbox', () => { + it('View render', () => { + const componentProps = new SelectBoxProps(); + const props = { + props: componentProps, + restAttributes: { 'rest-attributes': 'true' }, + } as Partial; + const tree = shallow( as any); + + expect(tree.find(DomComponentWrapper).props()).toMatchObject({ + componentProps, + componentType: LegacySelectBox, + 'rest-attributes': 'true', + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/date_box.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/date_box.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5e44493e5d0ea4e90c0eea32d7ecceb211fe100a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/date_box.tsx @@ -0,0 +1,43 @@ +import { + Component, ComponentBindings, JSXComponent, OneWay, TwoWay, Event, +} from '@devextreme-generator/declarations'; +import LegacyDateBox from '../../../../ui/date_box'; +import { DomComponentWrapper } from '../../common/dom_component_wrapper'; +import { EventCallback } from '../../common/event_callback'; +import { BaseWidgetProps } from '../../common/base_props'; + +export const viewFunction = ({ + props, + restAttributes, +}: DateBox): JSX.Element => ( + +); + +@ComponentBindings() +export class DateBoxProps extends BaseWidgetProps { + @TwoWay() value?: Date | number | string | null = null; + + @Event() valueChange?: EventCallback; + + @OneWay() width?: number | string | (() => number | string); + + @OneWay() calendarOptions?: { + firstDayOfWeek?: number; + }; + + @OneWay() field?: string; + + @OneWay() type?: string ; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class DateBox extends JSXComponent() {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/select_box.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/select_box.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9488281b10273d77686e90dd2fafe8fdd69160e6 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/drop_down_editors/select_box.tsx @@ -0,0 +1,54 @@ +import { + Component, ComponentBindings, JSXComponent, Event, OneWay, TwoWay, +} from '@devextreme-generator/declarations'; +// https://github.com/benmosher/eslint-plugin-import/issues/1699 +/* eslint-disable-next-line import/named */ +import DataSource, { Options as DataSourceOptions } from '../../../../data/data_source'; +import Store from '../../../../data/abstract_store'; +/* eslint-disable-next-line import/named */ +import LegacySelectBox from '../../../../ui/select_box'; +import { DomComponentWrapper } from '../../common/dom_component_wrapper'; +import { EventCallback } from '../../common/event_callback'; +import { BaseWidgetProps } from '../../common/base_props'; + +export const viewFunction = ({ + props, + restAttributes, +}: SelectBox): JSX.Element => ( + +); + +@ComponentBindings() +export class SelectBoxProps extends BaseWidgetProps { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @OneWay() dataSource?: string | (string | any)[] | Store | DataSource | DataSourceOptions; + + @OneWay() displayExpr?: string; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @TwoWay() value?: any = null; + + @OneWay() valueExpr?: string; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @Event() valueChange?: EventCallback; + + @OneWay() focusStateEnabled?: boolean = true; + + @OneWay() hoverStateEnabled?: boolean = true; +} +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class SelectBox extends JSXComponent(SelectBoxProps) {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/__tests__/editor.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/__tests__/editor.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1c04bfffa4e39124d4103b9480beda6b5953a18c --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/__tests__/editor.test.tsx @@ -0,0 +1,318 @@ +/* eslint-disable jest/no-standalone-expect */ +import * as React from 'react'; +import { RefObject } from '@devextreme-generator/declarations'; +import each from 'jest-each'; +import { mount } from 'enzyme'; + +import { Widget } from '../../../common/widget'; +import { Editor, viewFunction } from '../editor'; +import { ValidationMessage } from '../../../overlays/validation_message'; + +jest.mock('../../../overlays/validation_message', () => ({ ValidationMessage: () => null })); + +describe('Editor', () => { + describe('Render', () => { + it('should pass all necessary properties to Widget', () => { + const renderOptions = { + aria: { role: 'aria' }, + }; + const keyDown = (): null => null; + const onWidgetClick = (): null => null; + const renderProps = { + accessKey: 'A', + activeStateEnabled: true, + className: 'name', + disabled: true, + focusStateEnabled: true, + height: 100, + hint: 'hint', + hoverStateEnabled: true, + rtlEnabled: true, + tabIndex: -2, + visible: true, + width: 200, + onClick: onWidgetClick, + onKeyDown: keyDown, + }; + const cssClasses = 'cssClasses'; + const restAttributes = { attr1: 'value1', attr2: 'value2' }; + const checkBox = mount(viewFunction({ + ...renderOptions, + props: renderProps, + restAttributes, + cssClasses, + } as any)); + expect(checkBox.find(Widget).props()).toMatchObject({ + ...renderOptions, + ...renderProps, + ...restAttributes, + classes: cssClasses, + }); + }); + + describe('validation', () => { + it('widget should pass correct props to validationMessage', () => { + const rootElementRef = { current: {} } as RefObject; + + const validationErrors = [{ message: 'error message' }]; + const CustomTree = () => ( +
+ {viewFunction({ + validationMessageTarget: rootElementRef.current, + validationErrors, + props: { + isValid: false, + validationErrors, + validationStatus: 'invalid', + validationMessageMode: 'always', + rtlEnabled: false, + }, + isValidationMessageVisible: true, + } as any)} +
+ ); + const tree = mount(); + + const validationMessage = tree.find(ValidationMessage); + const props = validationMessage.props(); + expect(props.container).toBe(rootElementRef.current); + expect(props.target).toBe(rootElementRef.current); + expect(props.boundary).toBe(rootElementRef.current); + expect(props.positionRequest).toBe('below'); + expect(props.mode).toBe('always'); + expect(props.rtlEnabled).toBe(false); + expect(props.validationErrors).toEqual(validationErrors); + }); + + it('should render ValidationMessage if isValidationMessageVisible=true', () => { + const CustomTree = () => ( +
+ {viewFunction({ + isValidationMessageVisible: true, + props: {}, + } as any)} +
+ ); + const tree = mount(); + + const validationMessage = tree.find(ValidationMessage); + expect(validationMessage.exists()).toBe(true); + }); + + it('should not render ValidationMessage if isValidationMessageVisible=false', () => { + const CustomTree = () => ( +
+ {viewFunction({ + isValidationMessageVisible: false, + props: {}, + } as any)} +
+ ); + const tree = mount(); + + const validationMessage = tree.find(ValidationMessage); + expect(validationMessage.exists()).toBe(false); + }); + }); + }); + + describe('Behavior', () => { + describe('Effects', () => { + describe('updateValidationMessageVisibility', () => { + it('should set isValidationMessageVisible to true if shouldShowValidationMessage is true', () => { + const editor = new Editor({ + isValid: false, + validationError: { message: 'error' }, + }); + + editor.updateValidationMessageVisibility(); + + expect(editor.isValidationMessageVisible).toEqual(true); + }); + + it('should set isValidationMessageVisible to false if shouldShowValidationMessage is false', () => { + const editor = new Editor({}); + + editor.updateValidationMessageVisibility(); + + expect(editor.isValidationMessageVisible).toEqual(false); + }); + }); + }); + + describe('Methods', () => { + describe('focus', () => { + it('should call widget focus method', () => { + const editor = new Editor({}); + editor.widgetRef = { current: { focus: jest.fn() } } as unknown as RefObject; + editor.focus(); + + expect(editor.widgetRef.current?.focus).toHaveBeenCalledTimes(1); + expect(editor.widgetRef.current?.focus).toHaveBeenCalledWith(); + }); + }); + + describe('blur', () => { + it('should call widget blur method', () => { + const editor = new Editor({}); + editor.widgetRef = { current: { blur: jest.fn() } } as unknown as RefObject; + editor.blur(); + + expect(editor.widgetRef.current?.blur).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('Events', () => { + describe('FocusIn', () => { + it('should raise onFocusIn prop event', () => { + const onFocusIn = jest.fn(); + const editor = new Editor({ onFocusIn }); + const event = {} as Event; + + editor.onFocusIn(event); + + expect(onFocusIn).toHaveBeenCalledTimes(1); + }); + + it('should not raise any error if onFocusIn prop is not passed', () => { + const editor = new Editor({}); + const event = {} as Event; + + expect(() => { editor.onFocusIn(event); }).not.toThrow(); + }); + }); + }); + }); + + describe('Logic', () => { + describe('Getters', () => { + describe('validationErrors', () => { + it('should return "validationErrors" props value when it is specified', () => { + const validationErrors = [{ message: 'error message' }]; + expect(new Editor({ validationErrors }).validationErrors) + .toEqual(validationErrors); + }); + + it('returned array should not be reference to a passed array', () => { + const validationErrors = [{ message: 'error message' }]; + expect(new Editor({ validationErrors }).validationErrors) + .not.toBe(validationErrors); + }); + + it('should return array with one element equal to "validationError" props value when "validationErrors" is not specified', () => { + const validationError = { message: 'error message' }; + expect(new Editor({ validationError }).validationErrors) + .toEqual([validationError]); + }); + }); + + describe('cssClasses', () => { + it('should have "dx-invalid" class', () => { + const editor = new Editor({ + isValid: false, + validationError: { message: 'error' }, + validationStatus: 'invalid', + }); + + expect(editor.cssClasses).toContain('dx-invalid'); + }); + + it('should have "dx-state-readonly" class', () => { + const editor = new Editor({ + readOnly: true, + }); + + expect(editor.cssClasses).toContain('dx-state-readonly'); + }); + }); + + describe('aria', () => { + each([true, false]) + .it('should have "readonly=%s if readOnly=%s', (readOnly) => { + expect(new Editor({ readOnly }).aria) + .toMatchObject({ readonly: `${readOnly}` }); + }); + + each([true, false]) + .it('should have "invalid=%s" if isValid=%s', (isValid: boolean) => { + expect(new Editor({ isValid }).aria) + .toMatchObject({ invalid: `${!isValid}` }); + }); + + it('should have "describedBy" equal to validationMessageGuid if shouldShowValidationMessage=true', () => { + const editor = new Editor({ + isValid: false, + validationError: {}, + }); + + editor.validationMessageGuid = 'guid'; + + expect(editor.aria.describedBy).toBe('guid'); + }); + + it('should not have "describedBy" if shouldShowValidationMessage=false', () => { + const editor = new Editor({}); + + expect(editor.aria).not.toHaveProperty('describedBy'); + }); + }); + + describe('shouldShowValidationMessage', () => { + it('should return true when isValid=false, validationStatus="invalid" and there are validation errors', () => { + const editor = new Editor({ + isValid: false, + validationStatus: 'invalid', + validationErrors: [{ message: 'error message' }], + }); + + expect(editor.shouldShowValidationMessage).toBe(true); + }); + + it('should return false if there is no validation errors', () => { + const editor = new Editor({ + isValid: false, + validationStatus: 'invalid', + }); + + expect(editor.shouldShowValidationMessage).toBe(false); + }); + + it('should return false if validationStatus not equal to "invalid" but isValid=false', () => { + const editor = new Editor({ + isValid: false, + validationStatus: 'pending', + validationErrors: [{ message: 'error message' }], + }); + + expect(editor.shouldShowValidationMessage).toBe(true); + }); + + it('should return false if isValid is true but validationStatus="invalid', () => { + const editor = new Editor({ + isValid: true, + validationStatus: 'invalid', + validationErrors: [{ message: 'error message' }], + }); + + expect(editor.shouldShowValidationMessage).toBe(true); + }); + }); + + describe('validationMessageTarget', () => { + it('should return roolElementRef.current', () => { + const editor = new Editor({}); + editor.rootElementRef = { current: {} } as RefObject; + + expect(editor.validationMessageTarget).toEqual(editor.rootElementRef.current); + }); + + it('should not raise any error if rootElementRef is not initialized', () => { + const editor = new Editor({}); + + expect(() => editor.validationMessageTarget).not.toThrow(); + }); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/editor.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/editor.tsx new file mode 100644 index 0000000000000000000000000000000000000000..635596596bcde66421f88452ad9d2b0452ad9a4a --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/internal/editor.tsx @@ -0,0 +1,209 @@ +import { + Component, + ComponentBindings, + JSXComponent, + Method, + OneWay, + TwoWay, + Ref, + Event, + RefObject, + Fragment, + InternalState, + Effect, + ForwardRef, +} from '@devextreme-generator/declarations'; +import Guid from '../../../../core/guid'; +import { Widget, WidgetProps } from '../../common/widget'; +import { BaseWidgetProps } from '../../common/base_props'; +import { combineClasses } from '../../../utils/combine_classes'; +import { ValidationMessage } from '../../overlays/validation_message'; +import EditorWrapperComponent from '../../../component_wrapper/editors/editor'; + +const getCssClasses = (model: EditorPropsType): string => { + const { + readOnly, isValid, classes, + } = model; + + const classesMap = { + 'dx-state-readonly': !!readOnly, + 'dx-invalid': !isValid, + [`${classes}`]: !!classes, + }; + return combineClasses(classesMap); +}; + +export const viewFunction = (viewModel: Editor): JSX.Element => { + const { + props: { + activeStateEnabled, hoverStateEnabled, focusStateEnabled, + className, accessKey, rtlEnabled, hint, tabIndex, + validationMessageMode, + disabled, visible, + width, height, + onClick, onKeyDown, + children, + }, + widgetRef, + aria, cssClasses: classes, + validationErrors, isValidationMessageVisible, validationMessageGuid, validationMessageTarget, + onFocusIn, + restAttributes, + rootElementRef, + } = viewModel; + + return ( + + + {children} + + {isValidationMessageVisible + && ( + + )} + + + ); +}; + +@ComponentBindings() +export class EditorProps extends BaseWidgetProps { + @OneWay() readOnly = false; + + @OneWay() name = ''; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + @TwoWay() value?: any = null; + + // validation + @OneWay() validationError: Record | null = null; + + @OneWay() validationErrors: Record[] | null = null; + + @OneWay() validationMessageMode: 'auto' | 'always' = 'auto'; + + @OneWay() validationStatus: 'valid' | 'invalid' | 'pending' = 'valid'; + + @OneWay() isValid = true; + + // private + @Event() onFocusIn?: (e: Event) => void; +} + +export type EditorPropsType = EditorProps +// eslint-disable-next-line @typescript-eslint/no-type-alias +& Pick; + +@Component({ + jQuery: { + component: EditorWrapperComponent, + register: true, + }, + view: viewFunction, +}) + +export class Editor extends JSXComponent() { + @Ref() widgetRef!: RefObject; + + @InternalState() validationMessageGuid = `dx-${new Guid()}`; + + @ForwardRef() rootElementRef!: RefObject; + + @InternalState() isValidationMessageVisible = false; + + @Effect() updateValidationMessageVisibility(): void { + // NOTE: To improve performance. + // State should not be updated after root element init + // if no necessity to show validation message, but should otherwise + this.isValidationMessageVisible = this.shouldShowValidationMessage; + } + + @Method() + focus(): void { + this.widgetRef.current!.focus(); + } + + @Method() + blur(): void { + this.widgetRef.current!.blur(); + } + + onFocusIn(event: Event): void { + const { onFocusIn } = this.props; + + // NOTE: pass to jQ wrapper + onFocusIn?.(event); + } + + get cssClasses(): string { + return `${getCssClasses(this.props)}`; + } + + get shouldShowValidationMessage(): boolean { + const { isValid, validationStatus } = this.props; + const validationErrors = this.validationErrors ?? []; + const isEditorValid = isValid && validationStatus !== 'invalid'; + + return !isEditorValid + && validationErrors.length > 0; + } + + get aria(): Record { + const { readOnly, isValid } = this.props; + + const result: Record = { + readonly: readOnly ? 'true' : 'false', + invalid: !isValid ? 'true' : 'false', + }; + + if (this.shouldShowValidationMessage) { + result.describedBy = this.validationMessageGuid; + } + + return { ...result, ...this.props.aria }; + } + + get validationErrors(): Record[] | null | undefined { + const { validationErrors, validationError } = this.props; + let allValidationErrors = validationErrors && [...validationErrors]; + + if (!allValidationErrors && validationError) { + allValidationErrors = [{ ...validationError }]; + } + return allValidationErrors; + } + + get validationMessageTarget(): HTMLDivElement | null | undefined { + return this.rootElementRef?.current; + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/number_box.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/number_box.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0752e4f99d10e02f8975496507fe113d275f1883 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/editors/number_box.tsx @@ -0,0 +1,61 @@ +import { + Component, ComponentBindings, JSXComponent, OneWay, Event, TwoWay, React, +} from '@devextreme-generator/declarations'; +/* eslint-disable-next-line import/named */ +import LegacyNumberBox from '../../../ui/number_box'; +import { DomComponentWrapper } from '../common/dom_component_wrapper'; +import { EventCallback } from '../common/event_callback'; +import { BaseWidgetProps } from '../common/base_props'; + +const DEFAULT_VALUE = 0; + +export const viewFunction = ({ + props, + restAttributes, +}: NumberBox): JSX.Element => ( + +); + +@ComponentBindings() +export class NumberBoxProps extends BaseWidgetProps { + // props was copied from js\ui\number_box.d.ts + + // buttons?: Array<'clear' | 'spins' | dxTextEditorButton>; + // format?: format; + @OneWay() invalidValueMessage?: string; + + @OneWay() max?: number; + + @OneWay() min?: number; + + @OneWay() mode?: 'number' | 'text' | 'tel'; + + // Needed only for jQuery. Should be auto-generated + // onValueChanged?: ((e: { component?: T, element?: DxElement, model?: any, + // value?: any, previousValue?: any, event?: event }) => any); + @OneWay() showSpinButtons?: boolean; + + @OneWay() step?: number; + + @OneWay() useLargeSpinButtons?: boolean; + + @TwoWay() value: number | null = DEFAULT_VALUE; + + @Event() valueChange?: EventCallback; + + @OneWay() focusStateEnabled?: boolean = true; + + @OneWay() hoverStateEnabled?: boolean = true; +} + +@Component({ + defaultOptionRules: null, + view: viewFunction, +}) +export class NumberBox extends JSXComponent(NumberBoxProps) {} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/form.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/form.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0fc4be94e127dc5cda65edf546226830b3edd751 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/form.test.tsx @@ -0,0 +1,88 @@ +import { mount } from 'enzyme'; +import React from 'react'; +import each from 'jest-each'; +import { FormProps } from '../form_props'; +import { Form } from '../form'; +import { Scrollable } from '../../scroll_view/scrollable'; +import { LayoutManager } from '../layout_manager'; +import { convertToScreenSizeQualifier } from '../../responsive_box/screen_utils'; +import { extend } from '../../../../core/utils/extend'; + +it('Form > InitialProps', () => { + const props = new FormProps(); + const form = mount(); + + expect(form.props()).toEqual({ + scrollingEnabled: false, + screenByWidth: convertToScreenSizeQualifier, + }); +}); + +describe('Form > Markup', () => { + it('Scrollable is not rendered, if scrollingEnabled = false', () => { + const props = { scrollingEnabled: false } as FormProps; + const form = mount(); + + const scrollable = form.find(Scrollable); + expect(scrollable.exists()).toBe(false); + }); + + it('Scrollable is rendered, if scrollingEnabled = true', () => { + const props = { scrollingEnabled: true } as FormProps; + const form = mount(); + + const scrollable = form.find(Scrollable); + expect(scrollable.exists()).toBe(true); + }); + + each([false, true, undefined, null]).describe('scrollingEnabled: %o', (useNativeScrolling) => { + it('Scrollable params is valid', () => { + const props = { scrollingEnabled: true, useNativeScrolling } as FormProps; + const form = mount(); + + const scrollable = form.find(Scrollable); + expect(scrollable.props()).toEqual(expect.objectContaining({ + aria: { role: 'form' }, + bounceEnabled: false, + classes: 'dx-form', + direction: 'both', + useKeyboard: false, + useNative: !!useNativeScrolling, + useSimulatedScrollbar: !useNativeScrolling, + })); + }); + }); + + each([false, true]).describe('scrollingEnabled: %o', (scrollingEnabled) => { + each([false, true, undefined, null]).describe('useNativeScrolling: %o', (useNativeScrolling) => { + it('root layoutManager is rendered', () => { + const props = extend(new FormProps(), { scrollingEnabled, useNativeScrolling }); + const form = mount(); + + const layoutManager = form.find(LayoutManager); + expect(layoutManager.exists()).toEqual(true); + expect(layoutManager.props()).toEqual({ + screenByWidth: convertToScreenSizeQualifier, + }); + }); + }); + }); +}); + +describe('Form > Attrs', () => { + each([false, true]).describe('scrollingEnabled: %o', (scrollingEnabled) => { + describe('cssClasses', () => { + it('Check has dx-form class', () => { + const form = mount(); + expect(form.getDOMNode().classList.contains('dx-form')).toEqual(true); + }); + }); + + describe('aria', () => { + it('Check has form role', () => { + const form = mount(); + expect(form.getDOMNode().getAttribute('role')).toEqual('form'); + }); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/layout_manager.test.tsx b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/layout_manager.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cfa0bb7dba92ee8003588d630cc7bf1b1f890a81 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/__tests__/layout_manager.test.tsx @@ -0,0 +1,38 @@ +import { mount } from 'enzyme'; +import React from 'react'; +import { LayoutManager } from '../layout_manager'; +import { LayoutManagerProps } from '../layout_manager_props'; +import { ResponsiveBox } from '../../responsive_box/responsive_box'; + +describe('LayoutManager', () => { + it('InitialProps', () => { + const props = new LayoutManagerProps(); + const layoutManager = mount(); + + expect(layoutManager.props()).toEqual({ + screenByWidth: undefined, + }); + }); +}); + +describe('LayoutManager > Markup', () => { + it('ResponsiveBox is rendered', () => { + const props = new LayoutManagerProps(); + const layoutManager = mount(); + + const responsiveBox = layoutManager.find(ResponsiveBox); + expect(responsiveBox.exists()).toBe(true); + expect(responsiveBox.props()).toEqual({ + screenByWidth: undefined, + }); + }); +}); + +describe('LayoutManager > Getters', () => { + describe('cssClasses', () => { + it('Check has dx-layout-manager class', () => { + const layoutManager = new LayoutManager({}); + expect(layoutManager.cssClasses).toEqual(expect.stringMatching('dx-layout-manager')); + }); + }); +}); diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/constants.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/constants.js new file mode 100644 index 0000000000000000000000000000000000000000..2f4e77eeb8bd8ddb115dd538b1bde9e778750506 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/constants.js @@ -0,0 +1,37 @@ +export const FORM_CLASS = 'dx-form'; +export const FORM_GROUP_CLASS = 'dx-form-group'; +export const FORM_GROUP_CAPTION_CLASS = 'dx-form-group-caption'; +export const FORM_FIELD_ITEM_COL_CLASS = 'dx-col-'; +export const FIELD_ITEM_CLASS = 'dx-field-item'; +export const FLEX_LAYOUT_CLASS = 'dx-flex-layout'; +export const LAYOUT_MANAGER_ONE_COLUMN = 'dx-layout-manager-one-col'; +export const FIELD_ITEM_OPTIONAL_MARK_CLASS = 'dx-field-item-optional-mark'; +export const FIELD_ITEM_REQUIRED_MARK_CLASS = 'dx-field-item-required-mark'; +export const FIELD_ITEM_OPTIONAL_CLASS = 'dx-field-item-optional'; +export const FIELD_ITEM_REQUIRED_CLASS = 'dx-field-item-required'; +export const FIELD_ITEM_LABEL_TEXT_CLASS = 'dx-field-item-label-text'; +export const FIELD_ITEM_LABEL_CONTENT_CLASS = 'dx-field-item-label-content'; +export const FIELD_ITEM_HELP_TEXT_CLASS = 'dx-field-item-help-text'; +export const FIELD_ITEM_CONTENT_WRAPPER_CLASS = 'dx-field-item-content-wrapper'; +export const FORM_LAYOUT_MANAGER_CLASS = 'dx-layout-manager'; +export const LABEL_VERTICAL_ALIGNMENT_CLASS = 'dx-label-v-align'; +export const LABEL_HORIZONTAL_ALIGNMENT_CLASS = 'dx-label-h-align'; +export const FIELD_ITEM_LABEL_LOCATION_CLASS = 'dx-field-item-label-location-'; +export const FIELD_ITEM_LABEL_ALIGN_CLASS = 'dx-field-item-label-align'; +export const FIELD_ITEM_LABEL_CLASS = 'dx-field-item-label'; +export const FIELD_ITEM_CONTENT_LOCATION_CLASS = 'dx-field-item-content-location-'; +export const FIELD_ITEM_CONTENT_CLASS = 'dx-field-item-content'; +export const FIELD_EMPTY_ITEM_CLASS = 'dx-field-empty-item'; +export const FIELD_BUTTON_ITEM_CLASS = 'dx-field-button-item'; +export const SINGLE_COLUMN_ITEM_CONTENT = 'dx-single-column-item-content'; +export const ROOT_SIMPLE_ITEM_CLASS = 'dx-root-simple-item'; +export const FORM_GROUP_CONTENT_CLASS = 'dx-form-group-content'; +export const FIELD_ITEM_CONTENT_HAS_GROUP_CLASS = 'dx-field-item-has-group'; +export const FIELD_ITEM_CONTENT_HAS_TABS_CLASS = 'dx-field-item-has-tabs'; +export const FORM_GROUP_WITH_CAPTION_CLASS = 'dx-form-group-with-caption'; +export const HIDDEN_LABEL_CLASS = 'dx-layout-manager-hidden-label'; +export const FIELD_ITEM_TAB_CLASS = 'dx-field-item-tab'; +export const GROUP_COL_COUNT_CLASS = 'dx-group-colcount-'; +export const GROUP_COL_COUNT_ATTR = 'group-col-count'; +export const FORM_VALIDATION_SUMMARY = 'dx-form-validation-summary'; + diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_option_action.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_option_action.js new file mode 100644 index 0000000000000000000000000000000000000000..9aa9e85816d3a6a7946c3e48c82c5995cdb14943 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_option_action.js @@ -0,0 +1,20 @@ +import Class from '../../core/class'; + +export default class ItemOptionAction { + constructor(options) { + this._options = options; + this._itemsRunTimeInfo = this._options.itemsRunTimeInfo; + } + + findInstance() { + return this._itemsRunTimeInfo.findWidgetInstanceByItem(this._options.item); + } + + findItemContainer() { + return this._itemsRunTimeInfo.findItemContainerByItem(this._options.item); + } + + tryExecute() { + Class.abstract(); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_options_actions.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_options_actions.js new file mode 100644 index 0000000000000000000000000000000000000000..7092e07fb4a03a051329eb9cd13f8fc620d6aaf5 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.item_options_actions.js @@ -0,0 +1,98 @@ +import ItemOptionAction from './ui.form.item_option_action'; +import { data } from '../../core/element_data'; +import { extend } from '../../core/utils/extend'; +import { getFullOptionName } from './ui.form.utils'; + +class WidgetOptionItemOptionAction extends ItemOptionAction { + tryExecute() { + const { value } = this._options; + const instance = this.findInstance(); + if(instance) { + instance.option(value); + return true; + } + return false; + } +} + +class TabOptionItemOptionAction extends ItemOptionAction { + tryExecute() { + const tabPanel = this.findInstance(); + if(tabPanel) { + const { optionName, item, value } = this._options; + const itemIndex = this._itemsRunTimeInfo.findItemIndexByItem(item); + if(itemIndex >= 0) { + tabPanel.option(getFullOptionName(`items[${itemIndex}]`, optionName), value); + return true; + } + } + return false; + } +} + +class TabsOptionItemOptionAction extends ItemOptionAction { + tryExecute() { + const tabPanel = this.findInstance(); + if(tabPanel) { + const { value } = this._options; + tabPanel.option('dataSource', value); + return true; + } + return false; + } +} + +class ValidationRulesItemOptionAction extends ItemOptionAction { + tryExecute() { + const { item } = this._options; + const instance = this.findInstance(); + const validator = instance && data(instance.$element()[0], 'dxValidator'); + if(validator && item) { + const filterRequired = item => item.type === 'required'; + const oldContainsRequired = (validator.option('validationRules') || []).some(filterRequired); + const newContainsRequired = (item.validationRules || []).some(filterRequired); + if(!oldContainsRequired && !newContainsRequired || oldContainsRequired && newContainsRequired) { + validator.option('validationRules', item.validationRules); + return true; + } + } + return false; + } +} + +class CssClassItemOptionAction extends ItemOptionAction { + tryExecute() { + const $itemContainer = this.findItemContainer(); + const { previousValue, value } = this._options; + if($itemContainer) { + $itemContainer.removeClass(previousValue).addClass(value); + return true; + } + return false; + } +} + +const tryCreateItemOptionAction = (optionName, itemActionOptions) => { + switch(optionName) { + case 'editorOptions': + case 'buttonOptions': + return new WidgetOptionItemOptionAction(itemActionOptions); + case 'validationRules': + return new ValidationRulesItemOptionAction(itemActionOptions); + case 'cssClass': + return new CssClassItemOptionAction(itemActionOptions); + case 'badge': + case 'disabled': + case 'icon': + case 'template': + case 'tabTemplate': + case 'title': + return new TabOptionItemOptionAction(extend(itemActionOptions, { optionName })); + case 'tabs': + return new TabsOptionItemOptionAction(itemActionOptions); + default: + return null; + } +}; + +export default tryCreateItemOptionAction; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.items_runtime_info.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.items_runtime_info.js new file mode 100644 index 0000000000000000000000000000000000000000..0e8129284c67d16e2c1195c5a5cef47ccf26dde9 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.items_runtime_info.js @@ -0,0 +1,126 @@ +import Guid from '../../core/guid'; +import { each } from '../../core/utils/iterator'; +import { extend } from '../../core/utils/extend'; +import { isString } from '../../core/utils/type'; + +export default class FormItemsRunTimeInfo { + constructor() { + this._map = {}; + } + + _findWidgetInstance(condition) { + let result; + + each(this._map, function(guid, { widgetInstance, item }) { + if(condition(item)) { + result = widgetInstance; + + return false; + } + }); + + return result; + } + + _findFieldByCondition(callback, valueExpr) { + let result; + each(this._map, function(key, value) { + if(callback(value)) { + result = valueExpr === 'guid' ? key : value[valueExpr]; + return false; + } + }); + return result; + } + + clear() { + this._map = {}; + } + + removeItemsByItems(itemsRunTimeInfo) { + each(itemsRunTimeInfo.getItems(), guid => this.removeItemByKey(guid)); + } + + removeItemByKey(key) { + delete this._map[key]; + } + + add(options) { + const key = options.guid || new Guid(); + this._map[key] = options; + return key; + } + + addItemsOrExtendFrom(itemsRunTimeInfo) { + itemsRunTimeInfo.each((key, itemRunTimeInfo) => { + if(this._map[key]) { + if(itemRunTimeInfo.widgetInstance) { + this._map[key].widgetInstance = itemRunTimeInfo.widgetInstance; + } + this._map[key].$itemContainer = itemRunTimeInfo.$itemContainer; + } else { + this.add({ + item: itemRunTimeInfo.item, + widgetInstance: itemRunTimeInfo.widgetInstance, + guid: key, + $itemContainer: itemRunTimeInfo.$itemContainer + }); + } + }); + } + + extendRunTimeItemInfoByKey(key, options) { + if(this._map[key]) { + this._map[key] = extend(this._map[key], options); + } + } + + findWidgetInstanceByItem(item) { + return this._findWidgetInstance(storedItem => storedItem === item); + } + + getGroupOrTabLayoutManagerByPath(targetPath) { + return this._findFieldByCondition(({ path }) => path === targetPath, 'layoutManager'); + } + + getKeyByPath(targetPath) { + return this._findFieldByCondition(({ path }) => path === targetPath, 'guid'); + } + + findWidgetInstanceByName(name) { + return this._findWidgetInstance(item => name === item.name); + } + + findWidgetInstanceByDataField(dataField) { + return this._findWidgetInstance(item => dataField === (isString(item) ? item : item.dataField)); + } + + findItemContainerByItem(item) { + for(const key in this._map) { + if(this._map[key].item === item) { + return this._map[key].$itemContainer; + } + } + return null; + } + + findItemIndexByItem(targetItem) { + return this._findFieldByCondition(({ item }) => item === targetItem, 'itemIndex'); + } + + getItems() { + return this._map; + } + + each(handler) { + each(this._map, function(key, itemRunTimeInfo) { + handler(key, itemRunTimeInfo); + }); + } + + removeItemsByPathStartWith(path) { + const keys = Object.keys(this._map); + const filteredKeys = keys.filter(key => this._map[key].path.indexOf(path, 0) > -1); + filteredKeys.forEach(key => this.removeItemByKey(key)); + } +} diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.js new file mode 100644 index 0000000000000000000000000000000000000000..11c21fbe31147fa0fbc10ed14d86ff68cc9e8b94 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.js @@ -0,0 +1,1268 @@ +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +import registerComponent from '../../core/component_registrator'; +import Guid from '../../core/guid'; +import { ensureDefined } from '../../core/utils/common'; +import { isDefined, isEmptyObject, isObject, isString } from '../../core/utils/type'; +import { each } from '../../core/utils/iterator'; +import { inArray } from '../../core/utils/array'; +import { extend } from '../../core/utils/extend'; +import { isEmpty } from '../../core/utils/string'; +import { triggerResizeEvent, triggerShownEvent } from '../../events/visibility_change'; +import { getPublicElement } from '../../core/element'; +import messageLocalization from '../../localization/message'; +import Widget from '../widget/ui.widget'; +import Editor from '../editor/editor'; +import { getCurrentScreenFactor, hasWindow } from '../../core/utils/window'; +import ValidationEngine from '../validation_engine'; +import { default as FormItemsRunTimeInfo } from './ui.form.items_runtime_info'; +import TabPanel from '../tab_panel'; +import { Deferred } from '../../core/utils/deferred'; +import { isMaterial } from '../themes'; +import tryCreateItemOptionAction from './ui.form.item_options_actions'; +import './ui.form.layout_manager'; +import { + concatPaths, + createItemPathByIndex, + getFullOptionName, + getOptionNameFromFullName, + tryGetTabPath, + getTextWithoutSpaces, + isExpectedItem, + isFullPathContainsTabs, + getItemPath +} from './ui.form.utils'; + +import '../validation_summary'; +import '../validation_group'; + +// STYLE form + +import { + FIELD_ITEM_CLASS, + FIELD_ITEM_LABEL_TEXT_CLASS, + FORM_GROUP_CLASS, + FORM_GROUP_CONTENT_CLASS, + FIELD_ITEM_CONTENT_HAS_GROUP_CLASS, + FIELD_ITEM_CONTENT_HAS_TABS_CLASS, + FORM_GROUP_WITH_CAPTION_CLASS, + FORM_GROUP_CAPTION_CLASS, + HIDDEN_LABEL_CLASS, + FIELD_ITEM_LABEL_CLASS, + FIELD_ITEM_LABEL_CONTENT_CLASS, + FIELD_ITEM_TAB_CLASS, + FORM_FIELD_ITEM_COL_CLASS, + GROUP_COL_COUNT_CLASS, + GROUP_COL_COUNT_ATTR, + FIELD_ITEM_CONTENT_CLASS, + FORM_VALIDATION_SUMMARY, + ROOT_SIMPLE_ITEM_CLASS } from './constants'; + +import { TOOLBAR_CLASS } from '../toolbar/constants'; + +const WIDGET_CLASS = 'dx-widget'; +const FOCUSED_STATE_CLASS = 'dx-state-focused'; + +const ITEM_OPTIONS_FOR_VALIDATION_UPDATING = ['items', 'isRequired', 'validationRules', 'visible']; + +const Form = Widget.inherit({ + _init: function() { + this.callBase(); + + this._cachedColCountOptions = []; + this._itemsRunTimeInfo = new FormItemsRunTimeInfo(); + this._groupsColCount = []; + + this._attachSyncSubscriptions(); + }, + + _getDefaultOptions: function() { + return extend(this.callBase(), { + formID: 'dx-' + new Guid(), + formData: {}, + colCount: 1, + + /** + * _pseudo ColCountResponsibleType + * _type object + */ + colCountByScreen: undefined, + + labelLocation: 'left', + readOnly: false, + onFieldDataChanged: null, + customizeItem: null, + onEditorEnterKey: null, + minColWidth: 200, + alignItemLabels: true, + alignItemLabelsInAllGroups: true, + alignRootItemLabels: true, + showColonAfterLabel: true, + showRequiredMark: true, + showOptionalMark: false, + requiredMark: '*', + optionalMark: messageLocalization.format('dxForm-optionalMark'), + requiredMessage: messageLocalization.getFormatter('dxForm-requiredMessage'), + showValidationSummary: false, + items: undefined, + scrollingEnabled: false, + validationGroup: undefined, + stylingMode: undefined + }); + }, + + _defaultOptionsRules: function() { + return this.callBase().concat([ + { + device: function() { + return isMaterial(); + }, + options: { + showColonAfterLabel: false, + labelLocation: 'top' + } + } + ]); + }, + + _setOptionsByReference: function() { + this.callBase(); + + extend(this._optionsByReference, { + formData: true, + validationGroup: true + }); + }, + + _getGroupColCount: function($element) { + return parseInt($element.attr(GROUP_COL_COUNT_ATTR)); + }, + + _createHiddenElement: function(rootLayoutManager) { + this._$hiddenElement = $('
') + .addClass(WIDGET_CLASS) + .addClass(HIDDEN_LABEL_CLASS) + .appendTo('body'); + + const $hiddenLabel = rootLayoutManager._renderLabel({ + text: ' ', + location: this._labelLocation() + }).appendTo(this._$hiddenElement); + + this._hiddenLabelText = $hiddenLabel.find('.' + FIELD_ITEM_LABEL_TEXT_CLASS)[0]; + }, + + _removeHiddenElement: function() { + this._$hiddenElement.remove(); + this._hiddenLabelText = null; + }, + + _getLabelWidthByText: function(text) { + // this code has slow performance + this._hiddenLabelText.innerHTML = text; + return this._hiddenLabelText.offsetWidth; + }, + + _getLabelsSelectorByCol: function(index, options) { + options = options || {}; + + const fieldItemClass = options.inOneColumn ? FIELD_ITEM_CLASS : FORM_FIELD_ITEM_COL_CLASS + index; + const cssExcludeTabbedSelector = options.excludeTabbed ? ':not(.' + FIELD_ITEM_TAB_CLASS + ')' : ''; + const childLabelContentSelector = '> .' + FIELD_ITEM_LABEL_CLASS + ' > .' + FIELD_ITEM_LABEL_CONTENT_CLASS; + + return '.' + fieldItemClass + cssExcludeTabbedSelector + childLabelContentSelector; + }, + + _getLabelText: function(labelText) { + const length = labelText.children.length; + let child; + let result = ''; + let i; + + for(i = 0; i < length; i++) { + child = labelText.children[i]; + result = result + (!isEmpty(child.innerText) ? child.innerText : child.innerHTML); + } + + return result; + }, + + _applyLabelsWidthByCol: function($container, index, options) { + const $labelTexts = $container.find(this._getLabelsSelectorByCol(index, options)); + const $labelTextsLength = $labelTexts.length; + let labelWidth; + let i; + let maxWidth = 0; + + for(i = 0; i < $labelTextsLength; i++) { + labelWidth = this._getLabelWidthByText(this._getLabelText($labelTexts[i])); + if(labelWidth > maxWidth) { + maxWidth = labelWidth; + } + } + for(i = 0; i < $labelTextsLength; i++) { + $labelTexts[i].style.width = maxWidth + 'px'; + } + }, + + _applyLabelsWidth: function($container, excludeTabbed, inOneColumn, colCount) { + colCount = inOneColumn ? 1 : colCount || this._getGroupColCount($container); + const applyLabelsOptions = { + excludeTabbed: excludeTabbed, + inOneColumn: inOneColumn + }; + let i; + + for(i = 0; i < colCount; i++) { + this._applyLabelsWidthByCol($container, i, applyLabelsOptions); + } + }, + + _getGroupElementsInColumn: function($container, columnIndex, colCount) { + const cssColCountSelector = isDefined(colCount) ? '.' + GROUP_COL_COUNT_CLASS + colCount : ''; + const groupSelector = '.' + FORM_FIELD_ITEM_COL_CLASS + columnIndex + ' > .' + FIELD_ITEM_CONTENT_CLASS + ' > .' + FORM_GROUP_CLASS + cssColCountSelector; + + return $container.find(groupSelector); + }, + + _applyLabelsWidthWithGroups: function($container, colCount, excludeTabbed) { + if(this.option('alignRootItemLabels') === true) { + this._alignRootSimpleItems($container, colCount, excludeTabbed); + } + + const alignItemLabelsInAllGroups = this.option('alignItemLabelsInAllGroups'); + if(alignItemLabelsInAllGroups) { + this._applyLabelsWidthWithNestedGroups($container, colCount, excludeTabbed); + } else { + const $groups = this.$element().find('.' + FORM_GROUP_CLASS); + let i; + for(i = 0; i < $groups.length; i++) { + this._applyLabelsWidth($groups.eq(i), excludeTabbed); + } + } + }, + + _alignRootSimpleItems: function($container, colCount, excludeTabbed) { + const $rootSimpleItems = $container.find(`.${ROOT_SIMPLE_ITEM_CLASS}`); + for(let colIndex = 0; colIndex < colCount; colIndex++) { + this._applyLabelsWidthByCol($rootSimpleItems, colIndex, excludeTabbed); + } + }, + + _applyLabelsWidthWithNestedGroups: function($container, colCount, excludeTabbed) { + const applyLabelsOptions = { excludeTabbed: excludeTabbed }; + let colIndex; + let groupsColIndex; + let groupColIndex; + let $groupsByCol; + + for(colIndex = 0; colIndex < colCount; colIndex++) { + $groupsByCol = this._getGroupElementsInColumn($container, colIndex); + this._applyLabelsWidthByCol($groupsByCol, 0, applyLabelsOptions); + + for(groupsColIndex = 0; groupsColIndex < this._groupsColCount.length; groupsColIndex++) { + $groupsByCol = this._getGroupElementsInColumn($container, colIndex, this._groupsColCount[groupsColIndex]); + const groupColCount = this._getGroupColCount($groupsByCol); + + for(groupColIndex = 1; groupColIndex < groupColCount; groupColIndex++) { + this._applyLabelsWidthByCol($groupsByCol, groupColIndex, applyLabelsOptions); + } + } + } + }, + + _labelLocation: function() { + return this.option('labelLocation'); + }, + + _alignLabelsInColumn: function({ layoutManager, inOneColumn, $container, excludeTabbed, items }) { + if(!hasWindow() || this._labelLocation() === 'top') { + return; + } + + this._createHiddenElement(layoutManager); + if(inOneColumn) { + this._applyLabelsWidth($container, excludeTabbed, true); + } else { + if(this._checkGrouping(items)) { + this._applyLabelsWidthWithGroups($container, layoutManager._getColCount(), excludeTabbed); + } else { + this._applyLabelsWidth($container, excludeTabbed, false, layoutManager._getColCount()); + } + } + this._removeHiddenElement(); + }, + + _prepareFormData: function() { + if(!isDefined(this.option('formData'))) { + this.option('formData', {}); + } + }, + + _initMarkup: function() { + ValidationEngine.addGroup(this._getValidationGroup()); + this._clearCachedInstances(); + this._prepareFormData(); + + this.callBase(); + + this._renderLayout(); + this._renderValidationSummary(); + + this._lastMarkupScreenFactor = this._targetScreenFactor || this._getCurrentScreenFactor(); + }, + + _getCurrentScreenFactor: function() { + return hasWindow() ? getCurrentScreenFactor(this.option('screenByWidth')) : 'lg'; + }, + + _clearCachedInstances: function() { + this._itemsRunTimeInfo.clear(); + this._cachedLayoutManagers = []; + }, + + _alignLabels: function(layoutManager, inOneColumn) { + this._alignLabelsInColumn({ + $container: this.$element(), + layoutManager, + excludeTabbed: true, + items: this.option('items'), + inOneColumn + }); + + triggerResizeEvent(this.$element().find(`.${TOOLBAR_CLASS}`)); + }, + + _clean: function() { + this.callBase(); + this._groupsColCount = []; + this._cachedColCountOptions = []; + this._lastMarkupScreenFactor = undefined; + }, + + _getContent: function() { + return this.option('scrollingEnabled') ? this._scrollable.$content() : this.$element(); + }, + + _renderValidationSummary: function() { + const $validationSummary = this.$element().find('.' + FORM_VALIDATION_SUMMARY); + + if($validationSummary.length > 0) { + $validationSummary.remove(); + } + + if(this.option('showValidationSummary')) { + const $validationSummary = $('
') + .addClass(FORM_VALIDATION_SUMMARY) + .appendTo(this._getContent()); + + this._validationSummary = $validationSummary.dxValidationSummary({ + validationGroup: this._getValidationGroup() + }).dxValidationSummary('instance'); + } + }, + + _prepareItems(items, parentIsTabbedItem, currentPath, isTabs) { + if(items) { + const result = []; + for(let i = 0; i < items.length; i++) { + let item = items[i]; + const path = concatPaths(currentPath, createItemPathByIndex(i, isTabs)); + const guid = this._itemsRunTimeInfo.add({ item, itemIndex: i, path }); + + if(isString(item)) { + item = { dataField: item }; + } + + if(isObject(item)) { + const itemCopy = extend({}, item); + itemCopy.guid = guid; + this._tryPrepareGroupItem(itemCopy); + this._tryPrepareTabbedItem(itemCopy, path); + this._tryPrepareItemTemplate(itemCopy); + + if(parentIsTabbedItem) { + itemCopy.cssItemClass = FIELD_ITEM_TAB_CLASS; + } + + if(itemCopy.items) { + itemCopy.items = this._prepareItems(itemCopy.items, parentIsTabbedItem, path); + } + result.push(itemCopy); + } else { + result.push(item); + } + } + + return result; + } + }, + + _tryPrepareGroupItem: function(item) { + if(item.itemType === 'group') { + item.alignItemLabels = ensureDefined(item.alignItemLabels, true); + + if(item.template) { + item.groupContentTemplate = this._getTemplate(item.template); + } + + item.template = this._itemGroupTemplate.bind(this, item); + } + }, + + _tryPrepareTabbedItem: function(item, path) { + if(item.itemType === 'tabbed') { + item.template = this._itemTabbedTemplate.bind(this, item); + item.tabs = this._prepareItems(item.tabs, true, path, true); + } + }, + + _tryPrepareItemTemplate: function(item) { + if(item.template) { + item.template = this._getTemplate(item.template); + } + }, + + _checkGrouping: function(items) { + if(items) { + for(let i = 0; i < items.length; i++) { + const item = items[i]; + if(item.itemType === 'group') { + return true; + } + } + } + }, + + _renderLayout: function() { + const that = this; + let items = that.option('items'); + + items = that._prepareItems(items); + + //#DEBUG + that._testResultItems = items; + //#ENDDEBUG + + that._rootLayoutManager = that._renderLayoutManager(items, { + isRoot: true, + colCount: that.option('colCount'), + alignItemLabels: that.option('alignItemLabels'), + colCountByScreen: this.option('colCountByScreen'), + onLayoutChanged: function(inOneColumn) { + that._alignLabels.bind(that)(that._rootLayoutManager, inOneColumn); + }, + onContentReady: function(e) { + that._alignLabels(e.component, e.component.isSingleColumnMode()); + } + }); + }, + + _tryGetItemsForTemplate: function(item) { + return item.items || []; + }, + + _itemTabbedTemplate: function(item, e, $container) { + const $tabPanel = $('
').appendTo($container); + const tabPanelOptions = extend({}, item.tabPanelOptions, { + dataSource: item.tabs, + onItemRendered: args => triggerShownEvent(args.itemElement), + itemTemplate: (itemData, e, container) => { + const $container = $(container); + const alignItemLabels = ensureDefined(itemData.alignItemLabels, true); + const layoutManager = this._renderLayoutManager(this._tryGetItemsForTemplate(itemData), $container, { + colCount: itemData.colCount, + alignItemLabels: alignItemLabels, + screenByWidth: this.option('screenByWidth'), + colCountByScreen: itemData.colCountByScreen, + cssItemClass: itemData.cssItemClass, + onLayoutChanged: inOneColumn => { + this._alignLabelsInColumn({ + $container, + layoutManager, + items: itemData.items, + inOneColumn + }); + } + }); + + if(this._itemsRunTimeInfo) { + this._itemsRunTimeInfo.extendRunTimeItemInfoByKey(itemData.guid, { layoutManager }); + } + + if(alignItemLabels) { + this._alignLabelsInColumn({ + $container, + layoutManager, + items: itemData.items, + inOneColumn: layoutManager.isSingleColumnMode() + }); + } + } + }); + const tryUpdateTabPanelInstance = (items, instance) => { + if(Array.isArray(items)) { + items.forEach(item => this._itemsRunTimeInfo.extendRunTimeItemInfoByKey(item.guid, { + widgetInstance: instance + })); + } + }; + const tabPanel = this._createComponent($tabPanel, TabPanel, tabPanelOptions); + + $($container).parent().addClass(FIELD_ITEM_CONTENT_HAS_TABS_CLASS); + + tabPanel.on('optionChanged', e => { + if(e.fullName === 'dataSource') { + tryUpdateTabPanelInstance(e.value, e.component); + } + }); + + tryUpdateTabPanelInstance([{ guid: item.guid }, ...item.tabs], tabPanel); + }, + + _itemGroupTemplate: function(item, e, $container) { + const $group = $('
') + .toggleClass(FORM_GROUP_WITH_CAPTION_CLASS, isDefined(item.caption) && item.caption.length) + .addClass(FORM_GROUP_CLASS) + .appendTo($container); + + $($container).parent().addClass(FIELD_ITEM_CONTENT_HAS_GROUP_CLASS); + + let colCount; + let layoutManager; + + if(item.caption) { + $('') + .addClass(FORM_GROUP_CAPTION_CLASS) + .text(item.caption) + .appendTo($group); + } + + const $groupContent = $('
') + .addClass(FORM_GROUP_CONTENT_CLASS) + .appendTo($group); + + if(item.groupContentTemplate) { + const data = { + formData: this.option('formData'), + component: this + }; + item.groupContentTemplate.render({ + model: data, + container: getPublicElement($groupContent) + }); + } else { + layoutManager = this._renderLayoutManager(this._tryGetItemsForTemplate(item), $groupContent, { + colCount: item.colCount, + colCountByScreen: item.colCountByScreen, + alignItemLabels: item.alignItemLabels, + cssItemClass: item.cssItemClass + }); + + this._itemsRunTimeInfo && this._itemsRunTimeInfo.extendRunTimeItemInfoByKey(item.guid, { layoutManager }); + + colCount = layoutManager._getColCount(); + if(inArray(colCount, this._groupsColCount) === -1) { + this._groupsColCount.push(colCount); + } + $group.addClass(GROUP_COL_COUNT_CLASS + colCount); + $group.attr(GROUP_COL_COUNT_ATTR, colCount); + } + }, + + _renderLayoutManager: function(items, $rootElement, options) { + const that = this; + const config = that._getLayoutManagerConfig(items, options); + const baseColCountByScreen = { + lg: options.colCount, + md: options.colCount, + sm: options.colCount, + xs: 1 + }; + + that._cachedColCountOptions.push({ colCountByScreen: extend(baseColCountByScreen, options.colCountByScreen) }); + + const instance = that._createComponent('dxLayoutManager', config); + instance.on('autoColCountChanged', function() { that._refresh(); }); + that._cachedLayoutManagers.push(instance); + return instance; + }, + + _getValidationGroup: function() { + return this.option('validationGroup') || this; + }, + + _getLayoutManagerConfig: function(items, options) { + const baseConfig = { + form: this, + isRoot: options.isRoot, + validationGroup: this._getValidationGroup(), + showRequiredMark: this.option('showRequiredMark'), + showOptionalMark: this.option('showOptionalMark'), + requiredMark: this.option('requiredMark'), + optionalMark: this.option('optionalMark'), + requiredMessage: this.option('requiredMessage'), + screenByWidth: this.option('screenByWidth'), + layoutData: this.option('formData'), + labelLocation: this.option('labelLocation'), + customizeItem: this.option('customizeItem'), + minColWidth: this.option('minColWidth'), + showColonAfterLabel: this.option('showColonAfterLabel'), + onEditorEnterKey: this.option('onEditorEnterKey'), + onFieldDataChanged: args => { + if(!this._isDataUpdating) { + this._triggerOnFieldDataChanged(args); + } + }, + validationBoundary: this.option('scrollingEnabled') ? this.$element() : undefined + }; + + return extend(baseConfig, { + items: items, + onContentReady: args => { + this._itemsRunTimeInfo.addItemsOrExtendFrom(args.component._itemsRunTimeInfo); + options.onContentReady && options.onContentReady(args); + }, + onDisposing: ({ component }) => { + const nestedItemsRunTimeInfo = component.getItemsRunTimeInfo(); + this._itemsRunTimeInfo.removeItemsByItems(nestedItemsRunTimeInfo); + }, + colCount: options.colCount, + alignItemLabels: options.alignItemLabels, + cssItemClass: options.cssItemClass, + colCountByScreen: options.colCountByScreen, + onLayoutChanged: options.onLayoutChanged, + width: options.width + }); + }, + + _createComponent: function($element, type, config) { + const that = this; + config = config || {}; + + that._extendConfig(config, { + readOnly: that.option('readOnly') + }); + + return that.callBase($element, type, config); + }, + + _attachSyncSubscriptions: function() { + const that = this; + + that.on('optionChanged', function(args) { + const optionFullName = args.fullName; + + if(optionFullName === 'formData') { + if(!isDefined(args.value)) { + that._options.silent('formData', args.value = {}); + } + + that._triggerOnFieldDataChangedByDataSet(args.value); + } + + if(that._cachedLayoutManagers.length) { + each(that._cachedLayoutManagers, function(index, layoutManager) { + if(optionFullName === 'formData') { + that._isDataUpdating = true; + layoutManager.option('layoutData', args.value); + that._isDataUpdating = false; + } + + if(args.name === 'readOnly' || args.name === 'disabled') { + layoutManager.option(optionFullName, args.value); + } + }); + } + }); + }, + + _optionChanged: function(args) { + const rootNameOfComplexOption = this._getRootLevelOfExpectedComplexOption(args.fullName, ['formData', 'items']); + + if(rootNameOfComplexOption) { + this._customHandlerOfComplexOption(args, rootNameOfComplexOption); + return; + } + + switch(args.name) { + case 'formData': + if(!this.option('items')) { + this._invalidate(); + } else if(isEmptyObject(args.value)) { + this._resetValues(); + } + break; + case 'items': + case 'colCount': + case 'onFieldDataChanged': + case 'onEditorEnterKey': + case 'labelLocation': + case 'alignItemLabels': + case 'showColonAfterLabel': + case 'customizeItem': + case 'alignItemLabelsInAllGroups': + case 'showRequiredMark': + case 'showOptionalMark': + case 'requiredMark': + case 'optionalMark': + case 'requiredMessage': + case 'scrollingEnabled': + case 'formID': + case 'colCountByScreen': + case 'screenByWidth': + case 'stylingMode': + this._invalidate(); + break; + case 'showValidationSummary': + this._renderValidationSummary(); + break; + case 'minColWidth': + if(this.option('colCount') === 'auto') { + this._invalidate(); + } + break; + case 'alignRootItemLabels': + case 'readOnly': + break; + case 'width': + this.callBase(args); + this._rootLayoutManager.option(args.name, args.value); + this._alignLabels(this._rootLayoutManager, this._rootLayoutManager.isSingleColumnMode()); + break; + case 'visible': + this.callBase(args); + + if(args.value) { + triggerShownEvent(this.$element()); + } + break; + case 'validationGroup': + ValidationEngine.removeGroup(args.previousValue || this); + this._invalidate(); + break; + default: + this.callBase(args); + } + }, + + _getRootLevelOfExpectedComplexOption: function(fullOptionName, expectedRootNames) { + const splitFullName = fullOptionName.split('.'); + let result; + + if(splitFullName.length > 1) { + let i; + const rootOptionName = splitFullName[0]; + + for(i = 0; i < expectedRootNames.length; i++) { + if(rootOptionName.search(expectedRootNames[i]) !== -1) { + result = expectedRootNames[i]; + } + } + } + + return result; + }, + + _tryCreateItemOptionAction: function(optionName, item, value, previousValue, itemPath) { + if(optionName === 'tabs') { + this._itemsRunTimeInfo.removeItemsByPathStartWith(`${itemPath}.tabs`); + value = this._prepareItems(value, true, itemPath, true); + } + return tryCreateItemOptionAction(optionName, { + item, + value, + previousValue, + itemsRunTimeInfo: this._itemsRunTimeInfo + }); + }, + + _tryExecuteItemOptionAction: function(action) { + return action && action.tryExecute(); + }, + + _updateValidationGroupAndSummaryIfNeeded: function(fullName) { + const optionName = getOptionNameFromFullName(fullName); + if(ITEM_OPTIONS_FOR_VALIDATION_UPDATING.indexOf(optionName) > -1) { + ValidationEngine.addGroup(this._getValidationGroup()); + if(this.option('showValidationSummary')) { + this._validationSummary && this._validationSummary._initGroupRegistration(); + } + } + }, + + _setLayoutManagerItemOption(layoutManager, optionName, value, path) { + if(this._updateLockCount > 0) { + !layoutManager._updateLockCount && layoutManager.beginUpdate(); + const key = this._itemsRunTimeInfo.getKeyByPath(path); + this.postponedOperations.add(key, () => { + !layoutManager._disposed && layoutManager.endUpdate(); + return new Deferred().resolve(); + }); + } + const contentReadyHandler = e => { + e.component.off('contentReady', contentReadyHandler); + if(isFullPathContainsTabs(path)) { + const tabPath = tryGetTabPath(path); + const tabLayoutManager = this._itemsRunTimeInfo.getGroupOrTabLayoutManagerByPath(tabPath); + this._alignLabelsInColumn({ + items: tabLayoutManager.option('items'), + layoutManager: tabLayoutManager, + $container: tabLayoutManager.$element(), + inOneColumn: tabLayoutManager.isSingleColumnMode() + }); + } else { + this._alignLabels(this._rootLayoutManager, this._rootLayoutManager.isSingleColumnMode()); + } + }; + layoutManager.on('contentReady', contentReadyHandler); + layoutManager.option(optionName, value); + this._updateValidationGroupAndSummaryIfNeeded(optionName); + }, + + _tryChangeLayoutManagerItemOption(fullName, value) { + const nameParts = fullName.split('.'); + const optionName = getOptionNameFromFullName(fullName); + + if(optionName === 'items' && nameParts.length > 1) { + const itemPath = this._getItemPath(nameParts); + const layoutManager = this._itemsRunTimeInfo.getGroupOrTabLayoutManagerByPath(itemPath); + + if(layoutManager) { + this._itemsRunTimeInfo.removeItemsByItems(layoutManager.getItemsRunTimeInfo()); + const items = this._prepareItems(value, false, itemPath); + this._setLayoutManagerItemOption(layoutManager, optionName, items, itemPath); + return true; + } + } else if(nameParts.length > 2) { + const endPartIndex = nameParts.length - 2; + const itemPath = this._getItemPath(nameParts.slice(0, endPartIndex)); + const layoutManager = this._itemsRunTimeInfo.getGroupOrTabLayoutManagerByPath(itemPath); + + if(layoutManager) { + const fullOptionName = getFullOptionName(nameParts[endPartIndex], optionName); + if(optionName === 'editorType') { // T903774 + if(layoutManager.option(fullOptionName) !== value) { + return false; + } + } + if(optionName === 'visible') { // T874843 + const formItems = this.option(getFullOptionName(itemPath, 'items')); + if(formItems && formItems.length) { + const layoutManagerItems = layoutManager.option('items'); + formItems.forEach((item, index) => { + const layoutItem = layoutManagerItems[index]; + layoutItem.visibleIndex = item.visibleIndex; + }); + } + } + + this._setLayoutManagerItemOption(layoutManager, fullOptionName, value, itemPath); + return true; + } + } + return false; + }, + + _tryChangeLayoutManagerItemOptions(itemPath, options) { + let result; + this.beginUpdate(); + each(options, (optionName, optionValue) => { + result = this._tryChangeLayoutManagerItemOption(getFullOptionName(itemPath, optionName), optionValue); + if(!result) { + return false; + } + }); + this.endUpdate(); + return result; + }, + + _customHandlerOfComplexOption: function(args, rootOptionName) { + const nameParts = args.fullName.split('.'); + const value = args.value; + + if(rootOptionName === 'items') { + const itemPath = this._getItemPath(nameParts); + const item = this.option(itemPath); + const optionNameWithoutPath = args.fullName.replace(itemPath + '.', ''); + const simpleOptionName = optionNameWithoutPath.split('.')[0].replace(/\[\d+]/, ''); + const itemAction = this._tryCreateItemOptionAction(simpleOptionName, item, item[simpleOptionName], args.previousValue, itemPath); + + if(!this._tryExecuteItemOptionAction(itemAction) && !this._tryChangeLayoutManagerItemOption(args.fullName, value)) { + if(item) { + this._changeItemOption(item, optionNameWithoutPath, value); + const items = this._generateItemsFromData(this.option('items')); + this.option('items', items); + } + } + } + + if(rootOptionName === 'formData') { + const dataField = nameParts.slice(1).join('.'); + const editor = this.getEditor(dataField); + if(editor) { + editor.option('value', value); + } else { + this._triggerOnFieldDataChanged({ dataField, value }); + } + } + }, + + _getItemPath: function(nameParts) { + let itemPath = nameParts[0]; + let i; + + for(i = 1; i < nameParts.length; i++) { + if(nameParts[i].search(/items\[\d+]|tabs\[\d+]/) !== -1) { + itemPath += '.' + nameParts[i]; + } else { + break; + } + } + + return itemPath; + }, + + _triggerOnFieldDataChanged: function(args) { + this._createActionByOption('onFieldDataChanged')(args); + }, + + _triggerOnFieldDataChangedByDataSet: function(data) { + const that = this; + if(data && isObject(data)) { + each(data, function(dataField, value) { + that._triggerOnFieldDataChanged({ dataField: dataField, value: value }); + }); + } + }, + + _updateFieldValue: function(dataField, value) { + if(isDefined(this.option('formData'))) { + const editor = this.getEditor(dataField); + + this.option('formData.' + dataField, value); + + if(editor) { + const editorValue = editor.option('value'); + + if(editorValue !== value) { + editor.option('value', value); + } + } + } + }, + + _generateItemsFromData: function(items) { + const formData = this.option('formData'); + const result = []; + + if(!items && isDefined(formData)) { + each(formData, function(dataField) { + result.push({ + dataField: dataField + }); + }); + } + + if(items) { + each(items, function(index, item) { + if(isObject(item)) { + result.push(item); + } else { + result.push({ + dataField: item + }); + } + }); + } + + return result; + }, + + _getItemByField: function(field, items) { + const that = this; + const fieldParts = isObject(field) ? field : that._getFieldParts(field); + const fieldName = fieldParts.fieldName; + const fieldPath = fieldParts.fieldPath; + let resultItem; + + if(items.length) { + each(items, function(index, item) { + const itemType = item.itemType; + + if(fieldPath.length) { + const path = fieldPath.slice(); + + item = that._getItemByFieldPath(path, fieldName, item); + } else if(itemType === 'group' && !(item.caption || item.name) || itemType === 'tabbed' && !item.name) { + const subItemsField = that._getSubItemField(itemType); + + item.items = that._generateItemsFromData(item.items); + + item = that._getItemByField({ fieldName: fieldName, fieldPath: fieldPath }, item[subItemsField]); + } + + if(isExpectedItem(item, fieldName)) { + resultItem = item; + return false; + } + }); + } + + return resultItem; + }, + + _getFieldParts: function(field) { + const fieldSeparator = '.'; + let fieldName = field; + let separatorIndex = fieldName.indexOf(fieldSeparator); + const resultPath = []; + + + while(separatorIndex !== -1) { + resultPath.push(fieldName.substr(0, separatorIndex)); + fieldName = fieldName.substr(separatorIndex + 1); + separatorIndex = fieldName.indexOf(fieldSeparator); + } + + return { + fieldName: fieldName, + fieldPath: resultPath.reverse() + }; + }, + + _getItemByFieldPath: function(path, fieldName, item) { + const that = this; + const itemType = item.itemType; + const subItemsField = that._getSubItemField(itemType); + const isItemWithSubItems = itemType === 'group' || itemType === 'tabbed' || item.title; + let result; + + do { + if(isItemWithSubItems) { + const name = item.name || item.caption || item.title; + const isGroupWithName = isDefined(name); + const nameWithoutSpaces = getTextWithoutSpaces(name); + let pathNode; + + item[subItemsField] = that._generateItemsFromData(item[subItemsField]); + + if(isGroupWithName) { + pathNode = path.pop(); + } + + if(!path.length) { + result = that._getItemByField(fieldName, item[subItemsField]); + + if(result) { + break; + } + } + + if(!isGroupWithName || isGroupWithName && nameWithoutSpaces === pathNode) { + if(path.length) { + result = that._searchItemInEverySubItem(path, fieldName, item[subItemsField]); + } + } + } else { + break; + } + } while(path.length && !isDefined(result)); + + return result; + }, + + _getSubItemField: function(itemType) { + return itemType === 'tabbed' ? 'tabs' : 'items'; + }, + + _searchItemInEverySubItem: function(path, fieldName, items) { + const that = this; + let result; + + each(items, function(index, groupItem) { + result = that._getItemByFieldPath(path.slice(), fieldName, groupItem); + if(result) { + return false; + } + }); + + if(!result) { + result = false; + } + + return result; + }, + + _changeItemOption: function(item, option, value) { + if(isObject(item)) { + item[option] = value; + } + }, + + _dimensionChanged: function() { + const currentScreenFactor = this._getCurrentScreenFactor(); + + if(this._lastMarkupScreenFactor !== currentScreenFactor) { + if(this._isColCountChanged(this._lastMarkupScreenFactor, currentScreenFactor)) { + this._targetScreenFactor = currentScreenFactor; + this._refresh(); + this._targetScreenFactor = undefined; + } + + this._lastMarkupScreenFactor = currentScreenFactor; + } + }, + + _isColCountChanged: function(oldScreenSize, newScreenSize) { + let isChanged = false; + + each(this._cachedColCountOptions, function(index, item) { + if(item.colCountByScreen[oldScreenSize] !== item.colCountByScreen[newScreenSize]) { + isChanged = true; + return false; + } + }); + + return isChanged; + }, + + _refresh: function() { + const editorSelector = '.' + FOCUSED_STATE_CLASS + ' input, .' + FOCUSED_STATE_CLASS + ' textarea'; + + eventsEngine.trigger(this.$element().find(editorSelector), 'change'); + + this.callBase(); + }, + + _resetValues: function() { + this._itemsRunTimeInfo.each(function(_, itemRunTimeInfo) { + if(isDefined(itemRunTimeInfo.widgetInstance) && Editor.isEditor(itemRunTimeInfo.widgetInstance)) { + itemRunTimeInfo.widgetInstance.reset(); + itemRunTimeInfo.widgetInstance.option('isValid', true); + } + }); + + ValidationEngine.resetGroup(this._getValidationGroup()); + }, + + _updateData: function(data, value, isComplexData) { + const that = this; + const _data = isComplexData ? value : data; + + if(isObject(_data)) { + each(_data, function(dataField, fieldValue) { + that._updateData(isComplexData ? data + '.' + dataField : dataField, fieldValue, isObject(fieldValue)); + }); + } else if(isString(data)) { + that._updateFieldValue(data, value); + } + }, + + registerKeyHandler: function(key, handler) { + this.callBase(key, handler); + this._itemsRunTimeInfo.each(function(_, itemRunTimeInfo) { + if(isDefined(itemRunTimeInfo.widgetInstance)) { + itemRunTimeInfo.widgetInstance.registerKeyHandler(key, handler); + } + }); + }, + + _focusTarget: function() { + return this.$element().find('.' + FIELD_ITEM_CONTENT_CLASS + ' [tabindex]').first(); + }, + + _visibilityChanged: function() {}, + + _dispose: function() { + ValidationEngine.removeGroup(this._getValidationGroup()); + this.callBase(); + }, + + resetValues: function() { + this._resetValues(); + }, + + updateData: function(data, value) { + this._updateData(data, value); + }, + + getEditor: function(dataField) { + return this._itemsRunTimeInfo.findWidgetInstanceByDataField(dataField) || this._itemsRunTimeInfo.findWidgetInstanceByName(dataField); + }, + + getButton: function(name) { + return this._itemsRunTimeInfo.findWidgetInstanceByName(name); + }, + + updateDimensions: function() { + const that = this; + const deferred = new Deferred(); + + if(that._scrollable) { + that._scrollable.update().done(function() { + deferred.resolveWith(that); + }); + } else { + deferred.resolveWith(that); + } + + return deferred.promise(); + }, + + itemOption: function(id, option, value) { + const items = this._generateItemsFromData(this.option('items')); + const item = this._getItemByField(id, items); + const path = getItemPath(items, item); + + if(!item) { + return; + } + + switch(arguments.length) { + case 1: + return item; + case 3: { + const itemAction = this._tryCreateItemOptionAction(option, item, value, item[option], path); + this._changeItemOption(item, option, value); + const fullName = getFullOptionName(path, option); + if(!this._tryExecuteItemOptionAction(itemAction) && !this._tryChangeLayoutManagerItemOption(fullName, value)) { + this.option('items', items); + } + break; + } + default: { + if(isObject(option)) { + if(!this._tryChangeLayoutManagerItemOptions(path, option)) { + let allowUpdateItems; + each(option, (optionName, optionValue) => { + const itemAction = this._tryCreateItemOptionAction(optionName, item, optionValue, item[optionName], path); + this._changeItemOption(item, optionName, optionValue); + if(!allowUpdateItems && !this._tryExecuteItemOptionAction(itemAction)) { + allowUpdateItems = true; + } + }); + allowUpdateItems && this.option('items', items); + } + } + break; + } + } + }, + + validate: function() { + return ValidationEngine.validateGroup(this._getValidationGroup()); + }, + + getItemID: function(name) { + return 'dx_' + this.option('formID') + '_' + (name || new Guid()); + }, + + getTargetScreenFactor: function() { + return this._targetScreenFactor; + } +}); + +registerComponent('dxForm', Form); + +export default Form; diff --git a/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.layout_manager.js b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.layout_manager.js new file mode 100644 index 0000000000000000000000000000000000000000..f9ad58931079120db478cd2d65940e8a9854df64 --- /dev/null +++ b/packages/f-theme-editor/farris-theme-editor/js/renovation/ui/form/_toDelete/ui.form.layout_manager.js @@ -0,0 +1,1270 @@ +import { getWidth } from '../../../../core/utils/size'; +import $ from '../../core/renderer'; +import eventsEngine from '../../events/core/events_engine'; +import Guid from '../../core/guid'; +import { default as FormItemsRunTimeInfo } from './ui.form.items_runtime_info'; +import registerComponent from '../../core/component_registrator'; +import { isDefined, isEmptyObject, isFunction, isObject, type } from '../../core/utils/type'; +import { getPublicElement } from '../../core/element'; +import variableWrapper from '../../core/utils/variable_wrapper'; +import { getCurrentScreenFactor, hasWindow } from '../../core/utils/window'; +import { format } from '../../core/utils/string'; +import { each } from '../../core/utils/iterator'; +import { extend } from '../../core/utils/extend'; +import { inArray, normalizeIndexes } from '../../core/utils/array'; +import { compileGetter } from '../../core/utils/data'; +import { removeEvent } from '../../events/remove'; +import { name as clickEventName } from '../../events/click'; +import errors from '../widget/ui.errors'; +import messageLocalization from '../../localization/message'; +import { styleProp } from '../../core/utils/style'; +import { captionize } from '../../core/utils/inflector'; +import Widget from '../widget/ui.widget'; +import Validator from '../validator'; +import ResponsiveBox from '../responsive_box'; +import { isMaterial } from '../themes'; +import { + FIELD_ITEM_CLASS, + FLEX_LAYOUT_CLASS, + LAYOUT_MANAGER_ONE_COLUMN, + FIELD_ITEM_OPTIONAL_MARK_CLASS, + FIELD_ITEM_REQUIRED_MARK_CLASS, + FIELD_ITEM_OPTIONAL_CLASS, + FIELD_ITEM_REQUIRED_CLASS, + FIELD_ITEM_LABEL_TEXT_CLASS, + FIELD_ITEM_LABEL_CONTENT_CLASS, + FIELD_ITEM_HELP_TEXT_CLASS, + FIELD_ITEM_CONTENT_WRAPPER_CLASS, + LABEL_VERTICAL_ALIGNMENT_CLASS, + LABEL_HORIZONTAL_ALIGNMENT_CLASS, + FIELD_ITEM_LABEL_LOCATION_CLASS, + FIELD_ITEM_LABEL_ALIGN_CLASS, + FIELD_ITEM_LABEL_CLASS, + FIELD_ITEM_CONTENT_LOCATION_CLASS, + FIELD_ITEM_CONTENT_CLASS, + FIELD_EMPTY_ITEM_CLASS, + FIELD_BUTTON_ITEM_CLASS, + SINGLE_COLUMN_ITEM_CONTENT, + ROOT_SIMPLE_ITEM_CLASS } from './constants'; + +import '../text_box'; +import '../number_box'; +import '../check_box'; +import '../date_box'; +import '../button'; + +const FORM_EDITOR_BY_DEFAULT = 'dxTextBox'; + +const LAYOUT_MANAGER_FIRST_ROW_CLASS = 'dx-first-row'; +const LAYOUT_MANAGER_LAST_ROW_CLASS = 'dx-last-row'; +const LAYOUT_MANAGER_FIRST_COL_CLASS = 'dx-first-col'; +const LAYOUT_MANAGER_LAST_COL_CLASS = 'dx-last-col'; + +const INVALID_CLASS = 'dx-invalid'; + +const LAYOUT_STRATEGY_FLEX = 'flex'; +const LAYOUT_STRATEGY_FALLBACK = 'fallback'; + +const SIMPLE_ITEM_TYPE = 'simple'; + +const TEMPLATE_WRAPPER_CLASS = 'dx-template-wrapper'; + +const DATA_OPTIONS = ['dataSource', 'items']; +const EDITORS_WITH_ARRAY_VALUE = ['dxTagBox', 'dxRangeSlider']; + +const LayoutManager = Widget.inherit({ + _getDefaultOptions: function() { + return extend(this.callBase(), { + layoutData: {}, + readOnly: false, + colCount: 1, + colCountByScreen: undefined, + labelLocation: 'left', + onFieldDataChanged: null, + onEditorEnterKey: null, + customizeItem: null, + alignItemLabels: true, + minColWidth: 200, + showRequiredMark: true, + showOptionalMark: false, + requiredMark: '*', + optionalMark: messageLocalization.format('dxForm-optionalMark'), + requiredMessage: messageLocalization.getFormatter('dxForm-requiredMessage') + }); + }, + + _setOptionsByReference: function() { + this.callBase(); + + extend(this._optionsByReference, { + layoutData: true, + validationGroup: true + }); + }, + + _init: function() { + const layoutData = this.option('layoutData'); + + this.callBase(); + this._itemWatchers = []; + this._itemsRunTimeInfo = new FormItemsRunTimeInfo(); + this._updateReferencedOptions(layoutData); + this._initDataAndItems(layoutData); + }, + + _dispose: function() { + this.callBase(); + + this._cleanItemWatchers(); + }, + + _initDataAndItems: function(initialData) { + this._syncDataWithItems(); + this._updateItems(initialData); + }, + + _syncDataWithItems: function() { + const layoutData = this.option('layoutData'); + const userItems = this.option('items'); + + if(isDefined(userItems)) { + userItems.forEach(item => { + if(item.dataField && this._getDataByField(item.dataField) === undefined) { + let value; + if(item.editorOptions) { + value = item.editorOptions.value; + } + + if(isDefined(value) || item.dataField in layoutData) { + this._updateFieldValue(item.dataField, value); + } + } + }); + } + }, + + _getDataByField: function(dataField) { + return dataField ? this.option('layoutData.' + dataField) : null; + }, + + _isCheckboxUndefinedStateEnabled: function(editorOption) { + if(editorOption.allowIndeterminateState === true && editorOption.editorType === 'dxCheckBox') { + const nameParts = ['layoutData', ...editorOption.dataField.split('.')]; + const propertyName = nameParts.pop(); + const layoutData = this.option(nameParts.join('.')); + + return layoutData && (propertyName in layoutData); + } + + return false; + }, + + _updateFieldValue: function(dataField, value) { + const layoutData = this.option('layoutData'); + let newValue = value; + + if(!variableWrapper.isWrapped(layoutData[dataField]) && isDefined(dataField)) { + this.option('layoutData.' + dataField, newValue); + } else if(variableWrapper.isWritableWrapped(layoutData[dataField])) { + newValue = isFunction(newValue) ? newValue() : newValue; + + layoutData[dataField](newValue); + } + + this._triggerOnFieldDataChanged({ dataField: dataField, value: newValue }); + }, + + _triggerOnFieldDataChanged: function(args) { + this._createActionByOption('onFieldDataChanged')(args); + }, + + _updateItems: function(layoutData) { + const that = this; + const userItems = this.option('items'); + const isUserItemsExist = isDefined(userItems); + const customizeItem = that.option('customizeItem'); + + const items = isUserItemsExist ? userItems : this._generateItemsByData(layoutData); + if(isDefined(items)) { + const processedItems = []; + + each(items, function(index, item) { + if(that._isAcceptableItem(item)) { + item = that._processItem(item); + + customizeItem && customizeItem(item); + + if(isObject(item) && variableWrapper.unwrap(item.visible) !== false) { + processedItems.push(item); + } + } + }); + + if(!that._itemWatchers.length || !isUserItemsExist) { + that._updateItemWatchers(items); + } + + this._setItems(processedItems); + this._sortItems(); + } + }, + + _cleanItemWatchers: function() { + this._itemWatchers.forEach(function(dispose) { + dispose(); + }); + this._itemWatchers = []; + }, + + _updateItemWatchers: function(items) { + const that = this; + const watch = that._getWatch(); + + items.forEach(function(item) { + if(isObject(item) && isDefined(item.visible) && isFunction(watch)) { + + that._itemWatchers.push( + watch( + function() { + return variableWrapper.unwrap(item.visible); + }, + function() { + that._updateItems(that.option('layoutData')); + that.repaint(); + }, + { skipImmediate: true } + )); + } + }); + }, + + _generateItemsByData: function(layoutData) { + const result = []; + + if(isDefined(layoutData)) { + each(layoutData, function(dataField) { + result.push({ + dataField: dataField + }); + }); + } + + return result; + }, + + _isAcceptableItem: function(item) { + const itemField = item.dataField || item; + const itemData = this._getDataByField(itemField); + + return !(isFunction(itemData) && !variableWrapper.isWrapped(itemData)); + }, + + _processItem: function(item) { + if(typeof item === 'string') { + item = { dataField: item }; + } + + if(typeof item === 'object' && !item.itemType) { + item.itemType = SIMPLE_ITEM_TYPE; + } + + if(!isDefined(item.editorType) && isDefined(item.dataField)) { + const value = this._getDataByField(item.dataField); + + item.editorType = isDefined(value) ? this._getEditorTypeByDataType(type(value)) : FORM_EDITOR_BY_DEFAULT; + } + + if(item.editorType === 'dxCheckBox') { + item.allowIndeterminateState = item.allowIndeterminateState ?? true; + } + + return item; + }, + + _getEditorTypeByDataType: function(dataType) { + switch(dataType) { + case 'number': + return 'dxNumberBox'; + case 'date': + return 'dxDateBox'; + case 'boolean': + return 'dxCheckBox'; + default: + return 'dxTextBox'; + } + }, + + _sortItems: function() { + normalizeIndexes(this._items, 'visibleIndex'); + this._sortIndexes(); + }, + + _sortIndexes: function() { + this._items.sort(function(itemA, itemB) { + const indexA = itemA.visibleIndex; + const indexB = itemB.visibleIndex; + let result; + + if(indexA > indexB) { + result = 1; + } else if(indexA < indexB) { + result = -1; + } else { + result = 0; + } + + return result; + }); + }, + + _initMarkup: function() { + this._itemsRunTimeInfo.clear(); + + this.callBase(); + this._renderResponsiveBox(); + }, + + _hasBrowserFlex: function() { + return styleProp(LAYOUT_STRATEGY_FLEX) === LAYOUT_STRATEGY_FLEX; + }, + + _renderResponsiveBox: function() { + const that = this; + const templatesInfo = []; + + if(that._items && that._items.length) { + const colCount = that._getColCount(); + that._prepareItemsWithMerging(colCount); + + const layoutItems = that._generateLayoutItems(); + that._extendItemsWithDefaultTemplateOptions(layoutItems, that._items); + + that._responsiveBox = that._createComponent(/* $container, */ ResponsiveBox, that._getResponsiveBoxConfig(layoutItems, colCount, templatesInfo)); + if(!hasWindow()) { + that._renderTemplates(templatesInfo); + } + } + }, + + _extendItemsWithDefaultTemplateOptions: function(targetItems, sourceItems) { + sourceItems.forEach(function(item) { + if(!item.merged) { + if(isDefined(item.disabled)) { + targetItems[item.visibleIndex].disabled = item.disabled; + } + if(isDefined(item.visible)) { + targetItems[item.visibleIndex].visible = item.visible; + } + } + }); + }, + + _itemStateChangedHandler: function(e) { + this._refresh(); + }, + + _renderTemplate: function($container, item) { + switch(item.itemType) { + case 'empty': + this._renderEmptyItem($container); + break; + case 'button': + this._renderButtonItem(item, $container); + break; + default: + this._renderFieldItem(item, $container); + } + }, + + _renderTemplates: function(templatesInfo) { + const that = this; + each(templatesInfo, function(index, info) { + that._renderTemplate(info.container, info.formItem); + }); + }, + + _getResponsiveBoxConfig: function(layoutItems, colCount, templatesInfo) { + const that = this; + const colCountByScreen = that.option('colCountByScreen'); + const xsColCount = colCountByScreen && colCountByScreen.xs; + + return { + onItemStateChanged: this._itemStateChangedHandler.bind(this), + _layoutStrategy: that._hasBrowserFlex() ? LAYOUT_STRATEGY_FLEX : LAYOUT_STRATEGY_FALLBACK, + onLayoutChanged: function() { + const onLayoutChanged = that.option('onLayoutChanged'); + const isSingleColumnMode = that.isSingleColumnMode(); + + if(onLayoutChanged) { + that.$element().toggleClass(LAYOUT_MANAGER_ONE_COLUMN, isSingleColumnMode); + onLayoutChanged(isSingleColumnMode); + } + }, + onContentReady: function(e) { + if(hasWindow()) { + that._renderTemplates(templatesInfo); + } + if(that.option('onLayoutChanged')) { + that.$element().toggleClass(LAYOUT_MANAGER_ONE_COLUMN, that.isSingleColumnMode(e.component)); + } + }, + itemTemplate: function(e, itemData, itemElement) { + if(!e.location) { + return; + } + const $itemElement = $(itemElement); + const itemRenderedCountInPreviousRows = e.location.row * colCount; + const item = that._items[e.location.col + itemRenderedCountInPreviousRows]; + const $fieldItem = $('
') + .addClass(item.cssClass) + .appendTo($itemElement); + + templatesInfo.push({ + container: $fieldItem, + formItem: item + }); + + $itemElement.toggleClass(SINGLE_COLUMN_ITEM_CONTENT, that.isSingleColumnMode(this)); + + if(e.location.row === 0) { + $fieldItem.addClass(LAYOUT_MANAGER_FIRST_ROW_CLASS); + } + if(e.location.col === 0) { + $fieldItem.addClass(LAYOUT_MANAGER_FIRST_COL_CLASS); + } + + if(item.itemType === SIMPLE_ITEM_TYPE && that.option('isRoot')) { + $itemElement.addClass(ROOT_SIMPLE_ITEM_CLASS); + } + const isLastColumn = (e.location.col === colCount - 1) || (e.location.col + e.location.colspan === colCount); + const rowsCount = that._getRowsCount(); + const isLastRow = e.location.row === rowsCount - 1; + if(isLastColumn) { + $fieldItem.addClass(LAYOUT_MANAGER_LAST_COL_CLASS); + } + if(isLastRow) { + $fieldItem.addClass(LAYOUT_MANAGER_LAST_ROW_CLASS); + } + }, + cols: that._generateRatio(colCount), + rows: that._generateRatio(that._getRowsCount(), true), + dataSource: layoutItems, + singleColumnScreen: xsColCount ? false : 'xs' + }; + }, + + _getColCount: function() { + let colCount = this.option('colCount'); + const colCountByScreen = this.option('colCountByScreen'); + + if(colCountByScreen) { + let screenFactor = this.option('form').getTargetScreenFactor(); + if(!screenFactor) { + screenFactor = hasWindow() ? getCurrentScreenFactor(this.option('screenByWidth')) : 'lg'; + } + colCount = colCountByScreen[screenFactor] || colCount; + } + + if(colCount === 'auto') { + if(this._cashedColCount) { + return this._cashedColCount; + } + + this._cashedColCount = colCount = this._getMaxColCount(); + } + + return colCount < 1 ? 1 : colCount; + }, + + _getMaxColCount: function() { + if(!hasWindow()) { + return 1; + } + + const minColWidth = this.option('minColWidth'); + const width = getWidth(this.$element()); + const itemsCount = this._items.length; + const maxColCount = Math.floor(width / minColWidth) || 1; + + return itemsCount < maxColCount ? itemsCount : maxColCount; + }, + + isCachedColCountObsolete: function() { + return this._cashedColCount && this._getMaxColCount() !== this._cashedColCount; + }, + + _prepareItemsWithMerging: function(colCount) { + const items = this._items.slice(0); + let item; + let itemsMergedByCol; + let result = []; + let j; + let i; + + for(i = 0; i < items.length; i++) { + item = items[i]; + result.push(item); + + if(this.option('alignItemLabels') || item.alignItemLabels || item.colSpan) { + item.col = this._getColByIndex(result.length - 1, colCount); + } + if(item.colSpan > 1 && (item.col + item.colSpan <= colCount)) { + itemsMergedByCol = []; + for(j = 0; j < item.colSpan - 1; j++) { + itemsMergedByCol.push({ merged: true }); + } + result = result.concat(itemsMergedByCol); + } else { + delete item.colSpan; + } + } + this._setItems(result); + }, + + _getColByIndex: function(index, colCount) { + return index % colCount; + }, + + _setItems: function(items) { + this._items = items; + this._cashedColCount = null; // T923489 + }, + + _generateLayoutItems: function() { + const items = this._items; + const colCount = this._getColCount(); + const result = []; + let item; + let i; + + for(i = 0; i < items.length; i++) { + item = items[i]; + + if(!item.merged) { + const generatedItem = { + location: { + row: parseInt(i / colCount), + col: this._getColByIndex(i, colCount) + } + }; + if(isDefined(item.colSpan)) { + generatedItem.location.colspan = item.colSpan; + } + if(isDefined(item.rowSpan)) { + generatedItem.location.rowspan = item.rowSpan; + } + result.push(generatedItem); + } + } + + return result; + }, + + _renderEmptyItem: function($container) { + return $container + .addClass(FIELD_EMPTY_ITEM_CLASS) + .html(' '); + }, + + _getButtonHorizontalAlignment: function(item) { + if(isDefined(item.horizontalAlignment)) { + return item.horizontalAlignment; + } + + return 'right'; + }, + + _getButtonVerticalAlignment: function(item) { + switch(item.verticalAlignment) { + case 'center': + return 'center'; + case 'bottom': + return 'flex-end'; + default: + return 'flex-start'; + } + }, + + _renderButtonItem: function(item, $container) { + const $button = $('
').appendTo($container); + const defaultOptions = { + validationGroup: this.option('validationGroup') + }; + + $container + .addClass(FIELD_BUTTON_ITEM_CLASS) + .css('textAlign', this._getButtonHorizontalAlignment(item)); + + $container.parent().css('justifyContent', this._getButtonVerticalAlignment(item)); + + const instance = this._createComponent($button, 'dxButton', extend(defaultOptions, item.buttonOptions)); + + this._itemsRunTimeInfo.add({ + item, + widgetInstance: instance, + guid: item.guid, + $itemContainer: $container + }); + this._addItemClasses($container, item.col); + + return $button; + }, + + _addItemClasses: function($item, column) { + $item + .addClass(FIELD_ITEM_CLASS) + .addClass(this.option('cssItemClass')) + .addClass(isDefined(column) ? 'dx-col-' + column : ''); + }, + + _renderFieldItem: function(item, $container) { + const that = this; + const name = that._getName(item); + const id = that.getItemID(name); + const isRequired = isDefined(item.isRequired) ? item.isRequired : !!that._hasRequiredRuleInSet(item.validationRules); + const labelOptions = that._getLabelOptions(item, id, isRequired); + const $editor = $('
'); + const helpID = item.helpText ? ('dx-' + new Guid()) : null; + let $label; + + this._addItemClasses($container, item.col); + $container.addClass(isRequired ? FIELD_ITEM_REQUIRED_CLASS : FIELD_ITEM_OPTIONAL_CLASS); + + if(labelOptions.visible && labelOptions.text) { + $label = that._renderLabel(labelOptions).appendTo($container); + } + + if(item.itemType === SIMPLE_ITEM_TYPE) { + if(that._isLabelNeedBaselineAlign(item) && labelOptions.location !== 'top') { + $container.addClass(FIELD_ITEM_LABEL_ALIGN_CLASS); + } + that._hasBrowserFlex() && $container.addClass(FLEX_LAYOUT_CLASS); + } + + $editor.data('dx-form-item', item); + that._appendEditorToField({ + $fieldItem: $container, + $label: $label, + $editor: $editor, + labelOptions: labelOptions + }); + + const instance = that._renderEditor({ + $container: $editor, + dataField: item.dataField, + name: item.name, + editorType: item.editorType, + editorOptions: item.editorOptions, + template: that._getTemplateByFieldItem(item), + isRequired: isRequired, + helpID: helpID, + labelID: labelOptions.labelID, + id: id, + validationBoundary: that.option('validationBoundary'), + allowIndeterminateState: item.allowIndeterminateState + }); + + this._itemsRunTimeInfo.add({ + item, + widgetInstance: instance, + guid: item.guid, + $itemContainer: $container + }); + + const editorElem = $editor.children().first(); + const $validationTarget = editorElem.hasClass(TEMPLATE_WRAPPER_CLASS) ? editorElem.children().first() : editorElem; + const validationTargetInstance = $validationTarget && $validationTarget.data('dx-validation-target'); + + if(validationTargetInstance) { + that._renderValidator($validationTarget, item); + + if(isMaterial()) { + that._addWrapperInvalidClass(validationTargetInstance); + } + } + + that._renderHelpText(item, $editor, helpID); + + that._attachClickHandler($label, $editor, item.editorType); + }, + + _hasRequiredRuleInSet: function(rules) { + let hasRequiredRule; + + if(rules && rules.length) { + each(rules, function(index, rule) { + if(rule.type === 'required') { + hasRequiredRule = true; + return false; + } + }); + } + + return hasRequiredRule; + }, + + _getName: function(item) { + return item.dataField || item.name; + }, + + _isLabelNeedBaselineAlign: function(item) { + const largeEditors = ['dxTextArea', 'dxRadioGroup', 'dxCalendar', 'dxHtmlEditor']; + return (!!item.helpText && !this._hasBrowserFlex()) || inArray(item.editorType, largeEditors) !== -1; + }, + + _isLabelNeedId: function(item) { + const editorsRequiringIdForLabel = ['dxRadioGroup', 'dxCheckBox', 'dxLookup', 'dxSlider', 'dxRangeSlider', 'dxSwitch', 'dxHtmlEditor']; // TODO: support "dxCalendar" + return inArray(item.editorType, editorsRequiringIdForLabel) !== -1; + }, + + _getLabelOptions: function(item, id, isRequired) { + const labelOptions = extend( + { + showColon: this.option('showColonAfterLabel'), + location: this.option('labelLocation'), + id: id, + visible: true, + isRequired: isRequired + }, + item ? item.label : {} + ); + + if(this._isLabelNeedId(item)) { + labelOptions.labelID = `dx-label-${new Guid()}`; + } + + if(!labelOptions.text && item.dataField) { + labelOptions.text = captionize(item.dataField); + } + + if(labelOptions.text) { + labelOptions.text += labelOptions.showColon ? ':' : ''; + } + + return labelOptions; + }, + + _renderLabel: function(options) { + const { text, id, location, alignment, isRequired, labelID = null } = options; + + if(isDefined(text) && text.length > 0) { + const labelClasses = FIELD_ITEM_LABEL_CLASS + ' ' + FIELD_ITEM_LABEL_LOCATION_CLASS + location; + const $label = $('