diff --git a/.browserslistrc b/.browserslistrc
index 342360874..b15c7fae5 100644
--- a/.browserslistrc
+++ b/.browserslistrc
@@ -9,4 +9,4 @@
last 2 versions
Firefox ESR
not dead
-IE 9-11 # For IE 9-11 support, remove 'not'.
\ No newline at end of file
+not IE 9-11 # For IE 9-11 support, remove 'not'.
diff --git a/.gitignore b/.gitignore
index ecdde8d2a..d08c23af6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,6 +53,7 @@ static/
.vscode/
package-lock.json
+yarn.lock
src/config.json
src/config-template.json
src/assets/icons/*
diff --git a/.wvr-ud/static-assets/wud.js b/.wvr-ud/static-assets/wud.js
deleted file mode 100644
index 2476bfc0e..000000000
--- a/.wvr-ud/static-assets/wud.js
+++ /dev/null
@@ -1,238 +0,0 @@
-let componentManifest = JSON.parse($('#expamples-manifest').html());
-let editorElem = document.querySelector('#editor');
-let previewElem = document.querySelector('#preview');
-let desciptionElem = document.querySelector('#desciption');
-let templateElem = document.querySelector('#template');
-let activeExampleNameElem = document.querySelector('#active-component-name');
-let componentCollectionsList = document.querySelector('#component-collections');
-let componentCollectionTemplate = document.querySelector('#component-collection-template');
-let componentLinkTemplate = document.querySelector('#component-link-template');
-let editor;
-let scssEditor;
-let templateEditor;
-let sourceEditor;
-let components = [];
-let activeExample;
-let setupPromise;
-
-let setupEditor = () => {
- editor = ace.edit("editor");
- editor.getSession().setUseWorker(false);
- editor.setTheme("ace/theme/monokai");
- editor.getSession().setMode("ace/mode/html");
- let debounce;
- editor.getSession().on('change', function(e) {
- if(debounce) clearTimeout(debounce);
- document.querySelector("main").classList.add('loading');
- debounce = setTimeout(function() {
- if(activeExample.querySelector('snippet').rawHTML !== editor.getSession().getValue()) {
- activeExample.querySelector('snippet').rawHTML = editor.getSession().getValue();
- before = editor.selection.toJSON();
- loadExample(activeExample);
- editor.selection.fromJSON(before);
- }
- document.querySelector("main").classList.remove('loading');
- }, 500);
- });
- templateEditor = ace.edit("template-editor");
- templateEditor.setOptions({
- readOnly: true,
- highlightActiveLine: false,
- highlightGutterLine: false,
- theme: 'ace/theme/monokai',
- mode: 'ace/mode/html'
- });
- templateEditor.renderer.$cursorLayer.element.style.opacity=0;
- scssEditor = ace.edit("scss-editor");
- scssEditor.setOptions({
- readOnly: true,
- highlightActiveLine: false,
- highlightGutterLine: false,
- theme: 'ace/theme/monokai',
- mode: 'ace/mode/scss'
- });
- scssEditor.renderer.$cursorLayer.element.style.opacity=0;
- sourceEditor = ace.edit("source-editor");
- sourceEditor.setOptions({
- readOnly: true,
- highlightActiveLine: false,
- highlightGutterLine: false,
- theme: 'ace/theme/monokai',
- mode: 'ace/mode/typescript'
- });
- sourceEditor.renderer.$cursorLayer.element.style.opacity=0;
-}
-
-let setupComponentLinks = ()=>{
- setupPromise = new Promise((resolve, reject) => {
- let componentManifestKeys = Object.keys(componentManifest);
- interationCount = 0;
- componentManifestKeys.forEach(componentName=>{
- let componentUri = componentManifest[componentName];
- let xhr = new XMLHttpRequest();
- xhr.onload = function() {
- let examples = [];
- this.responseXML.querySelectorAll('example').forEach(example=>{
- examples.push(example);
- });
- components.push({
- name: componentName,
- examples: examples
- });
- interationCount++;
- if(interationCount===componentManifestKeys.length) {
- resolve();
- }
- }
- xhr.open( 'GET', componentUri );
- xhr.responseType = 'document';
- xhr.send();
- });
- });
- document.querySelector('.expand-collapse-all').addEventListener('click', e=>{
- e.preventDefault();
-
- e.currentTarget.classList.contains('open') ?
- $('.component-links').collapse('hide') :
- $('.component-links').collapse('show')
- e.currentTarget.classList.contains('open') ?
- e.currentTarget.classList.remove('open') :
- e.currentTarget.classList.add('open')
- });
-}
-
-let loadExample = (example) => {
- let snippet = example.querySelector('snippet').rawHTML;
- let desciption = example.querySelector('desciption').innerHTML;
- let componentScss = example.querySelector('component-scss').innerHTML;
- let componentSource = example.querySelector('component-source').innerHTML;
- let componentTemplate = example.querySelector('component-template').rawTemplateHTML;
- document.querySelector('#copy-btn').setAttribute('data-clipboard-text', snippet);
- activeExampleNameElem.innerText = example.getAttribute('name');
- previewElem.innerHTML = snippet;
- desciptionElem.innerHTML = desciption;
- scssEditor.getSession().setValue(componentScss);
- templateEditor.getSession().setValue(componentTemplate);
- sourceEditor.getSession().setValue(componentSource);
- editor.getSession().setValue(snippet);
-};
-
-let renderComponentLinks = componentsToRender => {
- componentsToRender.sort();
- componentsToRender.forEach(component=> {
- let componentCollectionClone = componentCollectionTemplate.content.cloneNode(true);
- let componentLinksElem = componentCollectionClone.querySelector('ul.component-links');
- let componentCollectionLink = componentCollectionClone.querySelector('.component-collection-link')
- componentCollectionClone.querySelector('.component-collection-name').innerText = component.name;
- componentCollectionLink.setAttribute('href', `#${component.name}`);
- $(document).on('show.bs.collapse hide.bs.collapse', componentCollectionLink, function (e) {
- let ccl = e.target.closest('.nav-item');
- e.type === 'hide' ?
- ccl.classList.add('closed') :
- ccl.classList.remove('closed');
- });
- componentCollectionClone.querySelector('.component-links').setAttribute('id', component.name);
- component.examples.forEach(example=>{
- let componentLinkTemplateClone = componentLinkTemplate.content.cloneNode(true);
- componentLinkTemplateClone.querySelector('a.nav-link').setAttribute('href', `#${example.getAttribute('name').replace(/\s/g,'')}`);
- componentLinkTemplateClone.querySelector('.component-link-name').innerText = example.getAttribute('name');
- componentLinkTemplateClone.querySelector('a.nav-link').addEventListener('click', function(e) {
- document.querySelectorAll('a.component-link').forEach(navLink=>navLink.classList.remove('active'));
- e.target.closest('a.component-link').classList.add('active');
- component.examples.forEach(example=>{
- if(example.getAttribute('name').trim()===e.target.innerText.trim()) {
- activeExample=example;
- activeExample.querySelector('snippet').rawHTML = activeExample.querySelector('snippet').innerHTML;
- activeExample.querySelector('component-template').rawTemplateHTML = activeExample.querySelector('component-template').innerHTML;
- loadExample(example);
- }
- });
- });
- componentLinksElem.appendChild(componentLinkTemplateClone);
- componentCollectionsList.appendChild(componentCollectionClone);
- });
- });
-}
-
-let loadInitialContent = () => {
- let currentUrl = document.URL;
- let urlParts = currentUrl.split('#');
- let anchor = (urlParts.length > 1) ? urlParts[1] : null;
- if(anchor) {
- let activeComponentLink = document.querySelector(`a.nav-link[href='#${anchor}']`);
- $(activeComponentLink.closest('.component-links')).collapse('show');
- activeComponentLink.click();
- }
-}
-
-let setupClipboard = () => {
- $('button').tooltip({
- trigger: 'click',
- placement: 'bottom'
- });
- function setTooltip(message) {
- $('button').tooltip('hide')
- .attr('data-original-title', message)
- .tooltip('show');
- }
- function hideTooltip() {
- setTimeout(function() {
- $('button').tooltip('hide');
- }, 1000);
- }
- var clipboard = new ClipboardJS('#copy-btn');
- clipboard.on('success', function(e) {
- setTooltip('Copied!');
- hideTooltip();
- });
- clipboard.on('error', function(e) {
- setTooltip('Failed!');
- hideTooltip();
- });
-}
-
-// Setup Tabs
-const setupTabs = () => {
- // Tab funcitonality
- $('#tabs a').on('click', function (e) {
- e.preventDefault();
- $(this).tab('show');
- loadExample(activeExample, true);
- });
-}
-
-// Setup Search
-const setUpSearch = () => {
- let search = searchQuery => {
- renderComponentLinks(components.filter(c=>{
- match = false;
- c.examples.forEach(e=>{
- if(!match)
- match = e.getAttribute('name').toLowerCase().includes(searchQuery.toLowerCase());
- });
- return match;
- }));
- if($('.component-links').length !== components.length) {
- $('.component-links').collapse('show');
- } else {
- $('.component-links').collapse('hide');
- loadInitialContent();
- }
- }
-
- $('.search').on("keyup", $.debounce(500, e=>{
- componentCollectionsList.innerHTML = '';
- search(e.target.value);
- }));
-}
-
-setupEditor();
-setupComponentLinks();
-setupClipboard();
-setupTabs();
-setUpSearch();
-
-setupPromise.then(()=>{
- renderComponentLinks(components);
- loadInitialContent();
-});
diff --git a/angular.json b/angular.json
index 3678f4657..08024220d 100644
--- a/angular.json
+++ b/angular.json
@@ -15,7 +15,7 @@
"prefix": "tl",
"architect": {
"build": {
- "builder": "@angular-devkit/build-angular:browser",
+ "builder": "ngx-build-plus:browser",
"options": {
"preserveSymlinks": true,
"outputPath": "dist/tl-components",
@@ -33,14 +33,10 @@
"styles": [
"src/styles.scss"
],
- "scripts": [
- {
- "input": "node_modules/document-register-element/build/document-register-element.js",
- "inject": true
- }
- ],
+ "scripts": [],
"allowedCommonJsDependencies": [
- "css-element-queries"
+ "css-element-queries",
+ "handlebars/dist/cjs/handlebars"
]
},
"configurations": {
@@ -63,20 +59,15 @@
"budgets": [
{
"type": "initial",
- "maximumWarning": "2.2mb",
+ "maximumWarning": "3mb",
"maximumError": "4mb"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "250kb",
- "maximumError": "500kb"
}
]
}
}
},
"serve": {
- "builder": "@angular-devkit/build-angular:dev-server",
+ "builder": "ngx-build-plus:dev-server",
"options": {
"browserTarget": "tamu-library-components:build"
},
@@ -93,7 +84,7 @@
}
},
"test": {
- "builder": "@angular-devkit/build-angular:karma",
+ "builder": "ngx-build-plus:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
diff --git a/package.json b/package.json
index f988b168c..d7c62c307 100755
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
{
"name": "tamu-library-components",
- "version": "1.6.3",
+ "version": "1.6.4",
"private": true,
"config": {
"DOCKER_SERVER": "10.55.134.48/weaver/tl-components"
},
"scripts": {
- "build": "ng build --prod --output-hashing none",
+ "build": "ng build --prod --single-bundle --output-hashing none",
"build:clean": "npm run clean && npm run build",
"build:docs-development": "compodoc --output ./static/tamu-library-components/docs/development -p ./src/tsconfig.docs.json",
"build:docs-setup": "node scripts/build-tl-components-docs.js",
@@ -40,66 +40,66 @@
"test:watch": "ng test"
},
"dependencies": {
- "@angular/animations": "^11.0.2",
- "@angular/common": "^11.0.2",
- "@angular/compiler": "^11.0.2",
- "@angular/core": "^11.0.2",
- "@angular/elements": "^11.0.2",
- "@angular/forms": "^11.0.2",
- "@angular/localize": "^11.0.2",
- "@angular/platform-browser": "^11.0.2",
- "@angular/platform-browser-dynamic": "^11.0.2",
- "@angular/router": "^11.0.2",
- "@ng-bootstrap/ng-bootstrap": "^7.0.0",
- "@ngrx/effects": "^10.0.1",
- "@ngrx/entity": "^10.0.1",
- "@ngrx/store": "^10.0.1",
- "@ngrx/store-devtools": "^10.0.1",
- "@wvr/elements": "1.7.1",
- "bootstrap": "^4.5.2",
- "classlist.js": "^1.1.20150312",
- "console-stamp": "^0.2.9",
+ "@angular/animations": "^11.0.3",
+ "@angular/common": "^11.0.3",
+ "@angular/compiler": "^11.0.3",
+ "@angular/core": "^11.0.3",
+ "@angular/elements": "^11.0.3",
+ "@angular/forms": "^11.0.3",
+ "@angular/localize": "^11.0.3",
+ "@angular/platform-browser": "^11.0.3",
+ "@angular/platform-browser-dynamic": "^11.0.3",
+ "@angular/router": "^11.0.3",
+ "@ng-bootstrap/ng-bootstrap": "^8.0.0",
+ "@ngrx/effects": "^10.1.0",
+ "@ngrx/entity": "^10.1.0",
+ "@ngrx/store": "^10.1.0",
+ "@ngrx/store-devtools": "^10.1.0",
+ "@wvr/elements": "1.7.2",
+ "bootstrap": "^4.5.3",
"document-register-element": "^1.14.5",
"handlebars": "^4.7.6",
- "ie11-custom-properties": "^4.1.0",
"jsdom": "^16.4.0",
"karma-viewport": "^1.0.7",
- "rxjs": "~6.6.2",
- "tslib": "^2.0.0",
+ "ng-lazyload-image": "^9.1.0",
+ "ngx-build-plus": "^10.1.1",
+ "rxjs": "~6.6.3",
+ "tslib": "^2.0.3",
"web-animations-js": "^2.3.2",
- "zone.js": "~0.10.3"
+ "zone.js": "~0.11.3"
},
"devDependencies": {
- "@angular-devkit/build-angular": "~0.1100.2",
- "@angular-devkit/schematics": "^11.0.2",
- "@angular/cli": "^11.0.2",
- "@angular/compiler-cli": "^11.0.2",
- "@angular/language-service": "^11.0.2",
+ "@angular-devkit/build-angular": "~0.1100.3",
+ "@angular-devkit/schematics": "^11.0.3",
+ "@angular/cli": "^11.0.3",
+ "@angular/compiler-cli": "^11.0.3",
+ "@angular/language-service": "^11.0.3",
"@compodoc/compodoc": "^1.1.11",
- "@lhci/cli": "^0.5.0",
- "@types/jasmine": "~3.6.0",
+ "@lhci/cli": "^0.6.1",
+ "@types/jasmine": "~3.6.2",
"@types/jasminewd2": "~2.0.8",
- "@types/node": "^14.6.0",
+ "@types/node": "^14.14.10",
"angular-tslint-rules": "^1.20.4",
- "codelyzer": "^6.0.0",
+ "codelyzer": "^6.0.1",
"concat": "^1.0.3",
+ "console-stamp": "^0.2.9",
"coveralls": "^3.1.0",
- "dotenv-override-true": "^6.2.1",
+ "dotenv-override-true": "^6.2.2",
"glob": "^7.1.6",
"jasmine-core": "~3.6.0",
- "jasmine-spec-reporter": "~5.0.0",
- "karma": "~5.1.1",
+ "jasmine-spec-reporter": "~6.0.0",
+ "karma": "~5.2.3",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.3",
- "karma-jasmine": "~4.0.0",
- "karma-jasmine-html-reporter": "^1.5.0",
- "lighthouse": "^6.2.0",
- "lighthouse-badges": "^1.0.33",
+ "karma-jasmine": "~4.0.1",
+ "karma-jasmine-html-reporter": "^1.5.4",
+ "lighthouse": "^6.5.0",
+ "lighthouse-badges": "^1.0.37",
"protractor": "~7.0.0",
"rimraf": "^3.0.2",
"shelljs": "^0.8.4",
"static-server": "^2.2.1",
- "ts-node": "~9.0.0",
+ "ts-node": "~9.1.0",
"tslint": "~6.1.3",
"typescript": "~4.0.5"
}
diff --git a/scripts/build-tl-components-configuration.js b/scripts/build-tl-components-configuration.js
index 3624706e1..a3428ffd3 100644
--- a/scripts/build-tl-components-configuration.js
+++ b/scripts/build-tl-components-configuration.js
@@ -26,7 +26,7 @@ if(fs.existsSync('./dist')) {
if(fs.existsSync('./static')) {
fs.writeFile('./static/config.json', configTemplate);
- // fs.writeFile('./static/tamu-library-components/docs/usage/config.json', configTemplate);
+ fs.writeFile('./static/tamu-library-components/docs/usage/config.json', configTemplate);
}
fs.writeFile('./src/config.json', configTemplate);
\ No newline at end of file
diff --git a/scripts/build-tl-components.js b/scripts/build-tl-components.js
index 743b00d7c..b4a3517e9 100644
--- a/scripts/build-tl-components.js
+++ b/scripts/build-tl-components.js
@@ -4,25 +4,28 @@ const fs = require('fs-extra');
const concat = require('concat');
const cp = require('child_process');
+const componentsPath = 'dist/tl-components';
+
const assetPath = 'dist/tl-components';
const bundlePath = 'dist/bundle';
cp.fork(__dirname + '/build-tl-config-template.js');
(async function build() {
+
+ // options: es5 and es2015
+ const esv = 'es2015';
+
const files = [
- 'dist/tl-components/runtime-es5.js',
- 'dist/tl-components/polyfills-es5.js',
- 'dist/tl-components/styles-es5.js',
- 'dist/tl-components/scripts.js',
- // 'dist/tl-components/vendor-es5.js',
- 'dist/tl-components/main-es5.js'
+ `${componentsPath}/polyfills-${esv}.js`,
+ `${componentsPath}/styles-${esv}.js`,
+ `${componentsPath}/main-${esv}.js`
];
fs.ensureDir(bundlePath);
await concat(files, `${bundlePath}/tl-components.js`);
- fs.copy('dist/tl-components/assets', "dist/static/docs/usage/assets");
+ fs.copy(`${assetPath}/assets`, "dist/static/docs/usage/assets");
fs.copy(`${assetPath}/assets`, `${bundlePath}/assets`);
})();
diff --git a/src/app/shared/styles/tl-encapsulated.scss b/src/app/shared/styles/tl-encapsulated.scss
index e88de0f2a..cc2036fac 100644
--- a/src/app/shared/styles/tl-encapsulated.scss
+++ b/src/app/shared/styles/tl-encapsulated.scss
@@ -1,8 +1,5 @@
-@import url('https://fonts.googleapis.com/css?family=Lato&display=swap');
-
-@import '~bootstrap/scss/bootstrap.scss';
-
+@import "~bootstrap/scss/bootstrap.scss";
.wvr-hidden {
- display: none!important;
+ display: none !important;
}
diff --git a/src/app/tl-alert/tl-alert.component.ts b/src/app/tl-alert/tl-alert.component.ts
index f36c71b47..411d232a1 100644
--- a/src/app/tl-alert/tl-alert.component.ts
+++ b/src/app/tl-alert/tl-alert.component.ts
@@ -1,10 +1,11 @@
-import { Component, Injector, Input } from '@angular/core';
+import { ChangeDetectionStrategy, Component, Injector, Input } from '@angular/core';
import { TamuAbstractBaseComponent } from '../shared/tl-abstract-base.component';
@Component({
selector: 'tl-alert-component',
templateUrl: './tl-alert.component.html',
- styleUrls: ['./tl-alert.component.scss']
+ styleUrls: ['./tl-alert.component.scss'],
+ changeDetection: ChangeDetectionStrategy.Default
})
export class TlAlertComponent extends TamuAbstractBaseComponent {
diff --git a/src/app/tl-button/tl-button.component.ts b/src/app/tl-button/tl-button.component.ts
index 60eeb854d..9585b125e 100644
--- a/src/app/tl-button/tl-button.component.ts
+++ b/src/app/tl-button/tl-button.component.ts
@@ -1,10 +1,11 @@
-import { Component, Injector, Input } from '@angular/core';
+import { ChangeDetectionStrategy, Component, Injector, Input } from '@angular/core';
import { TamuAbstractBaseComponent } from '../shared/tl-abstract-base.component';
@Component({
selector: 'tl-button-component',
templateUrl: './tl-button.component.html',
- styleUrls: ['./tl-button.component.scss']
+ styleUrls: ['./tl-button.component.scss'],
+ changeDetection: ChangeDetectionStrategy.Default
})
export class TlButtonComponent extends TamuAbstractBaseComponent {
diff --git a/src/app/tl-card/tl-card.component.html b/src/app/tl-card/tl-card.component.html
index 55c40e104..b7fbb5171 100644
--- a/src/app/tl-card/tl-card.component.html
+++ b/src/app/tl-card/tl-card.component.html
@@ -1,7 +1,7 @@