Compare commits

...
Author SHA1 Message Date
Ardit Domi 9c33ed68aa [AAE-13093] - Set node version of dockerfile to 16.20 (#8465) 2023-04-12 15:21:23 +01:00
swapnil-verma-gl 0eb0ff167b [ACA-4676][ACA-4678] Added Non Responsive Preview Dialog to viewer component (#8428)
* [ACA-4676] Added NonResponsivePreview dialog to download file incase file preview takes longer than a set period of time.

* [ACA-4676] Updated button positioning for non responsive preview dialog

* [ACA-4676] Added documentation for NonResponsivePreviewDialog functionality for viewer.component.ts

* [ACA-4676] Added unit tests for NonResponsivePreviewDialog

* [ACA-4676] Updated template of NonResponsivePreviewDialog to use components and directives from mat-dialog. Removed non-responsive-dialog.component.scss. Removed unused methods from non-responsive-dialog.component.ts

* [ACA-4676] Corrected typo in NonResponsivePreviewDialog unit tests

* [ACA-4676] Added test cases for NonResponsivePreviewDialog in viewer.component.ts. NOT WORKING

* [ACA-4676] Fixed test cases for non-responsive preview dialog. Moved NonResponsivePreview dialog tests to separate describe block. Updated component code to make properties and methods visible to testing environment

* [ACA-4676] Migrated viewer component test env setup from setupTestBed() to TestBed.configureTestingModule(). Moved NonResponsivePreviewDialog unit tests to inside parent Viewer component describe block

* [ACA-4676] Removed unused async tag. Added license info to non-responsive-dialog.component.ts and non-responsive-preview-actions.enum.ts

* [ACA-4676] Updated code to use "viewer" appConfig object instead of "preview-config". Added non-responsive-preview-actions.enum.ts to public-api.ts

* [ACA-4676] Resolved potential lint issues

* [ACA-4676] Updated non responsive preview to look for viewer config object inside app.config instead of preview-config

* [ACA-4676] Removed duplicate import for @adf/core. Added NonResponsiveDialogComponent to adf/core exports

* [ACA-4676] Renamed properties/config/documentation from nonResponsivePreview to downloadPrompt. Renamed NonResponsivePreviewActionsEnum to DownloadPromptActions.

* [ACA-4676] Resolved linting and unit test failures

* [ACA-4676] Changed dataType for timers to number. Updated code to use window.setTimeout(), instead of just setTimeout(). Added missing whitespace. Updated method names in demo shell to use 'downloadPrompt' naming scheme.

* [ACA-4676] Fixed incorrect import statement in viewer.module.ts for download-prompt-dialog

* [ACA-4676] Testing disabled by default behaviour of downloadPrompt feature

* [ACA-4676] Changed default value for enableDownloadPrompt and enableDownloadPromptReminders to false in app.config.json

* [ACA-4676] Removed un-needed AppConfig configurations from unit tests
2023-04-12 19:32:34 +05:30
Ardit Domi 662dfd9c3a [AAE-13093] - Use node v16 for publish docker (#8464) 2023-04-12 08:24:27 -04:00
Ardit Domi 452c96f0eb [AAE-13093] - Fix yml file indentation, use npm cache (#8463) 2023-04-12 07:34:21 -04:00
Ardit Domi 8c48927738 [AAE-13093] - Fix invalid node version workflow (#8462) 2023-04-12 07:23:57 -04:00
Ardit Domi 729ca7a61c [AAE-13093] - Fix demoshell and storybook publishing not working (#8460) 2023-04-12 11:37:17 +01:00
Vito Albanoandalfresco-build 05d6b041d4 Add connector regression app (#8461)
* Adding connector-regression free app

* Adding connector-regression free app

* Removed wrong file

---------

Co-authored-by: alfresco-build <alfresco-build@hyland.com>
2023-04-12 10:41:05 +01:00
dependabot[bot] b60e09532f Bump ng-mocks from 14.7.2 to 14.8.0 (#8458)
Bumps [ng-mocks](https://github.com/help-me-mom/ng-mocks) from 14.7.2 to 14.8.0.
- [Release notes](https://github.com/help-me-mom/ng-mocks/releases)
- [Changelog](https://github.com/help-me-mom/ng-mocks/blob/master/CHANGELOG.md)
- [Commits](https://github.com/help-me-mom/ng-mocks/compare/v14.7.2...v14.8.0)

---
updated-dependencies:
- dependency-name: ng-mocks
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-11 12:23:51 +02:00
Bartosz Sekula 94dcbda322 [AAE-12782] Custom theme creation (#8450)
* [AAE-12782] Create custom theme

* copied ui from ACA

* fix some lints

* Added theme

* Added theme

* lint part 1

* lint part 2

* lint part 3 backg color

* lint part 4

* lint part 5

* lint part 6

* lint part 7

* update

* fix map_merge
2023-04-06 18:53:00 +02:00
Ardit Domi 5ddd039832 [AAE-13200] - Fix GH workflow e2e not affected when testing lib is modified (#8448)
* [AAE-13200] - Fix e2e not affected when testing lib is modified

* Fix workflow

* Fix workflow output vars
2023-04-06 13:43:04 +01:00
Diogo Bastos 913a117723 [AAE-12288] Fix bc (#8447) 2023-04-05 15:55:00 +01:00
33 changed files with 878 additions and 52 deletions
+8 -2
View File
@@ -38,6 +38,10 @@ inputs:
apa-proxy: #
description: "proxy host"
required: true
deps:
description: "Library dependencies"
required: false
default: ""
runs:
using: "composite"
@@ -121,6 +125,7 @@ runs:
PROVIDER: "${{ inputs.e2e-test-provider }}"
AUTH_TYPE: "${{ inputs.e2e-test-auth }}"
E2E_TEST_ID: "${{ inputs.e2e-test-id }}"
DEPS: "${{ inputs.deps }}"
shell: bash
run: |
set -u;
@@ -134,6 +139,7 @@ runs:
PROVIDER: "${{ inputs.e2e-test-provider }}"
AUTH_TYPE: "${{ inputs.e2e-test-auth }}"
E2E_TEST_ID: "${{ inputs.e2e-test-id }}"
DEPS: "${{ inputs.deps }}"
uses: nick-fields/retry@v2.8.2
with:
@@ -149,9 +155,9 @@ runs:
export DISPLAY=:99
chromedriver --url-base=/wd/hub &
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 & # optional
bash ./scripts/github/e2e/e2e.sh "$E2E_TEST_ID" "browser" || exit 1
bash ./scripts/github/e2e/e2e.sh "$E2E_TEST_ID" "$DEPS" "browser" || exit 1
else
bash ./scripts/github/e2e/e2e.sh "$E2E_TEST_ID" || exit 1
bash ./scripts/github/e2e/e2e.sh "$E2E_TEST_ID" "$DEPS" || exit 1
fi
- name: upload artifacts on gh
+18 -1
View File
@@ -191,7 +191,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
with:
fetch-depth: 0 # Fetch all history for all tags and branches
- uses: ./.github/actions/setup
- name: install
@@ -302,42 +302,49 @@ jobs:
auth: "OAUTH"
check-cs-env: "true"
check-ps-env: "true"
deps: "testing"
- description: "Content: Components"
test-id: "content-services"
folder: "content-services/components"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Content: Directives"
test-id: "content-services"
folder: "content-services/directives"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Content: Document List"
test-id: "content-services"
folder: "content-services/document-list"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Content: Metadata"
test-id: "content-services"
folder: "content-services/metadata"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Content: Upload and Versioning"
test-id: "content-services"
folder: "content-services/upload"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Search"
test-id: "content-services"
folder: "search"
provider: "ECM"
auth: "BASIC"
check-cs-env: "true"
deps: "testing"
- description: "Process: Form"
test-id: "process-services"
folder: "process-services/form"
@@ -345,6 +352,7 @@ jobs:
auth: "OAUTH"
check-ps-env: "true"
check-external-cs-env: "true"
deps: "testing"
- description: "Process: Process"
test-id: "process-services"
folder: "process-services/process"
@@ -352,6 +360,7 @@ jobs:
auth: "OAUTH"
check-ps-env: "true"
check-external-cs-env: "true"
deps: "testing"
- description: "Process: Tasks"
test-id: "process-services"
folder: "process-services/tasks"
@@ -359,6 +368,7 @@ jobs:
auth: "OAUTH"
check-ps-env: "true"
check-external-cs-env: "true"
deps: "testing"
- description: "Process: Widget"
test-id: "process-services"
folder: "process-services/widgets"
@@ -366,6 +376,7 @@ jobs:
auth: "OAUTH"
check-ps-env: "true"
check-external-cs-env: "true"
deps: "testing"
- description: "Process Cloud: Form"
test-id: "process-services-cloud"
folder: "process-services-cloud/form-field"
@@ -374,6 +385,7 @@ jobs:
apa-proxy: true
check-cs-env: "true"
check-ps-cloud-env: "true"
deps: "testing"
- description: "Process Cloud: People"
test-id: "process-services-cloud"
folder: "process-services-cloud/people"
@@ -382,6 +394,7 @@ jobs:
apa-proxy: true
check-cs-env: "true"
check-ps-cloud-env: "true"
deps: "testing"
- description: "Process Cloud: Process"
test-id: "process-services-cloud"
folder: "process-services-cloud/process"
@@ -390,6 +403,7 @@ jobs:
apa-proxy: true
check-cs-env: "true"
check-ps-cloud-env: "true"
deps: "testing"
- description: "Process Cloud: Start Task"
test-id: "process-services-cloud"
folder: "process-services-cloud/start-task"
@@ -398,6 +412,7 @@ jobs:
apa-proxy: true
check-cs-env: "true"
check-ps-cloud-env: "true"
deps: "testing"
- description: "Process Cloud: Tasks List"
test-id: "process-services-cloud"
folder: "process-services-cloud/task-list"
@@ -406,6 +421,7 @@ jobs:
apa-proxy: true
check-cs-env: "true"
check-ps-cloud-env: "true"
deps: "testing"
steps:
- name: Checkout repository
@@ -431,6 +447,7 @@ jobs:
check-ps-cloud-env: ${{ matrix.e2e-test.check-ps-cloud-env }}
check-external-cs-env: ${{ matrix.e2e-test.check-external-cs-env }}
apa-proxy: ${{ matrix.e2e-test.apa-proxy }}
deps: ${{ matrix.e2e-test.deps }}
finalize:
if: ${{ always() }}
+1 -1
View File
@@ -1,6 +1,6 @@
# 1. Generate licenses
FROM node:16.13-alpine3.14 AS builder
FROM node:16.20-alpine3.17 AS builder
WORKDIR /usr/src/alfresco
COPY package.json package.json
+4
View File
@@ -1478,6 +1478,10 @@
]
},
"viewer": {
"enableDownloadPrompt": false,
"enableDownloadPromptReminder": false,
"downloadPromptDelay": 50,
"downloadPromptReminderDelay": 30,
"enableFileAutoDownload": true,
"fileAutoDownloadSizeThresholdInMB": 15
}
@@ -653,6 +653,30 @@
</mat-form-field>
</form>
<section>
<mat-slide-toggle
color="primary" [(ngModel)]="enableDownloadPrompt" id="enableDownloadPrompt" (change)="onEnableDownloadPrompt()">
Enable Download Prompt
</mat-slide-toggle>
</section>
<section *ngIf="enableDownloadPrompt">
<mat-form-field>
<input matInput type="number" [(ngModel)]="downloadPromptDelay" (change)="onDownloadPromptDelayChange()">
</mat-form-field>
</section>
<section *ngIf="enableDownloadPrompt">
<mat-slide-toggle
color="primary" [(ngModel)]="enableDownloadPromptReminder" id="enableDownloadPromptReminders" (change)="onEnableDownloadPromptReminderChange()">
Enable Download Prompt Reminders
</mat-slide-toggle>
</section>
<section *ngIf="enableDownloadPrompt && enableDownloadPromptReminder">
<mat-form-field>
<input matInput type="number" [(ngModel)]="downloadPromptReminderDelay" (change)="onDownloadPromptReminderChange()">
</mat-form-field>
</section>
<section>
<mat-slide-toggle
color="primary" [(ngModel)]="enableFileAutoDownload" id="enableFileAutoDownload" (change)="onEnableFileAutoDownloadChange()">
@@ -251,6 +251,10 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
selectedNodes = [];
enableDownloadPrompt: boolean = this.appConfig.get('viewer.enableDownloadPrompt', false);
enableDownloadPromptReminder: boolean = this.appConfig.get('viewer.enableDownloadPromptReminders', false);
downloadPromptDelay = this.appConfig.get('viewer.downloadPromptDelay', 50);
downloadPromptReminderDelay = this.appConfig.get('viewer.downloadPromptReminderDelay', 30);
enableFileAutoDownload: boolean = this.appConfig.get('viewer.enableFileAutoDownload', true);
fileAutoDownloadSizeThresholdInMB: number = this.appConfig.get('viewer.fileAutoDownloadSizeThresholdInMB', 15);
@@ -780,6 +784,26 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy {
this.selectedNodes = [];
}
onEnableDownloadPrompt() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableDownloadPrompt'] = this.enableDownloadPrompt;
}
onDownloadPromptDelayChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['downloadPromptDelay'] = this.downloadPromptDelay;
}
onEnableDownloadPromptReminderChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableDownloadPromptReminder'] = this.enableDownloadPromptReminder;
}
onDownloadPromptReminderChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['downloadPromptReminderDelay'] = this.downloadPromptReminderDelay;
}
onEnableFileAutoDownloadChange() {
const previewConfig = this.appConfig?.config['viewer'];
previewConfig['enableFileAutoDownload'] = this.enableFileAutoDownload;
+25
View File
@@ -380,6 +380,31 @@ In the same way you can set a default zoom scaling value for the image viewer by
By default the viewer's zoom scaling is set to 100%.
## Handling non responsive file preview
It is possible that trying to load a large file, especially over a slow network, can cause the viewer component to get stuck in the loading state. To handle such cases,
the viewer can be configured to display a prompt to ask the user to either download the file locally and then close the viewer, or wait for the viewer to load the file.
In case the user decides to wait, the viewer can further be configured to display subsequent reminder prompts asking the same options.
In order to configure this feature, add the following code in `app.config.json`.
```
"viewer": {
"enableDownloadPrompt": true,
"enableDownloadPromptReminder": true,
"downloadPromptDelay": 50,
"downloadPromptReminderDelay": 30
}
```
Here `enableDownloadPrompt: true` enables the dialog to be visible after a set period of time. This time can be configured by updating the value in the
`downloadPromptDelay` property.
The second boolean flag `enableDownloadPromptReminder: true` can be used to configure whether the reminder prompts should be displayed or not.
`downloadPromptReminderDelay` property can be used to configure the time to wait between reminder prompts.
Note: All times in this configuration must be provided in seconds
## See also
- [Document List component](../../content-services/components/document-list.component.md)
Binary file not shown.
+24
View File
@@ -0,0 +1,24 @@
@use 'sass:map';
@import './theme/theme-data';
$custom-theme: mat-light-theme(
(
color: (
primary: map.get($palettes, primary),
accent: map.get($palettes, accent),
warn: map.get($palettes, warning),
),
typography: $app-typography,
)
);
@if $background-color {
$custom-theme: get-custom-background-color(
$background-color,
$custom-theme
);
}
@if $text-color {
$custom-theme: get-custom-text-color($text-color, $custom-theme);
}
@@ -0,0 +1,25 @@
@use 'sass:map';
@use 'sass:color';
@function get-custom-background-color($background-color, $theme) {
$background: map.get($theme, background);
$card: map.get($background, card);
$new-card-color: color.adjust($background-color, $lightness: 10%);
$new-selected-button: color.adjust($background-color, $lightness: 5%);
$background: map.merge($background, (background: $background-color));
$background: map.merge($background, (card: $new-card-color));
$background: map.merge($background, (modal: $new-card-color));
$background: map.merge($background, (dialog: $new-card-color));
$background: map.merge($background, (selected-button: $new-selected-button));
$theme-with-new-background: map.merge($theme, (background: $background));
$theme-color: map.get($theme-with-new-background, color);
$theme-color-background: map.merge($theme-color, (background: $background));
$theme-with-new-background: map.merge($theme-with-new-background, (color: $theme-color-background));
@return $theme-with-new-background;
}
@@ -0,0 +1,153 @@
@use 'sass:map';
@use 'sass:math';
@use 'sass:color';
@use '../../colors';
@function multiply($fore, $back) {
$red: color.red($back) * color.red($fore) / 255;
$green: color.green($back) * color.green($fore) / 255;
$blue: color.blue($back) * color.blue($fore) / 255;
@return rgb($red, $green, $blue);
}
@function get-color-luminance($color) {
$colors: (
red: color.red($color),
green: color.green($color),
blue: color.blue($color),
);
@each $name, $value in $colors {
$adjusted: 0;
$value: $value / 255;
@if ($value < 0.0393) {
$value: $value / 12.92;
} @else {
$value: ($value + 0.055) / 1.055;
$value: math.pow($value, 2.4);
}
$colors: map.merge(
$colors,
(
$name: $value,
)
);
}
@return (map.get($colors, red) * 0.2126) + (map.get($colors, green) * 0.7152) + (map.get($colors, blue) * 0.0722);
}
@function create-text-color($color, $colorType: 'primary') {
$red: color.red($color);
$green: color.green($color);
$blue: color.blue($color);
$light-text: $light-primary-text;
$dark-text: $dark-primary-text;
@if $colorType == 'accent' {
$light-text: $light-secondary-text;
$dark-text: $dark-secondary-text;
}
$light-text-luminance: get-color-luminance($light-text);
$dark-text-luminance: get-color-luminance($dark-text);
$background-color-luminance: get-color-luminance($color);
$light-text-luminance: $light-text-luminance + 0.5;
$dark-text-luminance: $dark-text-luminance + 0.5;
$background-color-luminance: $background-color-luminance + 0.5;
$luminance-contrast-for-light-text: $light-text-luminance / $background-color-luminance;
$luminance-contrast-for-dark-text: $background-color-luminance / $dark-text-luminance;
$text-colour: $light-text;
@if $luminance-contrast-for-dark-text > $luminance-contrast-for-light-text {
$text-colour: $dark-text;
}
@return $text-colour;
}
@function create-color-palette($color, $colorType: 'primary') {
$light: #fff;
$dark: multiply($color, $color);
$color50: color.mix($light, $color, 88%);
$color100: color.mix($light, $color, 70%);
$color200: color.mix($light, $color, 50%);
$color300: color.mix($light, $color, 30%);
$color400: color.mix($light, $color, 15%);
$color500: color.mix($light, $color, 0%);
$color600: color.mix($dark, $color, 13%);
$color700: color.mix($dark, $color, 30%);
$color800: color.mix($dark, $color, 46%);
$color900: color.mix($dark, $color, 75%);
/* stylelint-disable scss/dollar-variable-pattern */
$colorA100: color.adjust(saturate(color.mix($dark, $color, 15%), 80%), $lightness: 45.6%);
$colorA200: color.adjust(saturate(color.mix($dark, $color, 15%), 80%), $lightness: 35.6%);
$colorA400: color.adjust(saturate(color.mix($dark, $color, 15%), 100%), $lightness: 25.6%);
$colorA700: color.adjust(saturate(color.mix($dark, $color, 15%), 100%), $lightness: 20.5%);
/* stylelint-enable scss/dollar-variable-pattern */
$contrast50: create-text-color($color50, $colorType);
$contrast100: create-text-color($color100, $colorType);
$contrast200: create-text-color($color200, $colorType);
$contrast300: create-text-color($color300, $colorType);
$contrast400: create-text-color($color400, $colorType);
$contrast500: create-text-color($color500, $colorType);
$contrast600: create-text-color($color600, $colorType);
$contrast700: create-text-color($color700, $colorType);
$contrast800: create-text-color($color800, $colorType);
$contrast900: create-text-color($color900, $colorType);
/* stylelint-disable scss/dollar-variable-pattern */
$contrastA100: create-text-color($colorA100, $colorType);
$contrastA200: create-text-color($colorA200, $colorType);
$contrastA400: create-text-color($colorA400, $colorType);
$contrastA700: create-text-color($colorA700, $colorType);
/* stylelint-enable scss/dollar-variable-pattern */
$palette: (
50: $color50,
100: $color50,
200: $color50,
300: $color50,
400: $color400,
500: $color500,
600: $color600,
700: $color700,
800: $color800,
900: $color900,
/* stylelint-disable value-keyword-case */
A100: $colorA100,
A200: $colorA200,
A400: $colorA400,
A700: $colorA700,
/* stylelint-enable value-keyword-case */
contrast: (
50: $contrast50,
100: $contrast100,
200: $contrast200,
300: $contrast300,
400: $contrast400,
500: $contrast500,
600: $contrast600,
700: $contrast700,
800: $contrast800,
900: $contrast900,
/* stylelint-disable value-keyword-case */
A100: $contrastA100,
A200: $contrastA200,
A400: $contrastA400,
A700: $contrastA700,
/* stylelint-enable value-keyword-case */
),
);
@return $palette;
}
@@ -0,0 +1,17 @@
@use 'sass:map';
@function get-custom-text-color($text-color, $theme) {
$foreground: map.get($theme, foreground);
$foreground: map.merge($foreground, (text: $text-color));
$foreground: map.merge($foreground, (secondary-text: $text-color));
$theme-with-new-foreground: map.merge($theme, (foreground: $foreground));
$theme-foreground-color: map.get($theme-with-new-foreground, color);
$theme-color-foreground: map.merge($theme-foreground-color, (foreground: $foreground));
$theme-with-new-foreground: map.merge($theme-with-new-foreground, (color: $theme-color-foreground));
@return $theme-with-new-foreground;
}
@@ -0,0 +1,31 @@
@use '@angular/material' as mat;
@import '../../colors';
@import './custom-palette-creator.scss';
@function get-mat-palettes($primary-color, $accent-color) {
$mat-primary-palette: null;
@if ($primary-color) {
$custom-theme-primary-palette: create-color-palette($primary-color, 'primary');
$mat-primary-palette: mat.define-palette($custom-theme-primary-palette, 500);
} @else {
$mat-primary-palette: mat.define-palette($aca-primary-blue, A100);
}
$mat-accent-palette: null;
@if ($accent-color) {
$custom-theme-accent-palette: create-color-palette($accent-color, 'accent');
$mat-accent-palette: mat.define-palette($custom-theme-accent-palette, 500);
} @else {
$mat-accent-palette: mat.define-palette($aca-accent-green, A200);
}
$mat-warn-palette: mat.define-palette($aca-warn, A100);
@return (
primary: $mat-primary-palette,
accent: $mat-accent-palette,
warning: $mat-warn-palette,
)
}
@@ -0,0 +1,14 @@
/*
Specify theme parameters e.g.:
$theme-config: (
primaryColor: #5175d2,
backgroundColor: #FAFAFA,
textColor: #793942,
accentColor: #C64F73,
baseFontSize: 26px,
fontFamily: Cursive
);
*/
${THEME_CONFIGURATION}
@@ -0,0 +1,22 @@
@use 'sass:map';
@import '@angular/material/theming';
@import './theme-configuration';
@import './typography';
@import './custom-theme-palettes';
@import './custom-background-color';
@import './custom-text-color';
$primary-color: map.get($theme-config, 'primaryColor');
$accent-color: map.get($theme-config, 'accentColor');
$background-color: map.get($theme-config, 'backgroundColor');
$text-color: map.get($theme-config, 'textColor');
$base-font-size: map.get($theme-config, 'baseFontSize');
$font-family: map.get($theme-config, 'fontFamily');
$app-typography: get-mat-typography(
$base-font-size,
$font-family
);
$palettes: get-mat-palettes($primary-color, $accent-color);
@@ -0,0 +1,93 @@
@use 'sass:map';
@use '@angular/material' as mat;
@import "../variables/font-family.scss";
@function get-mat-typography($base-font-size, $font-family) {
$custom-typography: mat.define-typography-config(
$font-family: 'Muli, Roboto, "Helvetica Neue", sans-serif',
$display-4: mat.define-typography-level(112px, 112px, 300),
$display-3: mat.define-typography-level(56px, 56px, 400),
$display-2: mat.define-typography-level(45px, 48px, 400),
$display-1: mat.define-typography-level(34px, 40px, 400),
$headline: mat.define-typography-level(24px, 32px, 400),
$title: mat.define-typography-level(20px, 32px, 500),
$subheading-2: mat.define-typography-level(16px, 28px, 400),
$subheading-1: mat.define-typography-level(15px, 24px, 400),
$body-2: mat.define-typography-level(14px, 24px, 500),
$body-1: mat.define-typography-level(14px, 20px, 400),
$caption: mat.define-typography-level(12px, 20px, 400),
$button: mat.define-typography-level(14px, 14px, 500),
// Line-height must be unit-less fraction of the font-size.
$input: mat.define-typography-level(16px, 1.25, 400),
);
@if $base-font-size {
$custom-typography: mat.define-typography-config(
$display-4: mat.define-typography-level(8rem, 8rem, 300),
$display-3: mat.define-typography-level(4rem, 4rem, 400),
$display-2: mat.define-typography-level(3.21rem, 3.21rem, 400),
$display-1: mat.define-typography-level(2.42rem, 2.85rem, 400),
$headline: mat.define-typography-level(1.71rem, 2.28rem, 400),
$title: mat.define-typography-level(1.42rem, 2.28rem, 500),
$subheading-2: mat.define-typography-level(1.14rem, 2rem, 400),
$subheading-1: mat.define-typography-level(1.07rem, 1.71rem, 400),
$body-2: mat.define-typography-level(1rem, 1.71rem, 500),
$body-1: mat.define-typography-level(1rem, 1.42rem, 400),
$caption: mat.define-typography-level(0.86rem, 1.42rem, 400),
$button: mat.define-typography-level(1rem, 1rem, 500),
$font-family: $default-font-family,
$input: mat.define-typography-level(1.14em, 1.25, 400),
);
}
@if $font-family {
@each $key, $level in $custom-typography {
@if type-of($level) == 'map' {
$new-level: map.merge(
$level,
(
font-family: $font-family,
)
);
$custom-typography: map.merge(
$custom-typography,
(
$key: $new-level,
)
);
}
}
$custom-typography: map.merge(
$custom-typography,
(
font-family: $font-family,
)
);
}
@return $custom-typography;
}
@function get-custom-adf-font-sizes() {
@return (
'theme-adf-icon-1-font-size': 1.2rem,
'theme-adf-picture-1-font-size': 1.28rem,
'theme-adf-task-footer-font-size': 1.28rem,
'theme-adf-task-title-font-size': 1.28rem
);
}
@mixin base-font-size($font-size) {
html,
body {
font-size: $font-size !important;
}
}
@mixin base-font-family($font-family) {
html,
body {
font-family: $font-family !important;
}
}
@@ -0,0 +1 @@
$default-font-family: 'Open Sans';
+5
View File
@@ -2,6 +2,11 @@
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../dist/libs/core",
"assets": [
{
"glob": "custom-theme/**/*",
"input": "./",
"output": "/"
},
{
"glob": "assets/**/*",
"input": "./src/lib",
+7 -2
View File
@@ -391,7 +391,8 @@
"FULLSCREEN": "Activate full-screen mode",
"CLOSE": "Close",
"NEXT_FILE": "Next File",
"PREV_FILE": "Previous File"
"PREV_FILE": "Previous File",
"WAIT": "Wait"
},
"ARIA": {
"PREVIOUS_PAGE": "Previous page",
@@ -429,7 +430,11 @@
"PLACEHOLDER": "Password",
"ERROR": "Password is wrong"
},
"SUBTITLES": "Subtitles"
"SUBTITLES": "Subtitles",
"NON_RESPONSIVE_DIALOG": {
"HEADER": "Preview loading delayed",
"LABEL": "You can continue to wait, or download the document."
}
},
"ERROR_CONTENT": {
"UNKNOWN": {
@@ -0,0 +1,23 @@
<div mat-dialog-title>
<h3>{{ 'ADF_VIEWER.NON_RESPONSIVE_DIALOG.HEADER' | translate }}</h3>
</div>
<mat-dialog-content>
{{ 'ADF_VIEWER.NON_RESPONSIVE_DIALOG.LABEL' | translate }}
</mat-dialog-content>
<mat-dialog-actions align="end">
<button
mat-button
id="downloadButton"
[attr.aria-label]="'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate"
[mat-dialog-close]="DownloadPromptActions.DOWNLOAD">
{{ 'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate }}
</button>
<button
mat-button
id="waitButton"
color="primary"
[attr.aria-label]="'ADF_VIEWER.ACTIONS.WAIT' | translate"
[mat-dialog-close]="DownloadPromptActions.WAIT">
{{ 'ADF_VIEWER.ACTIONS.WAIT' | translate }}
</button>
</mat-dialog-actions>
@@ -0,0 +1,73 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CoreTestingModule, DownloadPromptDialogComponent, DownloadPromptActions } from '@alfresco/adf-core';
import { By } from '@angular/platform-browser';
import { MatDialogRef } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
const mockDialog = {
close: jasmine.createSpy('close')
};
describe('DownloadPromptDialogComponent', () => {
let matDialogRef: MatDialogRef<DownloadPromptDialogComponent>;
let fixture: ComponentFixture<DownloadPromptDialogComponent>;
const getButton = (buttonId: string) => {
return fixture.debugElement.query(By.css(buttonId)).nativeElement;
};
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [DownloadPromptDialogComponent],
imports: [
TranslateModule.forRoot(),
CoreTestingModule
],
providers: [
{ provide: MatDialogRef, useValue: mockDialog }
]
});
matDialogRef = TestBed.inject(MatDialogRef);
fixture = TestBed.createComponent(DownloadPromptDialogComponent);
fixture.detectChanges();
});
it('should emit DownloadPromptActions.WAIT and close dialog when clicking on the wait button', async () => {
const waitButton = getButton('#waitButton');
waitButton.dispatchEvent(new Event('click'));
await fixture.detectChanges();
await fixture.whenStable();
expect(matDialogRef.close).toHaveBeenCalledWith(DownloadPromptActions.WAIT);
});
it('should emit DownloadPromptActions.DOWNLOAD and close dialog when clicking on the download button', async () => {
const waitButton = getButton('#downloadButton');
waitButton.dispatchEvent(new Event('click'));
await fixture.detectChanges();
await fixture.whenStable();
expect(matDialogRef.close).toHaveBeenCalledWith(DownloadPromptActions.DOWNLOAD);
});
});
@@ -0,0 +1,27 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component } from '@angular/core';
import { DownloadPromptActions } from '../../models/download-prompt.actions';
@Component({
selector: 'adf-download-prompt-dialog',
templateUrl: './download-prompt-dialog.component.html'
})
export class DownloadPromptDialogComponent {
DownloadPromptActions = DownloadPromptActions;
}
@@ -15,7 +15,7 @@
* limitations under the License.
*/
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ComponentFixture, discardPeriodicTasks, fakeAsync, flush, TestBed, tick } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { MatDialog } from '@angular/material/dialog';
@@ -24,12 +24,15 @@ import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import {
CoreTestingModule,
setupTestBed,
EventMock,
ViewerComponent,
ViewUtilService
ViewUtilService,
AppConfigService,
DownloadPromptDialogComponent,
DownloadPromptActions
} from '@alfresco/adf-core';
import { Component } from '@angular/core';
import { of } from 'rxjs';
@Component({
selector: 'adf-viewer-container-toolbar',
@@ -135,35 +138,48 @@ describe('ViewerComponent', () => {
let element: HTMLElement;
let dialog: MatDialog;
let viewUtilService: ViewUtilService;
setupTestBed({
imports: [
NoopAnimationsModule,
TranslateModule.forRoot(),
CoreTestingModule,
MatButtonModule,
MatIconModule
],
declarations: [
ViewerWithCustomToolbarComponent,
ViewerWithCustomSidebarComponent,
ViewerWithCustomOpenWithComponent,
ViewerWithCustomMoreActionsComponent,
ViewerWithCustomToolbarActionsComponent
],
providers: [
MatDialog
]
});
let appConfigService: AppConfigService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
TranslateModule.forRoot(),
CoreTestingModule,
MatButtonModule,
MatIconModule
],
declarations: [
ViewerWithCustomToolbarComponent,
ViewerWithCustomSidebarComponent,
ViewerWithCustomOpenWithComponent,
ViewerWithCustomMoreActionsComponent,
ViewerWithCustomToolbarActionsComponent
],
providers: [
MatDialog,
{ provide: DownloadPromptDialogComponent, useClass: DummyDialogComponent}
]
});
fixture = TestBed.createComponent(ViewerComponent);
element = fixture.nativeElement;
component = fixture.componentInstance;
dialog = TestBed.inject(MatDialog);
viewUtilService = TestBed.inject(ViewUtilService);
appConfigService = TestBed.inject(AppConfigService);
component.fileName = 'test-file.pdf';
appConfigService.config = {
...appConfigService.config,
'viewer': {
'enableDownloadPrompt': false,
'enableDownloadPromptReminder': false,
'downloadPromptDelay': 3,
'downloadPromptReminderDelay': 2
}
};
});
afterEach(() => {
@@ -604,4 +620,60 @@ describe('ViewerComponent', () => {
});
});
});
describe('Download Prompt Dialog',() => {
let dialogOpenSpy: jasmine.Spy;
beforeEach(() => {
appConfigService.config = {
...appConfigService.config,
'viewer': {
'enableDownloadPrompt': true,
'enableDownloadPromptReminder': true,
'downloadPromptDelay': 3,
'downloadPromptReminderDelay': 2
}
};
dialogOpenSpy = spyOn(dialog, 'open').and.returnValue({afterClosed: () => of(null)} as any);
component.urlFile = undefined;
component.clearDownloadPromptTimeouts();
});
it('should configure initial timeout to display non responsive dialog when initialising component', (() => {
fixture.detectChanges();
expect(component.downloadPromptTimer).toBeDefined();
}));
it('should configure reminder timeout to display non responsive dialog after initial dialog', fakeAsync( () => {
dialogOpenSpy.and.returnValue({ afterClosed: () => of(DownloadPromptActions.WAIT) } as any);
fixture.detectChanges();
tick(3000);
expect(component.downloadPromptReminderTimer).toBeDefined();
dialogOpenSpy.and.returnValue({ afterClosed: () => of(null) } as any);
flush();
discardPeriodicTasks();
}));
it('should show initial non responsive dialog after initial timeout', fakeAsync( () => {
fixture.detectChanges();
tick(3000);
fixture.detectChanges();
expect(dialogOpenSpy).toHaveBeenCalled();
}));
it('should show reminder non responsive dialog after initial dialog', fakeAsync( () => {
dialogOpenSpy.and.returnValue({ afterClosed: () => of(DownloadPromptActions.WAIT) } as any);
fixture.detectChanges();
tick(3000);
expect(dialogOpenSpy).toHaveBeenCalled();
dialogOpenSpy.and.returnValue({ afterClosed: () => of(null) } as any);
tick(2000);
expect(dialogOpenSpy).toHaveBeenCalledTimes(2);
flush();
discardPeriodicTasks();
}));
});
});
@@ -30,15 +30,25 @@ import {
TemplateRef,
ViewEncapsulation
} from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { fromEvent, Subject } from 'rxjs';
import { MatDialog } from '@angular/material/dialog';
import { ViewerToolbarComponent } from './viewer-toolbar.component';
import { ViewerOpenWithComponent } from './viewer-open-with.component';
import { ViewerMoreActionsComponent } from './viewer-more-actions.component';
import { ViewerSidebarComponent } from './viewer-sidebar.component';
import { filter, skipWhile, takeUntil } from 'rxjs/operators';
import { filter, first, skipWhile, takeUntil } from 'rxjs/operators';
import { Track } from '../models/viewer.model';
import { ViewUtilService } from '../services/view-util.service';
import { DownloadPromptDialogComponent } from './download-prompt-dialog/download-prompt-dialog.component';
import { AppConfigService } from '../../app-config';
import { DownloadPromptActions } from '../models/download-prompt.actions';
const DEFAULT_NON_PREVIEW_CONFIG = {
enableDownloadPrompt: false,
enableDownloadPromptReminder: false,
downloadPromptDelay: 50,
downloadPromptReminderDelay: 30
};
@Component({
selector: 'adf-viewer',
@@ -160,6 +170,26 @@ export class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges {
@Input()
sidebarLeftTemplateContext: T = null;
/**
* Enable dialog box to allow user to download the previewed file, in case the preview is not responding for a set period of time.
* */
enableDownloadPrompt: boolean = false;
/**
* Enable reminder dialogs to prompt user to download the file, in case the preview is not responding for a set period of time.
* */
enableDownloadPromptReminder: boolean = false;
/**
* Initial time in seconds to wait before giving the first prompt to user to download the file
* */
downloadPromptDelay: number = 50;
/**
* Time in seconds to wait before giving the second and consequent reminders to the user to download the file.
* */
downloadPromptReminderDelay: number = 15;
/** Emitted when user clicks 'Navigate Before' ("<") button. */
@Output()
navigateBefore = new EventEmitter<MouseEvent | KeyboardEvent>();
@@ -180,10 +210,14 @@ export class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges {
private closeViewer = true;
private keyDown$ = fromEvent<KeyboardEvent>(document, 'keydown');
private isDialogVisible: boolean = false;
public downloadPromptTimer: number;
public downloadPromptReminderTimer: number;
constructor(private el: ElementRef,
public dialog: MatDialog,
private viewUtilsService: ViewUtilService
private viewUtilsService: ViewUtilService,
private appConfigService: AppConfigService
) {
}
@@ -202,6 +236,7 @@ export class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges {
ngOnInit(): void {
this.closeOverlayManager();
this.configureAndInitDownloadPrompt();
}
private closeOverlayManager() {
@@ -304,8 +339,64 @@ export class ViewerComponent<T> implements OnDestroy, OnInit, OnChanges {
}
ngOnDestroy() {
this.clearDownloadPromptTimeouts();
this.onDestroy$.next(true);
this.onDestroy$.complete();
}
private configureAndInitDownloadPrompt() {
this.configureDownloadPromptProperties();
if (this.enableDownloadPrompt) {
this.initDownloadPrompt();
}
}
private configureDownloadPromptProperties() {
const nonResponsivePreviewConfig = this.appConfigService.get('viewer', DEFAULT_NON_PREVIEW_CONFIG);
this.enableDownloadPrompt = nonResponsivePreviewConfig.enableDownloadPrompt;
this.enableDownloadPromptReminder = nonResponsivePreviewConfig.enableDownloadPromptReminder;
this.downloadPromptDelay = nonResponsivePreviewConfig.downloadPromptDelay;
this.downloadPromptReminderDelay = nonResponsivePreviewConfig.downloadPromptReminderDelay;
}
private initDownloadPrompt() {
this.downloadPromptTimer = window.setTimeout(() => {
this.showOrClearDownloadPrompt();
}, this.downloadPromptDelay * 1000);
}
private showOrClearDownloadPrompt() {
if (!this.urlFile) {
this.showDownloadPrompt();
} else {
this.clearDownloadPromptTimeouts();
}
}
public clearDownloadPromptTimeouts() {
if (this.downloadPromptTimer) {
clearTimeout(this.downloadPromptTimer);
}
if (this.downloadPromptReminderTimer) {
clearTimeout(this.downloadPromptReminderTimer);
}
}
private showDownloadPrompt() {
if (!this.isDialogVisible) {
this.isDialogVisible = true;
this.dialog.open(DownloadPromptDialogComponent, { disableClose: true }).afterClosed().pipe(first()).subscribe((result: DownloadPromptActions) => {
this.isDialogVisible = false;
if (result === DownloadPromptActions.WAIT) {
if (this.enableDownloadPromptReminder) {
this.clearDownloadPromptTimeouts();
this.downloadPromptReminderTimer = window.setTimeout(() => {
this.showOrClearDownloadPrompt();
}, this.downloadPromptReminderDelay * 1000);
}
}
});
}
}
}
@@ -0,0 +1,22 @@
/*!
* @license
* Copyright 2019 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Enum listing the allowed actions that can be emitted from the NonResponsivePreview dialog component */
export enum DownloadPromptActions {
'WAIT',
'DOWNLOAD'
}
+2
View File
@@ -33,9 +33,11 @@ export * from './components/viewer-toolbar-actions.component';
export * from './components/viewer-toolbar-custom-actions.component';
export * from './components/viewer-render.component';
export * from './components/viewer.component';
export * from './components/download-prompt-dialog/download-prompt-dialog.component';
export * from './directives/viewer-extension.directive';
export * from './viewer.module';
export * from './models/viewer.model';
export * from './models/download-prompt.actions';
+3 -1
View File
@@ -45,6 +45,7 @@ import { DirectiveModule } from '../directives/directive.module';
import { A11yModule } from '@angular/cdk/a11y';
import { ViewerComponent } from './components/viewer.component';
import { ViewerToolbarCustomActionsComponent } from './components/viewer-toolbar-custom-actions.component';
import { DownloadPromptDialogComponent } from './components/download-prompt-dialog/download-prompt-dialog.component';
@NgModule({
imports: [
@@ -77,7 +78,8 @@ import { ViewerToolbarCustomActionsComponent } from './components/viewer-toolbar
ViewerMoreActionsComponent,
ViewerToolbarActionsComponent,
ViewerComponent,
ViewerToolbarCustomActionsComponent
ViewerToolbarCustomActionsComponent,
DownloadPromptDialogComponent
],
exports: [
ViewerRenderComponent,
@@ -69,7 +69,7 @@ export class ProcessListCloudComponent extends DataTableSchema<ProcessListDataCo
/** Filter the processes to display only the ones with this environment ID. */
@Input()
environmentId: string = '';
environmentId: string;
/** Filter the processes to display only the ones with this name. */
@Input()
+3 -3
View File
@@ -34792,9 +34792,9 @@
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
},
"ng-mocks": {
"version": "14.7.2",
"resolved": "https://registry.npmjs.org/ng-mocks/-/ng-mocks-14.7.2.tgz",
"integrity": "sha512-AzGDWed14IgamsTmBp6RG6eg+WU/9BIiDANSmtHgmZzg7P3pz5SkuHjpgVFOgDP/U7YOMD1F9uilXL42+0EWAQ==",
"version": "14.8.0",
"resolved": "https://registry.npmjs.org/ng-mocks/-/ng-mocks-14.8.0.tgz",
"integrity": "sha512-bL1qi96/XuwjZijr4lE4R6NHlgeMivLYiCzrzWFh3x93JHeZf2jDLfOsm7BUIQHwXTYODPHyGvnCadEb44k4Rg==",
"dev": true
},
"ng-packagr": {
+1 -1
View File
@@ -163,7 +163,7 @@
"lite-server": "^2.6.1",
"mini-css-extract-plugin": "^1.6.0",
"nconf": "^0.12.0",
"ng-mocks": "^14.7.2",
"ng-mocks": "^14.8.0",
"ng-packagr": "14.0.3",
"nx": "14.4.2",
"postcss": "^8.4.5",
+20 -5
View File
@@ -2,6 +2,7 @@
set -e
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
verifyLib=$1;
deps=$2;
cd $DIR/../../
if [ "${GITHUB_EVENT_NAME}" == "schedule" ]; then
@@ -9,13 +10,27 @@ if [ "${GITHUB_EVENT_NAME}" == "schedule" ]; then
echo true
exit 0
fi
isAffected=false
AFFECTED_LIBS=$(npx nx print-affected --type=lib --select=projects ${NX_CALCULATION_FLAGS} --plain)
#echo "Verify if affected build contains $1"
#echo "Affected libs:$AFFECTED_LIBS"
if [[ $AFFECTED_LIBS =~ $verifyLib ]]; then
#echo "Yep project:$verifyLib is affected carry on"
echo true
else
#echo "Nope project NOT affected save time"
echo false
#echo "Yep project:$verifyLib is affected carry on"
isAffected=true
fi;
if [[ $isAffected == false ]]; then
# echo "Read the deps as array"
IFS=',' read -ra depsArray <<< "$deps"
#echo "Loop through the deps to check if they are affected"
for i in "${depsArray[@]}"
do
if [[ $AFFECTED_LIBS =~ $i ]]; then
isAffected=true;
break
fi;
done;
fi;
echo $isAffected;
+7 -6
View File
@@ -7,21 +7,22 @@ cd $DIR/../../../
BASE_DIRECTORY=$(echo "$FOLDER" | cut -d "/" -f1)
verifyLib=$1;
deps=$2;
REGEX="(repository|workflow)_dispatch"
# set test-e2e params
if [ -n "$2" ]; then
e2eParams="--$2"
if [ -n "$3" ]; then
e2eParams="--$3"
else
e2eParams=""
fi
echo "Step1 - Verify if affected libs contains $verifyLib"
echo "Step1 - Verify if affected libs contains $verifyLib or if deps $deps are affected"
AFFECTED_LIB=$(./scripts/github/affected-contains.sh $verifyLib )
AFFECTED_LIB=$(./scripts/github/affected-contains.sh $verifyLib $deps)
if [ ${AFFECTED_LIB} == true ]; then
echo "Step2 - $verifyLib affected... will execute e2e"
echo "Step2 - $verifyLib OR deps $deps affected... will execute e2e"
if [ "${GITHUB_EVENT_NAME}" == "pull_request" ]; then
echo "Calculate affected e2e $BASE_HASH $HEAD_HASH"
@@ -54,6 +55,6 @@ if [ ${AFFECTED_LIB} == true ]; then
fi;
else
echo "Step2 - Lib $verifyLib NOT affected. No need to run e2e"
echo "Step2 - Lib $verifyLib OR deps $deps NOT affected. No need to run e2e"
exit 0
fi
+11 -3
View File
@@ -31,7 +31,8 @@
"vh",
"vw",
"vmin",
"s"
"s",
"rem"
],
"value-list-comma-space-after": "always-single-line",
"value-list-comma-space-before": "never",
@@ -62,7 +63,12 @@
"message": "The `initial` value is not supported in IE."
}
],
"block-closing-brace-newline-after": "always",
"block-closing-brace-newline-after": [
"always",
{
"ignoreAtRules": ["if", "else"]
}
],
"block-closing-brace-newline-before": "always-multi-line",
"block-opening-brace-newline-after": "always-multi-line",
"block-opening-brace-space-before": "always-multi-line",
@@ -89,6 +95,8 @@
{
"resolveNestedSelectors": true
}
]
],
"scss/dollar-variable-empty-line-before": null,
"scss/at-rule-conditional-no-parentheses": null
}
}