unictive-angular 1.0.29 → 1.0.31

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.
@@ -78,8 +78,34 @@ async function create_project() {
78
78
  process.exit(1);
79
79
  }
80
80
 
81
+ // Pilih zoneless atau tidak
82
+ const rl = readline.createInterface({
83
+ input: process.stdin,
84
+ output: process.stdout,
85
+ });
86
+
87
+ function ask(q) {
88
+ return new Promise((resolve) => rl.question(q, resolve));
89
+ }
90
+
91
+ let zoneless = false;
92
+ while (true) {
93
+ const answer = (await ask("Gunakan zoneless? (y/n): ")).trim().toLowerCase();
94
+ if (answer === "y") {
95
+ zoneless = true;
96
+ break;
97
+ } else if (answer === "n") {
98
+ zoneless = false;
99
+ break;
100
+ } else {
101
+ show_status("Jawaban tidak valid! Ketik 'y' atau 'n'.", "error");
102
+ }
103
+ }
104
+ rl.close();
105
+
81
106
  show_status(`Membuat project Angular: ${projectName}`, "info");
82
- execSync(`ng new ${projectName} --zoneless --ssr=false --skip-git --style=scss`, { stdio: "inherit" });
107
+ let cmd = `ng new ${projectName} ${zoneless ? "--zoneless" : ""} --ssr=false --skip-git --style=css`;
108
+ execSync(cmd.trim(), { stdio: "inherit" });
83
109
  process.chdir(projectName);
84
110
  show_status("Project berhasil dibuat!", "success");
85
111
  return projectName;
@@ -26,6 +26,7 @@
26
26
  "@ngx-pwa/local-storage": "^20.0.0",
27
27
  "postcss": "^8.5.6",
28
28
  "rxjs": "~7.8.0",
29
+ "sweetalert2": "^11.22.5",
29
30
  "tslib": "^2.3.0"
30
31
  },
31
32
  "devDependencies": {
@@ -0,0 +1,26 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import { AbstractApiService } from '@core/interceptors/jsonrpc';
4
+
5
+
6
+ @Injectable({
7
+ providedIn: 'root'
8
+ })
9
+ export class UserService extends AbstractApiService<any> {
10
+
11
+ constructor(
12
+ http: HttpClient
13
+ ) {
14
+ super(http, '');
15
+ }
16
+
17
+
18
+ get_user(endpoint?: string): Promise<any> {
19
+ return this.get(
20
+ endpoint ? endpoint : '/api/users'
21
+ );
22
+ }
23
+
24
+
25
+
26
+ }
@@ -1,5 +1,8 @@
1
- import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
1
+ import { ChangeDetectorRef, Component, effect, OnInit } from '@angular/core';
2
2
  import { RouterOutlet } from '@angular/router';
3
+ import { Entity_User } from '@core/models/entities/user.entity';
4
+ import { Repo_User } from '@core/respository/user/user_repo';
5
+
3
6
  import { logger } from '@shared/utils/logger';
4
7
  @Component({
5
8
  selector: 'app-root',
@@ -10,8 +13,21 @@ import { logger } from '@shared/utils/logger';
10
13
  export class App implements OnInit {
11
14
  protected title = 'OLD PROJECT';
12
15
 
13
- constructor(private cdr: ChangeDetectorRef) { }
16
+ user = Entity_User.state();
17
+
18
+ constructor(private cdr: ChangeDetectorRef, private repo_user: Repo_User) {
19
+ effect(() => {
20
+ const user = this.user.value;
21
+ logger.log('User state changed:', user);
22
+ })
23
+
24
+ }
25
+
26
+
14
27
  ngOnInit(): void {
28
+
29
+ this.repo_user.load_user();
30
+
15
31
  //MARK:TEST
16
32
  setTimeout(() => {
17
33
  this.ubah();
@@ -1,33 +1,33 @@
1
1
  import { signal, computed } from '@angular/core';
2
2
 
3
3
  export interface EntityState<T> {
4
- items: T[];
4
+ value: T[];
5
5
  loading: boolean;
6
6
  error?: string;
7
7
  }
8
8
 
9
9
  export function entityStoreFactory<T extends { id: string | number }>() {
10
- const _state = signal<EntityState<T>>({ items: [], loading: false });
10
+ const _state = signal<EntityState<T>>({ value: [], loading: false });
11
11
 
12
12
  return {
13
13
  state: _state,
14
14
 
15
15
  // Mutations
16
- setAll(items: T[]) {
17
- _state.set({ items, loading: false });
16
+ setAll(value: T[]) {
17
+ _state.set({ value, loading: false });
18
18
  },
19
19
 
20
20
  add(item: T) {
21
21
  _state.update((curr) => ({
22
22
  ...curr,
23
- items: [...curr.items, item]
23
+ value: [...curr.value, item]
24
24
  }));
25
25
  },
26
26
 
27
27
  update(id: T['id'], partial: Partial<T>) {
28
28
  _state.update((curr) => ({
29
29
  ...curr,
30
- items: curr.items.map((i) =>
30
+ value: curr.value.map((i) =>
31
31
  i.id === id ? { ...i, ...partial } : i
32
32
  )
33
33
  }));
@@ -36,27 +36,27 @@ export function entityStoreFactory<T extends { id: string | number }>() {
36
36
  remove(id: T['id']) {
37
37
  _state.update((curr) => ({
38
38
  ...curr,
39
- items: curr.items.filter((i) => i.id !== id)
39
+ value: curr.value.filter((i) => i.id !== id)
40
40
  }));
41
41
  },
42
42
 
43
43
  clear() {
44
- _state.set({ items: [], loading: false });
44
+ _state.set({ value: [], loading: false });
45
45
  },
46
46
 
47
47
  // Selectors
48
48
  getById: (id: T['id']) =>
49
- computed(() => _state().items.find((i) => i.id === id)),
49
+ computed(() => _state().value.find((i) => i.id === id)),
50
50
 
51
- all: computed(() => _state().items),
52
- count: computed(() => _state().items.length),
51
+ all: computed(() => _state().value),
52
+ count: computed(() => _state().value.length),
53
53
 
54
54
  // Async Loader
55
- async loadAll(fetchFn: () => Promise<T[]>) {
55
+ async load(fetchFn: () => Promise<T[]>) {
56
56
  _state.update((curr) => ({ ...curr, loading: true, error: undefined }));
57
57
  try {
58
58
  const data = await fetchFn();
59
- _state.set({ items: data, loading: false });
59
+ _state.set({ value: data, loading: false });
60
60
  } catch (err: any) {
61
61
  _state.update((curr) => ({
62
62
  ...curr,
@@ -22,6 +22,7 @@ export const jwtInterceptor: HttpInterceptorFn = (request, next) => {
22
22
  request = request.clone({
23
23
  setHeaders: {
24
24
  Authorization: `Bearer ${token.token}`,
25
+ 'x-api-key': 'reqres-free-v1' // hapus
25
26
  },
26
27
  });
27
28
  }
@@ -0,0 +1,15 @@
1
+ // import { entityStoreFactory } from "@core/config/entity-store";
2
+ import { singleStoreFactory } from "@core/config/single-store";
3
+
4
+
5
+
6
+ export interface User_m {
7
+ username: string;
8
+ email: string;
9
+ id: number;
10
+ role: string;
11
+ token: string;
12
+ }
13
+
14
+
15
+ export const Entity_User = singleStoreFactory<User_m>();
@@ -0,0 +1,27 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpClient } from '@angular/common/http';
3
+ import { ScreenEntity } from '@core/models/entities/screen.entity';
4
+ import { logger } from '@shared/utils/logger';
5
+ import { Entity_User } from '@core/models/entities/user.entity';
6
+ import { UserService } from '@api/user.service';
7
+
8
+ @Injectable({ providedIn: 'root' })
9
+ export class RepoScreen {
10
+
11
+
12
+ constructor(
13
+ private api: UserService
14
+ ) { }
15
+
16
+ load_user() {
17
+ Entity_User.load(async () => {
18
+ const res = await this.api.get_user();
19
+ const response = res?.data ?? [];
20
+ return response; // hanya return user
21
+ });
22
+ }
23
+
24
+ get getData() {
25
+ return ScreenEntity.state();
26
+ }
27
+ }
@@ -0,0 +1,26 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { UserService } from "@api/user.service";
3
+ import { Entity_User } from "@core/models/entities/user.entity";
4
+
5
+ @Injectable({ providedIn: 'root' })
6
+ export class Repo_User {
7
+
8
+
9
+ constructor(
10
+ private api: UserService
11
+ ) { }
12
+
13
+ load_user() {
14
+ Entity_User.load(async () => {
15
+ const res = await this.api.get_user();
16
+ const response = res?.data ?? null;
17
+ return response; // hanya return user
18
+ });
19
+ }
20
+
21
+
22
+ get getData() {
23
+ return Entity_User.state();
24
+ }
25
+
26
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unictive-angular",
3
- "version": "1.0.29",
3
+ "version": "1.0.31",
4
4
  "description": "CLI untuk membuat project Angular dengan struktur kustom (Modules, Core, API, Shared).",
5
5
  "scripts": {
6
6
  "build": "npm version patch && npm publish --access public"