mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Working conversion
This commit is contained in:
		| @@ -6,7 +6,7 @@ | |||||||
|  |  | ||||||
|       <ng-template #popContent> |       <ng-template #popContent> | ||||||
|         <div style="min-width: 200px;" class="pb-3"> |         <div style="min-width: 200px;" class="pb-3"> | ||||||
|           <color-slider [color]="value" (onChangeComplete)="sliderChanged($event)"></color-slider> |           <color-slider [color]="value" (onChangeComplete)="colorChanged($event.color.hex)"></color-slider> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|       </ng-template> |       </ng-template> | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| import { Component, Input, forwardRef } from '@angular/core'; | import { Component, forwardRef } from '@angular/core'; | ||||||
| import { NG_VALUE_ACCESSOR } from '@angular/forms'; | import { NG_VALUE_ACCESSOR } from '@angular/forms'; | ||||||
| import { ColorEvent, ColorMode } from 'ngx-color'; | import { randomColor } from 'src/app/utils/color'; | ||||||
| import { randomColor, hslToHex } from 'src/app/utils/color'; |  | ||||||
| import { AbstractInputComponent } from '../abstract-input'; | import { AbstractInputComponent } from '../abstract-input'; | ||||||
|  |  | ||||||
| @Component({ | @Component({ | ||||||
| @@ -16,26 +15,16 @@ import { AbstractInputComponent } from '../abstract-input'; | |||||||
| }) | }) | ||||||
| export class ColorComponent extends AbstractInputComponent<string> { | export class ColorComponent extends AbstractInputComponent<string> { | ||||||
|  |  | ||||||
|   @Input() |  | ||||||
|   colorMode: ColorMode = ColorMode.HEX |  | ||||||
|  |  | ||||||
|   constructor() { |   constructor() { | ||||||
|     super() |     super() | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   randomize() { |   randomize() { | ||||||
|     const color = randomColor(this.colorMode) |     this.colorChanged(randomColor()) | ||||||
|     let colorHex = color |  | ||||||
|     if (this.colorMode == ColorMode.HSL) { |  | ||||||
|       const hsl = color.split(',') |  | ||||||
|       colorHex = hslToHex(+hsl[0], +hsl[1], +hsl[2]) |  | ||||||
|     } |  | ||||||
|     this.value = colorHex |  | ||||||
|     this.onChange(color) |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   sliderChanged(colorEvent:ColorEvent) { |   colorChanged(value) { | ||||||
|     this.value = colorEvent.color.hex |     this.value = value | ||||||
|     this.onChange(colorEvent.color[this.colorMode].toString()) |     this.onChange(value) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ | |||||||
|             <span i18n>Theme Color</span> |             <span i18n>Theme Color</span> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col-3"> |           <div class="col-3"> | ||||||
|             <app-input-color i18n-title colorMode="hsl" formControlName="themeColor" [error]="error?.color"></app-input-color> |             <app-input-color i18n-title formControlName="themeColor" [error]="error?.color"></app-input-color> | ||||||
|           </div> |           </div> | ||||||
|           <div class="col-2"> |           <div class="col-2"> | ||||||
|             <button class="btn btn-link btn-sm pt-2 ps-0" [disabled]="!this.settingsForm.get('themeColor').value" (click)="clearThemeColor()"> |             <button class="btn btn-link btn-sm pt-2 ps-0" [disabled]="!this.settingsForm.get('themeColor').value" (click)="clearThemeColor()"> | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ import { DOCUMENT } from '@angular/common'; | |||||||
| import { Inject, Injectable, LOCALE_ID, Renderer2, RendererFactory2, RendererStyleFlags2 } from '@angular/core'; | import { Inject, Injectable, LOCALE_ID, Renderer2, RendererFactory2, RendererStyleFlags2 } from '@angular/core'; | ||||||
| import { Meta } from '@angular/platform-browser'; | import { Meta } from '@angular/platform-browser'; | ||||||
| import { CookieService } from 'ngx-cookie-service'; | import { CookieService } from 'ngx-cookie-service'; | ||||||
|  | import { hexToHsl } from 'src/app/utils/color'; | ||||||
|  |  | ||||||
| export interface PaperlessSettings { | export interface PaperlessSettings { | ||||||
|   key: string |   key: string | ||||||
| @@ -87,9 +88,9 @@ export class SettingsService { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (themeColor) { |     if (themeColor) { | ||||||
|       const hsl = themeColor.split(',') |       const hsl = hexToHsl(themeColor) | ||||||
|       this.renderer.setStyle(document.documentElement, '--pngx-primary',`${+hsl[0] * 360},${hsl[1] * 100}%`, RendererStyleFlags2.DashCase) |       this.renderer.setStyle(document.documentElement, '--pngx-primary',`${+hsl.h * 360},${hsl.s * 100}%`, RendererStyleFlags2.DashCase) | ||||||
|       this.renderer.setStyle(document.documentElement, '--pngx-primary-lightness',`${hsl[2] * 100}%`, RendererStyleFlags2.DashCase) |       this.renderer.setStyle(document.documentElement, '--pngx-primary-lightness',`${hsl.l * 100}%`, RendererStyleFlags2.DashCase) | ||||||
|     } else { |     } else { | ||||||
|       this.renderer.removeStyle(document.documentElement, '--pngx-primary', RendererStyleFlags2.DashCase) |       this.renderer.removeStyle(document.documentElement, '--pngx-primary', RendererStyleFlags2.DashCase) | ||||||
|       this.renderer.removeStyle(document.documentElement, '--pngx-primary-lightness', RendererStyleFlags2.DashCase) |       this.renderer.removeStyle(document.documentElement, '--pngx-primary-lightness', RendererStyleFlags2.DashCase) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| import { ColorMode } from "ngx-color" | import { HSL } from "ngx-color" | ||||||
|  |  | ||||||
| function componentToHex(c) { | function componentToHex(c) { | ||||||
|   var hex = Math.floor(c).toString(16) |   var hex = Math.floor(c).toString(16) | ||||||
| @@ -6,8 +6,8 @@ function componentToHex(c) { | |||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c |  | ||||||
|  * |  * | ||||||
|  |  * https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c | ||||||
|  * Converts an HSL color value to RGB. Conversion formula |  * Converts an HSL color value to RGB. Conversion formula | ||||||
|  * adapted from http://en.wikipedia.org/wiki/HSL_color_space. |  * adapted from http://en.wikipedia.org/wiki/HSL_color_space. | ||||||
|  * Assumes h, s, and l are contained in the set [0, 1] and |  * Assumes h, s, and l are contained in the set [0, 1] and | ||||||
| @@ -43,21 +43,47 @@ function hslToRgb(h, s, l){ | |||||||
|   return [r * 255, g * 255, b * 255] |   return [r * 255, g * 255, b * 255] | ||||||
| } | } | ||||||
|  |  | ||||||
| export function hslToHex(h: number, s: number, l:number): string { | /** | ||||||
|   const rgb = hslToRgb(h,s,l) |  * https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c | ||||||
|   return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}` |  * Converts an RGB color value to HSL. Conversion formula | ||||||
|  |  * adapted from http://en.wikipedia.org/wiki/HSL_color_space. | ||||||
|  |  * Assumes r, g, and b are contained in the set [0, 255] and | ||||||
|  |  * returns h, s, and l in the set [0, 1]. | ||||||
|  |  * | ||||||
|  |  * @param   Number  r       The red color value | ||||||
|  |  * @param   Number  g       The green color value | ||||||
|  |  * @param   Number  b       The blue color value | ||||||
|  |  * @return  Array           The HSL representation | ||||||
|  |  */ | ||||||
|  |  export function rgbToHsl(r, g, b){ | ||||||
|  |   r /= 255, g /= 255, b /= 255; | ||||||
|  |   var max = Math.max(r, g, b), min = Math.min(r, g, b); | ||||||
|  |   var h, s, l = (max + min) / 2; | ||||||
|  |  | ||||||
|  |   if(max == min){ | ||||||
|  |       h = s = 0; // achromatic | ||||||
|  |   }else{ | ||||||
|  |       var d = max - min; | ||||||
|  |       s = l > 0.5 ? d / (2 - max - min) : d / (max + min); | ||||||
|  |       switch(max){ | ||||||
|  |           case r: h = (g - b) / d + (g < b ? 6 : 0); break; | ||||||
|  |           case g: h = (b - r) / d + 2; break; | ||||||
|  |           case b: h = (r - g) / d + 4; break; | ||||||
|  |       } | ||||||
|  |       h /= 6; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return [h, s, l]; | ||||||
| } | } | ||||||
|  |  | ||||||
| export function randomColor(colorMode: ColorMode = ColorMode.HEX) { | export function hexToHsl(hex: string): HSL { | ||||||
|   const h = Math.random() |   hex = hex.replace('#', '') | ||||||
|   const s = 0.6 |   let aRgbHex = hex.match(/.{1,2}/g) | ||||||
|   const l = Math.random() * 0.4 + 0.4 |   const hsl = rgbToHsl(parseInt(aRgbHex[0], 16), parseInt(aRgbHex[1], 16), parseInt(aRgbHex[2], 16)) | ||||||
|   switch (colorMode) { |   return { h: hsl[0], s: hsl[1], l: hsl[2] } | ||||||
|     case ColorMode.HSL: | } | ||||||
|       return `${h},${s},${l}` |  | ||||||
|       break; | export function randomColor() { | ||||||
|     default: // HEX |   let rgb = hslToRgb(Math.random(), 0.6, Math.random() * 0.4 + 0.4) | ||||||
|       return hslToHex(h,s,l) |   return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}` | ||||||
|       break; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Michael Shamoon
					Michael Shamoon