Merge branch 'demo' into luxon

This commit is contained in:
Steve Schmitt 2022-08-22 08:11:29 -07:00 committed by GitHub
commit 607f2afa90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 5817 additions and 3976 deletions

View File

@ -33,7 +33,10 @@
"highlight.js",
"crypto-js/enc-utf8",
"crypto-js/hmac-sha256",
"crypto-js/enc-base64"
"crypto-js/enc-base64",
"flat",
"moment",
"quill"
],
"assets": [
"src/favicon-16x16.png",

9457
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "fuse-angular",
"version": "15.0.0",
"version": "15.2.0",
"description": "Fuse - Angular Admin Template and Starter Project",
"author": "https://themeforest.net/user/srcn",
"license": "https://themeforest.net/licenses/standard",
@ -14,68 +14,66 @@
"lint": "ng lint"
},
"dependencies": {
"@angular/animations": "14.0.0",
"@angular/cdk": "14.0.0",
"@angular/common": "14.0.0",
"@angular/compiler": "14.0.0",
"@angular/core": "14.0.0",
"@angular/forms": "14.0.0",
"@angular/material": "14.0.0",
"@angular/material-luxon-adapter": "^14.0.4",
"@angular/platform-browser": "14.0.0",
"@angular/platform-browser-dynamic": "14.0.0",
"@angular/router": "14.0.0",
"@ngneat/transloco": "4.0.0",
"@types/luxon": "^2.3.2",
"apexcharts": "3.35.3",
"@angular/animations": "14.1.3",
"@angular/cdk": "14.1.3",
"@angular/common": "14.1.3",
"@angular/compiler": "14.1.3",
"@angular/core": "14.1.3",
"@angular/forms": "14.1.3",
"@angular/material": "14.1.3",
"@angular/material-moment-adapter": "14.1.3",
"@angular/platform-browser": "14.1.3",
"@angular/platform-browser-dynamic": "14.1.3",
"@angular/router": "14.1.3",
"@ngneat/transloco": "4.1.1",
"apexcharts": "3.35.5",
"crypto-js": "3.3.0",
"highlight.js": "11.5.1",
"highlight.js": "11.6.0",
"lodash-es": "4.17.21",
"luxon": "^3.0.1",
"ng-apexcharts": "1.7.1",
"ngx-markdown": "13.1.0",
"ngx-quill": "17.0.0",
"ngx-markdown": "14.0.1",
"ngx-quill": "18.0.0",
"perfect-scrollbar": "1.5.5",
"quill": "1.3.7",
"rxjs": "7.5.5",
"rxjs": "7.5.6",
"tslib": "2.4.0",
"zone.js": "0.11.5"
"zone.js": "0.11.8"
},
"devDependencies": {
"@angular-devkit/build-angular": "14.0.0",
"@angular-eslint/builder": "13.2.1",
"@angular-eslint/eslint-plugin": "13.2.1",
"@angular-eslint/eslint-plugin-template": "13.2.1",
"@angular-eslint/schematics": "13.2.1",
"@angular-eslint/template-parser": "13.2.1",
"@angular/cli": "14.0.0",
"@angular/compiler-cli": "14.0.0",
"@tailwindcss/aspect-ratio": "0.4.0",
"@angular-devkit/build-angular": "14.1.3",
"@angular-eslint/builder": "14.0.2",
"@angular-eslint/eslint-plugin": "14.0.2",
"@angular-eslint/eslint-plugin-template": "14.0.2",
"@angular-eslint/schematics": "14.0.2",
"@angular-eslint/template-parser": "14.0.2",
"@angular/cli": "14.1.3",
"@angular/compiler-cli": "14.1.3",
"@tailwindcss/line-clamp": "0.4.0",
"@tailwindcss/typography": "0.5.2",
"@types/chroma-js": "2.1.3",
"@tailwindcss/typography": "0.5.4",
"@types/chroma-js": "2.1.4",
"@types/crypto-js": "3.1.47",
"@types/highlight.js": "10.1.0",
"@types/jasmine": "4.0.3",
"@types/lodash": "4.14.182",
"@types/lodash": "4.14.184",
"@types/lodash-es": "4.17.6",
"@typescript-eslint/eslint-plugin": "5.27.0",
"@typescript-eslint/parser": "5.27.0",
"autoprefixer": "10.4.7",
"@typescript-eslint/eslint-plugin": "5.33.1",
"@typescript-eslint/parser": "5.33.1",
"autoprefixer": "10.4.8",
"chroma-js": "2.4.2",
"eslint": "8.16.0",
"eslint": "8.22.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsdoc": "39.3.2",
"eslint-plugin-jsdoc": "39.3.6",
"eslint-plugin-prefer-arrow": "1.2.3",
"jasmine-core": "4.1.1",
"karma": "6.3.20",
"jasmine-core": "4.3.0",
"karma": "6.4.0",
"karma-chrome-launcher": "3.1.1",
"karma-coverage": "2.2.0",
"karma-jasmine": "5.0.1",
"karma-jasmine-html-reporter": "1.7.0",
"karma-jasmine": "5.1.0",
"karma-jasmine-html-reporter": "2.0.0",
"lodash": "4.17.21",
"postcss": "8.4.14",
"tailwindcss": "3.0.24",
"typescript": "4.7.2"
"postcss": "8.4.16",
"tailwindcss": "3.1.8",
"typescript": "4.7.4"
}
}

View File

@ -765,10 +765,6 @@
font-weight: 500;
line-height: 1;
> div {
display: contents; /* Remove the div from flow to stop the subscript animation */
}
.mat-error,
.mat-hint {
display: block;

View File

@ -11,7 +11,9 @@ const generateContrasts = require(path.resolve(__dirname, ('../utils/generate-co
// -----------------------------------------------------------------------------------------------------
/**
* Normalize the provided theme
* Normalizes the provided theme by omitting empty values and values that
* start with "on" from each palette. Also sets the correct DEFAULT value
* of each palette.
*
* @param theme
*/
@ -28,67 +30,6 @@ const normalizeTheme = (theme) =>
));
};
/**
* Generates variable colors for the 'colors'
* configuration from the provided theme
*
* @param theme
*/
const generateVariableColors = (theme) =>
{
// https://github.com/adamwathan/tailwind-css-variable-text-opacity-demo
const customPropertiesWithOpacity = (name) => ({
opacityVariable,
opacityValue
}) =>
{
if ( opacityValue )
{
return `rgba(var(--fuse-${name}-rgb), ${opacityValue})`;
}
if ( opacityVariable )
{
return `rgba(var(--fuse-${name}-rgb), var(${opacityVariable}, 1))`;
}
return `rgb(var(--fuse-${name}-rgb))`;
};
return _.fromPairs(_.flatten(_.map(_.keys(flattenColorPalette(normalizeTheme(theme))), (name) => [
[name, customPropertiesWithOpacity(name)],
[`on-${name}`, customPropertiesWithOpacity(`on-${name}`)]
])));
};
/**
* Generate and return themes object with theme name and colors/
* This is useful for accessing themes from Angular (Typescript).
*
* @param themes
* @returns {unknown[]}
*/
function generateThemesObject(themes)
{
const normalizedDefaultTheme = normalizeTheme(themes.default);
return _.map(_.cloneDeep(themes), (value, key) =>
{
const theme = normalizeTheme(value);
const primary = (theme && theme.primary && theme.primary.DEFAULT) ? theme.primary.DEFAULT : normalizedDefaultTheme.primary.DEFAULT;
const accent = (theme && theme.accent && theme.accent.DEFAULT) ? theme.accent.DEFAULT : normalizedDefaultTheme.accent.DEFAULT;
const warn = (theme && theme.warn && theme.warn.DEFAULT) ? theme.warn.DEFAULT : normalizedDefaultTheme.warn.DEFAULT;
return _.fromPairs([
[
key,
{
primary,
accent,
warn
}
]
]);
});
}
// -----------------------------------------------------------------------------------------------------
// @ FUSE TailwindCSS Main Plugin
// -----------------------------------------------------------------------------------------------------
@ -98,25 +39,27 @@ const theming = plugin.withOptions((options) => ({
theme
}) =>
{
// -----------------------------------------------------------------------------------------------------
// @ Map variable colors
// -----------------------------------------------------------------------------------------------------
const mapVariableColors = _.fromPairs(_.map(options.themes, (theme, themeName) => [
themeName === 'default' ? 'body, .theme-default' : `.theme-${e(themeName)}`,
_.fromPairs(_.flatten(_.map(flattenColorPalette(_.fromPairs(_.flatten(_.map(normalizeTheme(theme), (palette, paletteName) => [
[
e(paletteName),
palette
],
[
`on-${e(paletteName)}`,
_.fromPairs(_.map(generateContrasts(palette), (color, hue) => [hue, _.get(theme, [`on-${paletteName}`, hue]) || color]))
]
])
))), (value, key) => [[`--fuse-${e(key)}`, value], [`--fuse-${e(key)}-rgb`, chroma(value).rgb().join(',')]])))
]));
addComponents(mapVariableColors);
/**
* Iterate through the user's themes and build Tailwind components containing
* CSS Custom Properties using the colors from them. This allows switching
* themes by simply replacing a class name as well as nesting them.
*/
addComponents(
_.fromPairs(_.map(options.themes, (theme, themeName) => [
themeName === 'default' ? 'body, .theme-default' : `.theme-${e(themeName)}`,
_.fromPairs(_.flatten(_.map(flattenColorPalette(_.fromPairs(_.flatten(_.map(normalizeTheme(theme), (palette, paletteName) => [
[
e(paletteName),
palette
],
[
`on-${e(paletteName)}`,
_.fromPairs(_.map(generateContrasts(palette), (color, hue) => [hue, _.get(theme, [`on-${paletteName}`, hue]) || color]))
]
])
))), (value, key) => [[`--fuse-${e(key)}`, value], [`--fuse-${e(key)}-rgb`, chroma(value).rgb().join(',')]])))
]))
);
// -----------------------------------------------------------------------------------------------------
// @ Generate scheme based css custom properties and utility classes
@ -141,7 +84,7 @@ const theming = plugin.withOptions((options) => ({
* If we set '--is-dark' as "true" on dark themes, the above rule
* won't work because of the said "fallback value" logic. Therefore,
* we set the '--is-dark' to "false" on light themes and not set it
* all on dark themes so that the fallback value can be used on
* at all on dark themes so that the fallback value can be used on
* dark themes.
*
* On light themes, since '--is-dark' exists, the above rule will be
@ -175,9 +118,17 @@ const theming = plugin.withOptions((options) => ({
(options) =>
{
return {
theme : {
theme: {
extend: {
colors: generateVariableColors(options.themes.default)
/**
* Add 'Primary', 'Accent' and 'Warn' palettes as colors so all color utilities
* are generated for them; "bg-primary", "text-on-primary", "bg-accent-600" etc.
* This will also allow using arbitrary values with them such as opacity and such.
*/
colors: _.fromPairs(_.flatten(_.map(_.keys(flattenColorPalette(normalizeTheme(options.themes.default))), (name) => [
[name, `rgba(var(--fuse-${name}-rgb), <alpha-value>)`],
[`on-${name}`, `rgba(var(--fuse-on-${name}-rgb), <alpha-value>)`]
])))
},
fuse : {
customProps: {
@ -221,8 +172,7 @@ const theming = plugin.withOptions((options) => ({
'mat-icon' : colors.slate[400]
}
}
},
themes : generateThemesObject(options.themes)
}
}
}
};

View File

@ -1,3 +1,3 @@
import { Version } from '@fuse/version/version';
export const FUSE_VERSION = new Version('15.0.0').full;
export const FUSE_VERSION = new Version('15.2.0').full;

View File

@ -144,9 +144,9 @@
<!-- No messages -->
<ng-container *ngIf="!messages || !messages.length">
<div class="flex flex-col flex-auto items-center justify-center sm:justify-start py-12 px-8">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100 dark:bg-primary-600">
<mat-icon
class="text-primary-500-700"
class="text-primary-700 dark:text-primary-50"
[svgIcon]="'heroicons_outline:inbox'"></mat-icon>
</div>
<div class="mt-5 text-2xl font-semibold tracking-tight">No messages</div>

View File

@ -145,9 +145,9 @@
<!-- No notifications -->
<ng-container *ngIf="!notifications || !notifications.length">
<div class="flex flex-col flex-auto items-center justify-center sm:justify-start py-12 px-8">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100 dark:bg-primary-600">
<mat-icon
class="text-primary-500-700"
class="text-primary-700 dark:text-primary-50"
[svgIcon]="'heroicons_outline:bell'"></mat-icon>
</div>
<div class="mt-5 text-2xl font-semibold tracking-tight">No notifications</div>

View File

@ -148,9 +148,9 @@
<!-- No shortcuts -->
<ng-container *ngIf="!shortcuts || !shortcuts.length">
<div class="flex flex-col flex-auto items-center justify-center sm:justify-start py-12 px-8">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100">
<div class="flex flex-0 items-center justify-center w-14 h-14 rounded-full bg-primary-100 dark:bg-primary-600">
<mat-icon
class="text-primary-500-700"
class="text-primary-700 dark:text-primary-50"
[svgIcon]="'heroicons_outline:bookmark'"></mat-icon>
</div>
<div class="mt-5 text-2xl font-semibold tracking-tight">No shortcuts</div>

View File

@ -967,7 +967,7 @@ export const defaultNavigation: FuseNavigationItem[] = [
icon : 'heroicons_outline:speakerphone',
link : '/docs/changelog',
badge: {
title : '15.0.0',
title : '15.2.0',
classes: 'px-2 bg-yellow-300 text-black rounded-full'
}
},

View File

@ -10,8 +10,8 @@
</div>
<!-- Preview -->
<div class="aspect-w-9 aspect-h-6 mt-8">
<div class="flex items-center justify-center border rounded-lg bg-gray-50 dark:bg-card">
<div class="mt-8 aspect-[9/6]">
<div class="flex items-center justify-center h-full border rounded-lg bg-gray-50 dark:bg-card">
<ng-container *ngIf="item.type === 'folder'">
<mat-icon
class="icon-size-24 text-hint"

View File

@ -89,12 +89,12 @@
<a
class="z-10 absolute inset-0 flex flex-col p-4 cursor-pointer"
[routerLink]="['/apps/file-manager/folders/', folder.id]">
<div class="aspect-w-9 aspect-h-6">
<div class="flex items-center justify-center">
<div class="aspect-[9/6]">
<div class="flex items-center justify-center h-full">
<!-- Icon -->
<mat-icon
class="icon-size-14 text-hint"
[svgIcon]="'heroicons_outline:folder'"></mat-icon>
class="icon-size-14 text-hint opacity-50"
[svgIcon]="'heroicons_solid:folder'"></mat-icon>
</div>
</div>
<div class="flex flex-col flex-auto justify-center text-center text-sm font-medium">
@ -122,13 +122,13 @@
<a
class="flex flex-col w-40 h-40 m-2 p-4 shadow rounded-2xl cursor-pointer bg-card"
[routerLink]="['./details/', file.id]">
<div class="aspect-w-9 aspect-h-6">
<div class="flex items-center justify-center">
<div class="aspect-[9/6]">
<div class="flex items-center justify-center h-full">
<!-- Icons -->
<div class="relative">
<mat-icon
class="icon-size-14 text-hint"
[svgIcon]="'heroicons_outline:document'"></mat-icon>
class="icon-size-14 text-hint opacity-50"
[svgIcon]="'heroicons_solid:document'"></mat-icon>
<div
class="absolute left-0 bottom-0 px-1.5 rounded text-sm font-semibold leading-5 text-white"
[class.bg-red-600]="file.type === 'PDF'"

View File

@ -25,9 +25,12 @@
</button>
<mat-menu #toggleLabelMenu="matMenu">
<ng-container *ngFor="let label of labels; trackBy: trackByFn">
<div mat-menu-item>
<div
mat-menu-item
(click)="toggleLabel(label)"
matRipple>
<mat-checkbox
(change)="toggleLabel(label)"
class="pointer-events-none"
[color]="'primary'"
[checked]="mail.labels.includes(label.id)"
[disableRipple]="true">

View File

@ -9,6 +9,7 @@ import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatMenuModule } from '@angular/material/menu';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatRippleModule } from '@angular/material/core';
import { MatSelectModule } from '@angular/material/select';
import { MatSidenavModule } from '@angular/material/sidenav';
import { QuillModule } from 'ngx-quill';
@ -36,7 +37,7 @@ import { mailboxRoutes } from 'app/modules/admin/apps/mailbox/mailbox.routing';
MailboxSettingsComponent,
MailboxSidebarComponent
],
imports : [
imports: [
RouterModule.forChild(mailboxRoutes),
MatButtonModule,
MatCheckboxModule,
@ -47,6 +48,7 @@ import { mailboxRoutes } from 'app/modules/admin/apps/mailbox/mailbox.routing';
MatInputModule,
MatMenuModule,
MatProgressBarModule,
MatRippleModule,
MatSelectModule,
MatSidenavModule,
QuillModule.forRoot(),
@ -54,7 +56,7 @@ import { mailboxRoutes } from 'app/modules/admin/apps/mailbox/mailbox.routing';
FuseNavigationModule,
FuseScrollbarModule,
FuseScrollResetModule,
SharedModule
SharedModule,
]
})
export class MailboxModule

View File

@ -148,9 +148,10 @@
(click)="toggleTaskTag(tag)"
matRipple>
<mat-checkbox
class="flex items-center h-10 min-h-10"
class="flex items-center h-10 min-h-10 pointer-events-none"
[checked]="task.tags.includes(tag.id)"
[color]="'primary'"
[checked]="task.tags.includes(tag.id)">
[disableRipple]="true">
</mat-checkbox>
<div class="ml-1">{{tag.title}}</div>
</div>

View File

@ -26,7 +26,7 @@
<!-- Actions -->
<div class="flex items-center mt-6 sm:mt-0 sm:ml-2 space-x-3">
<button
class="fuse-mat-button-rounded bg-accent-700"
class="bg-accent"
mat-flat-button
[color]="'accent'">
<mat-icon
@ -35,7 +35,6 @@
<span class="ml-2">Messages</span>
</button>
<button
class="fuse-mat-button-rounded"
mat-flat-button
[color]="'primary'">
<mat-icon

View File

@ -10,6 +10,55 @@ export class ChangelogComponent
{
changelog: any[] = [
// v15.2.0
{
version : 'v15.2.0',
releaseDate: 'Aug 22, 2022',
changes : [
{
type: 'Changed',
list: [
'(dependencies) Updated Angular & Angular Material to v14.1.3',
'(dependencies) Updated various other packages'
]
},
{
type: 'Fixed',
list: [
'(@fuse/tailwind/plugins/theming) Simplified the plugin and added more detailed comments',
'(tailwind.config) Fixed: typo on comment',
'(tailwind) Removed the "aspect-ratio" plugin in favor of the included "aspect" utility',
'(layout/common/messages) Fixed: Wrong color classes on "No Messages" icon',
'(layout/common/notifications) Fixed: Wrong color classes on "No Notifications" icon',
'(layout/common/shortcuts) Fixed: Wrong color classes on "No Shortcuts" icon',
'(dashboards/project) Removed unnecessary classes from the buttons',
'(apps/mailbox) Better label toggle behavior',
'(apps/tasks) Better tag toggle behavior',
'(docs) Fixed: Typos'
]
}
]
},
// v15.1.0
{
version : 'v15.1.0',
releaseDate: 'Jul 21, 2022',
changes : [
{
type: 'Changed',
list: [
'(dependencies) Updated Angular & Angular Material to v14.1.0',
'(dependencies) Updated various other packages'
]
},
{
type: 'Fixed',
list: [
'(@fuse/overrides/angular-material) mat-hint position is not working correctly on fields'
]
}
]
},
// v15.0.0
{
version : 'v15.0.0',
@ -22,7 +71,7 @@ export class ChangelogComponent
'(@fuse/overrides/quill) Added tooltip styles for better compatibility',
'(@fuse/services/platform) Added platform checker service',
'(global) Added custom scrollbar styling for platforms other than macOS and iOS',
'(layout/common/search) Implemented the new MatAutocomplete "autoSelectActiveOption" functionality',
'(layout/common/search) Implemented the new MatAutocomplete "autoSelectActiveOption" functionality'
]
},
{
@ -38,7 +87,7 @@ export class ChangelogComponent
'(@fuse/overrides/quill) Better scrolling for Quill editor',
'(auth) Made the renewing token on "sign-in-with-token" process an optional step to simplify the login process',
'(auth) Changed the url on "signInUsingToken" method to reflect the mock-api changes',
'(mock-api) Replaced the "refresh-access-token" url with "sign-in-with-token"',
'(mock-api) Replaced the "refresh-access-token" url with "sign-in-with-token"'
]
},
{

View File

@ -135,7 +135,7 @@
<p class="font-medium">on-primary, on-accent, on-warn</p>
These are the 3 main contrasting color palettes of the theme. They can be either a complete or a partial
Tailwind color palette. By default, Fuse will automatically generate contrasting colors using the colors
from "Primary", "Accent" and "Warn" palettes but for some reason, if you more control over the contrasting
from "Primary", "Accent" and "Warn" palettes but for some reason, if you want more control over the contrasting
colors, you can use these objects to customize them.
</li>
</ul>
@ -181,7 +181,7 @@
},
// Here we define the "Accent" palette for the default theme.
// It uses the default "blue-gray" color palette from Tailwind's default
// It uses the default "slate" color palette from Tailwind's default
// color palettes and sets the 800 hue level as the DEFAULT color.
accent : {
...colors.slate,

View File

@ -35,8 +35,8 @@ const themes = {
500: colors.red['50']
}
},
// Rest of the themes will use the 'default' as the base theme
// and extend them with their given configuration
// Rest of the themes will use the 'default' as the base
// theme and extend it with their given configuration
'brand' : {
primary: customPalettes.brand
},
@ -288,7 +288,6 @@ const config = {
// Other third party and/or custom plugins
require('@tailwindcss/typography')({modifiers: ['sm', 'lg']}),
require('@tailwindcss/aspect-ratio'),
require('@tailwindcss/line-clamp')
]
};