coer-elements 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,84 @@
1
+ import { IAppSource } from "../interfaces";
2
+ import { Tools } from './Tools';
3
+
4
+ export class Breadcrumbs {
5
+
6
+ private static readonly storage = 'COER-System';
7
+
8
+ /** */
9
+ public static Add(page: string, path: string): void {
10
+ const breadcrumbs = this.Get();
11
+ const paths = breadcrumbs.map(item => item.path);
12
+
13
+ if (!paths.includes(path)) {
14
+ breadcrumbs.push({ page, path });
15
+ this.Save(breadcrumbs);
16
+ }
17
+ }
18
+
19
+
20
+ /** */
21
+ public static Get(): IAppSource[] {
22
+ let storage = sessionStorage.getItem(this.storage) as any;
23
+
24
+ if (storage) {
25
+ storage = JSON.parse(storage);
26
+
27
+ if (storage.hasOwnProperty('breadcrumbs')) {
28
+ return Tools.BreakReference(storage.breadcrumbs);
29
+ }
30
+ }
31
+
32
+ return [];
33
+ }
34
+
35
+
36
+ /** Source */
37
+ public static GetFirst(): IAppSource | null {
38
+ const breadcrumbs = this.Get();
39
+ return (breadcrumbs.length > 0) ? breadcrumbs.shift()! : null;
40
+ }
41
+
42
+
43
+ /** */
44
+ public static Save(breadcrumbs: IAppSource[]): void {
45
+ let storage = sessionStorage.getItem(this.storage) as any;
46
+ if (storage) storage = JSON.parse(storage);
47
+ storage = Object.assign({}, storage, { breadcrumbs });
48
+ sessionStorage.setItem(this.storage, JSON.stringify(storage));
49
+ }
50
+
51
+
52
+ /** */
53
+ public static Remove(path: string): void {
54
+ let breadcrumbs = this.Get();
55
+ const index = breadcrumbs.findIndex(x => x.path.toLowerCase().trim() === path.toLowerCase().trim());
56
+
57
+ if (index >= 0) {
58
+ breadcrumbs = Tools.BreakReference(breadcrumbs).splice(0, index + 1);
59
+ this.Save(breadcrumbs);
60
+ }
61
+ }
62
+
63
+
64
+ /** */
65
+ public static SetLast(page: string, path: string): void {
66
+ const breadcrumbs = this.Get();
67
+
68
+ if (breadcrumbs.length > 0) {
69
+ breadcrumbs[breadcrumbs.length - 1] = { page, path };
70
+ this.Save(breadcrumbs);
71
+ }
72
+ }
73
+
74
+
75
+ /** */
76
+ public static RemoveLast(): void {
77
+ const breadcrumbs = this.Get();
78
+
79
+ if (breadcrumbs.length > 0) {
80
+ breadcrumbs.pop();
81
+ this.Save(breadcrumbs);
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,63 @@
1
+ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms";
2
+ import { forwardRef } from "@angular/core";
3
+
4
+ export const CONTROL_VALUE = <T>(component: T) => {
5
+ return {
6
+ provide: NG_VALUE_ACCESSOR,
7
+ useExisting: forwardRef(() => component),
8
+ multi: true
9
+ }
10
+ }
11
+
12
+
13
+ export class ControlValue implements ControlValueAccessor {
14
+
15
+ //Variables
16
+ protected _value: any;
17
+ private _isTouched: boolean = false;
18
+ protected _UpdateValue!: Function;
19
+ private _IsTouched!: Function;
20
+
21
+
22
+ public get isTouched() {
23
+ return this._isTouched;
24
+ }
25
+
26
+
27
+ /** */
28
+ protected SetValue(value: any): void {
29
+ if(typeof this._UpdateValue === 'function') {
30
+ this._UpdateValue(value);
31
+ }
32
+
33
+ this._value = value;
34
+ }
35
+
36
+
37
+ /** */
38
+ public SetTouched(isTouched: boolean): void {
39
+ if(typeof this._IsTouched === 'function') {
40
+ this._IsTouched(isTouched);
41
+ }
42
+
43
+ this._isTouched = isTouched;
44
+ }
45
+
46
+
47
+ /** */
48
+ public writeValue(value: any): void {
49
+ this._value = value;
50
+ }
51
+
52
+
53
+ /** */
54
+ public registerOnChange(callback: Function): void {
55
+ this._UpdateValue = callback;
56
+ }
57
+
58
+
59
+ /** */
60
+ public registerOnTouched(callback: Function): void {
61
+ this._IsTouched = callback;
62
+ }
63
+ }
@@ -0,0 +1,197 @@
1
+ import { AfterViewInit, Component, Inject, inject, OnDestroy } from '@angular/core';
2
+ import { Breadcrumbs } from "./Breadcrumbs.class";
3
+ import { Source } from './Source.class';
4
+ //import { CoerAlert } from 'src/app/shared/components/coer-alert/coer-alert.component';
5
+ import { IAppSource, IBreadcrumb, IGoBack } from '../interfaces';
6
+ import { ActivatedRoute, Router } from '@angular/router';
7
+ import { Tools } from './Tools';
8
+
9
+ @Component({ template: '' })
10
+ export class Page implements AfterViewInit, OnDestroy {
11
+
12
+ //Injection
13
+ //protected readonly alert = inject(CoerAlert);
14
+ protected readonly router = inject(Router);
15
+ private readonly activatedRoute = inject(ActivatedRoute);
16
+
17
+ /** */
18
+ protected isUpdate: boolean = false;
19
+
20
+ /** */
21
+ protected isLoading: boolean = false;
22
+
23
+ /** */
24
+ protected isReady: boolean = false;
25
+
26
+ /** */
27
+ protected enableAnimations: boolean = false;
28
+
29
+ /** */
30
+ protected routeParams: any;
31
+
32
+ /** */
33
+ protected queryParams: any;
34
+
35
+ /** */
36
+ protected breadcrumbs: IBreadcrumb[] = [];
37
+
38
+ /** */
39
+ protected pageResponse: any = null;
40
+
41
+ /** */
42
+ protected goBack: IGoBack = { show: false };
43
+
44
+ //Private Variables
45
+ private _page: string = '';
46
+ private _source: IAppSource | null = null;
47
+ private _preventDestroy: boolean = false;
48
+
49
+
50
+ constructor(@Inject(String) page: string) {
51
+ this.SetPageName(page);
52
+ this.SetSource();
53
+ this.GetSource();
54
+ this.GetNavigation();
55
+ this.SetGoBack();
56
+ this.GetPageResponse();
57
+ }
58
+
59
+ ngAfterViewInit() {
60
+ this.routeParams = this.activatedRoute.snapshot.params;
61
+ this.queryParams = this.activatedRoute.snapshot.queryParams;
62
+
63
+ setTimeout(() => {
64
+ this.isReady = true;
65
+ this.RunPage();
66
+ setTimeout(() => { this.enableAnimations = true }, 1000);
67
+ });
68
+
69
+ }
70
+
71
+ ngOnDestroy() {
72
+ if (!this._preventDestroy) Source.ClearPageResponse();
73
+ }
74
+
75
+ /** Main method. Starts after ngAfterViewInit() */
76
+ protected RunPage(): void {};
77
+
78
+
79
+ /** Rename the last breadcrumb and update the url id */
80
+ protected SetPageName(name: string, id: string | number | null = null): void {
81
+ this._page = name;
82
+
83
+ let path = this.router.url;
84
+ if (path.includes('?')) path = path.split('?')[0];
85
+
86
+ if (id) {
87
+ const PATH_ARRAY = path.split('/');
88
+ const PATH_ID = Tools.BreakReference(PATH_ARRAY).pop();
89
+ if (PATH_ID) {
90
+ PATH_ARRAY[PATH_ARRAY.length - 1] = String(id);
91
+ path = PATH_ARRAY.join('/');
92
+ }
93
+ }
94
+
95
+ if (this.breadcrumbs.length > 0) {
96
+ this.breadcrumbs[this.breadcrumbs.length - 1].page = name;
97
+ this.breadcrumbs[this.breadcrumbs.length - 1].path = path;
98
+ Breadcrumbs.SetLast(name, path);
99
+ }
100
+
101
+ this.router.navigateByUrl(path)
102
+ }
103
+
104
+
105
+ /** */
106
+ private SetSource(): void {
107
+ Source.Set(this._page);
108
+ }
109
+
110
+
111
+ /** */
112
+ private GetSource(): void {
113
+ this._source = Source.Get();
114
+ }
115
+
116
+
117
+ /** */
118
+ protected GetPageResponse(): void {
119
+ this.pageResponse = Source.GetPageResponse();
120
+ }
121
+
122
+
123
+ /** */
124
+ private GetNavigation(): void {
125
+ if (this._source) {
126
+ this.breadcrumbs = Breadcrumbs.Get().map(item => Object.assign({
127
+ page: item.page,
128
+ path: item.path,
129
+ click: this.GoBack(item.path)
130
+ }));
131
+ }
132
+
133
+ else this.breadcrumbs = [{ page: this._page }];
134
+ }
135
+
136
+
137
+ /** */
138
+ private SetGoBack(): void {
139
+ if (this._source) {
140
+ this.goBack = {
141
+ show: true,
142
+ path: this._source.path,
143
+ click: this.GoBack()
144
+ };
145
+ }
146
+ }
147
+
148
+
149
+ /** */
150
+ private GoBack = (path?: string) => (() => {
151
+ if (path) Breadcrumbs.Remove(path);
152
+ else Breadcrumbs.RemoveLast();
153
+ });
154
+
155
+
156
+ /** Navigate to previous page */
157
+ protected GoToSource<T>(pageResponse: T | null = null): void {
158
+ if(this._source) {
159
+ Breadcrumbs.RemoveLast();
160
+ this.SetPageResponse(pageResponse);
161
+ Tools.Sleep().then(_ => this.router.navigateByUrl(this._source!.path));
162
+ }
163
+ };
164
+
165
+
166
+ /** */
167
+ protected SetPageResponse<T>(pageResponse: T | null = null): void {
168
+ if (Tools.IsNotNull(pageResponse)) {
169
+ this._preventDestroy = true;
170
+ Source.SetPageResponse(pageResponse);
171
+ }
172
+ };
173
+
174
+
175
+ /** */
176
+ protected ReloadPage(): void {
177
+ Breadcrumbs.RemoveLast();
178
+ Tools.Sleep().then(_ => window.location.reload());
179
+ }
180
+
181
+
182
+ /** */
183
+ protected Log(value: any, log: string | null = null): void {
184
+ if (Tools.IsNotNull(log)) console.log({ log, value });
185
+ else console.log(value);
186
+ }
187
+
188
+
189
+ /** Returns true if the value is null or undefined, false otherwise */
190
+ protected IsNotNull = Tools.IsNotNull;
191
+
192
+ /** Returns true if the value is null or undefined, false otherwise */
193
+ protected IsNull = Tools.IsNull;
194
+
195
+ /** Returns true if the value is null or undefined or contains only whitespace, false otherwise */
196
+ protected IsOnlyWhiteSpace = Tools.IsOnlyWhiteSpace;
197
+ }
@@ -0,0 +1,107 @@
1
+ import { Breadcrumbs } from "./Breadcrumbs.class";
2
+ import { IAppSource } from '../interfaces';
3
+ import { Router } from '@angular/router';
4
+ import { inject } from "@angular/core";
5
+ import { Tools } from './Tools';
6
+
7
+ export class Source {
8
+
9
+ private static readonly storage = 'COER-System';
10
+
11
+ /** */
12
+ public static Set(page: string): void {
13
+ const ROUTER = inject(Router);
14
+
15
+ let path = ROUTER.url;
16
+ if (path.includes('?')) path = path.split('?')[0];
17
+
18
+ Breadcrumbs.Add(page, path);
19
+
20
+ const breadcrumbs = Breadcrumbs.Get();
21
+
22
+ if(breadcrumbs.length >= 2) {
23
+ breadcrumbs.pop();
24
+ const breadcrumb = breadcrumbs.pop()!;
25
+ this.Save({ page: breadcrumb.page, path: breadcrumb.path });
26
+ }
27
+
28
+ else this.Save(null);
29
+ }
30
+
31
+
32
+ /** */
33
+ private static Save(source: IAppSource | null): void {
34
+ let storage = sessionStorage.getItem(this.storage) as any;
35
+ if (storage) storage = JSON.parse(storage);
36
+ storage = Object.assign({}, storage, { source });
37
+ sessionStorage.setItem(this.storage, JSON.stringify(storage));
38
+ }
39
+
40
+
41
+ /** */
42
+ public static Get(): IAppSource | null {
43
+ let storage = sessionStorage.getItem(this.storage) as any;
44
+
45
+ if (storage) {
46
+ storage = JSON.parse(storage);
47
+
48
+ if (storage.hasOwnProperty('source')) {
49
+ return storage.source;
50
+ }
51
+ }
52
+
53
+ return null;
54
+ }
55
+
56
+
57
+ /** */
58
+ public static GetRoot(): IAppSource | null {
59
+ const breadcrumbs = Breadcrumbs.Get();
60
+ return (breadcrumbs.length > 0) ? breadcrumbs.shift()! : null;
61
+ }
62
+
63
+
64
+ /** */
65
+ public static SetPageResponse<T>(pageResponse: T): void {
66
+ let storage = sessionStorage.getItem(this.storage) as any;
67
+ storage = JSON.parse(storage);
68
+ storage = Object.assign({}, storage, { pageResponse });
69
+ sessionStorage.setItem(this.storage, JSON.stringify(storage));
70
+ }
71
+
72
+
73
+ /** */
74
+ public static GetPageResponse<T>(): T | null {
75
+ let storage = sessionStorage.getItem(this.storage) as any;
76
+
77
+ if (storage) {
78
+ storage = JSON.parse(storage);
79
+
80
+ if (storage.hasOwnProperty('pageResponse')) {
81
+ return Tools.BreakReference(storage.pageResponse);
82
+ }
83
+ }
84
+
85
+ return null;
86
+ }
87
+
88
+
89
+ /** */
90
+ public static ClearPageResponse(): void {
91
+ let storage = sessionStorage.getItem(this.storage) as any;
92
+ storage = JSON.parse(storage);
93
+
94
+ if (storage.hasOwnProperty('pageResponse')) {
95
+ delete storage.pageResponse;
96
+ }
97
+
98
+ storage = Object.assign({}, storage);
99
+ sessionStorage.setItem(this.storage, JSON.stringify(storage));
100
+ }
101
+
102
+
103
+ /** Clear Source */
104
+ public static Reset(): void {
105
+ sessionStorage.removeItem(this.storage);
106
+ }
107
+ }
package/Tools/Tools.ts CHANGED
@@ -10,7 +10,7 @@ export const Tools = {
10
10
 
11
11
 
12
12
  /** Returns true if the value is null or undefined, false otherwise */
13
- IsNull: (value: any): boolean => {
13
+ IsNull: <T>(value: T | null | undefined): boolean => {
14
14
  if (value === undefined) return true;
15
15
  if (value === null) return true;
16
16
  return false;
@@ -18,7 +18,7 @@ export const Tools = {
18
18
 
19
19
 
20
20
  /** Returns true if the value is not null or undefined, false otherwise */
21
- IsNotNull: (value: any): boolean => {
21
+ IsNotNull: <T>(value: T | null | undefined): boolean => {
22
22
  if (value === undefined) return false;
23
23
  if (value === null) return false;
24
24
  return true;
@@ -26,7 +26,7 @@ export const Tools = {
26
26
 
27
27
 
28
28
  /** Returns true if the value is null or undefined or contains only whitespace, false otherwise */
29
- IsOnlyWhiteSpace: (value: any): boolean => {
29
+ IsOnlyWhiteSpace: <T>(value: T | null | undefined): boolean => {
30
30
  if (value === undefined) return true;
31
31
  if (value === null) return true;
32
32
  if((value as string).toString().trim() === '') return true;
package/index.ts CHANGED
@@ -1,4 +1,8 @@
1
- export * from './Tools/Tools'
1
+ export * from './Tools/Breadcrumbs.class';
2
+ export * from './Tools/ControlValue';
2
3
  export * from './Tools/DateTime.class';
3
4
  export * from './Tools/Files.class';
4
- export * from './Tools/Screen.class';
5
+ export * from './Tools/Page.class';
6
+ export * from './Tools/Screen.class';
7
+ export * from './Tools/Source.class';
8
+ export * from './Tools/Tools'
@@ -1,11 +1,47 @@
1
+ import { TemplateRef, WritableSignal } from '@angular/core';
2
+
1
3
  export interface IPatch {
2
4
  op: 'remove' | 'add' | 'replace';
3
5
  path: string;
4
6
  value: any;
5
7
  }
6
8
 
9
+
7
10
  export interface IScreenSize {
8
11
  width: number;
9
12
  height: number;
10
13
  breakpoin: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
14
+ }
15
+
16
+
17
+ export interface IAppSource {
18
+ page: string;
19
+ path: string;
20
+ }
21
+
22
+
23
+ export interface IBreadcrumb {
24
+ page: string;
25
+ path?: string | null;
26
+ queryParams?: any;
27
+ click?: (() => any);
28
+ }
29
+
30
+
31
+ export interface IGoBack {
32
+ show: boolean;
33
+ path?: string | null;
34
+ queryParams?: any;
35
+ click?: (() => any);
36
+ }
37
+
38
+
39
+ export interface ICoerRef {
40
+ coerRef: WritableSignal<string>;
41
+ title: WritableSignal<string>;
42
+ icon: WritableSignal<string>;
43
+ isDisabled: WritableSignal<boolean>;
44
+ show: WritableSignal<boolean>;
45
+ tooltip: WritableSignal<string>;
46
+ template: TemplateRef<any>;
11
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "coer-elements",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "author": "Christian Omar Escamilla Rodríguez",
5
5
  "keywords": [
6
6
  "coer",
@@ -23,6 +23,8 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@angular/core": "^17.3.0",
26
+ "@angular/forms": "^17.3.0",
27
+ "@angular/router": "^17.3.0",
26
28
  "guid-typescript": "^1.0.9",
27
29
  "moment": "^2.30.1",
28
30
  "rxjs": "^7.8.1",