11import { Component , ChangeDetectionStrategy , signal , inject , OnInit } from '@angular/core' ;
22import { CommonModule } from '@angular/common' ;
33import { FormsModule } from '@angular/forms' ;
4+ import { form } from '@angular/forms/signals' ;
45import { AdminSettingsService } from '@entities/admin-settings' ;
5- import { AdminLocation , OwnerInfo } from '@shared/models/admin-settings.model' ;
6- import { BusinessProfileComponent } from './ui/business-profile.component' ;
7- import { SocialMatrixComponent , SocialPlatform } from './ui/social-matrix.component' ;
8- import { GeneralInfoComponent } from './ui/general-info.component' ;
9- import { AdditionalLinksComponent , AdditionalLink } from './ui/additional-links.component' ;
10- import { SelectsSettingsComponent , SelectListType } from './ui/selects-settings.component' ;
6+ import { AdminSettings } from '@shared/models/admin-settings.model' ;
7+ import { BusinessProfileComponent } from './ui/business-profile/business-profile .component' ;
8+ import { SocialMatrixComponent , SocialPlatform } from './ui/social-matrix/social-matrix .component' ;
9+ import { GeneralInfoComponent } from './ui/general-info/general-info .component' ;
10+ import { AdditionalLinksComponent , AdditionalLink } from './ui/additional-links/additional-links .component' ;
11+ import { SelectsSettingsComponent , SelectListType } from './ui/selects-settings/selects-settings .component' ;
1112
1213type SettingsTab = 'Business Profile' | 'Social Matrix' | 'General Info' | 'Additional Links' | 'SELECTS' ;
1314
@@ -34,18 +35,23 @@ export class SettingsComponent implements OnInit {
3435 activeTab = signal < SettingsTab > ( 'Business Profile' ) ;
3536
3637 // Admin Settings State (Signals)
37- location = signal < AdminLocation > ( { address : '' , latitude : 0 , longitude : 0 } ) ;
38- ownerInfo = signal < OwnerInfo > ( { name : '' , phoneNumber : '' } ) ;
39- biography = signal < string > ( '' ) ;
40- philosophy = signal < string > ( '' ) ;
41-
42- // Selection Lists (Signals)
43- galleryCategories = signal < string [ ] > ( [ ] ) ;
44- treatmentCategories = signal < string [ ] > ( [ ] ) ;
45- veilSilhouettes = signal < string [ ] > ( [ ] ) ;
46- veilFabrics = signal < string [ ] > ( [ ] ) ;
47- veilTrainLengths = signal < string [ ] > ( [ ] ) ;
48- veilNecklines = signal < string [ ] > ( [ ] ) ;
38+ settingsModel = signal < AdminSettings > ( {
39+ id : '' ,
40+ location : { address : '' , latitude : 0 , longitude : 0 } ,
41+ ownerInfo : { name : '' , phoneNumber : '' } ,
42+ biography : '' ,
43+ philosophy : '' ,
44+ galleryCategories : [ ] ,
45+ treatmentCategories : [ ] ,
46+ veilSilhouettes : [ ] ,
47+ veilFabrics : [ ] ,
48+ veilTrainLengths : [ ] ,
49+ veilNecklines : [ ] ,
50+ socialLinks : { } ,
51+ workHours : { }
52+ } ) ;
53+
54+ settingsForm = form ( this . settingsModel ) ;
4955
5056 // UI-only for now or needs conversion
5157 socialPlatforms = signal < SocialPlatform [ ] > ( [
@@ -62,16 +68,11 @@ export class SettingsComponent implements OnInit {
6268 ngOnInit ( ) {
6369 this . adminSettingsService . getSettings ( ) . subscribe ( settings => {
6470 if ( settings ) {
65- this . location . set ( settings . location || { address : '' , latitude : 0 , longitude : 0 } ) ;
66- this . ownerInfo . set ( settings . ownerInfo || { name : '' , phoneNumber : '' } ) ;
67- this . biography . set ( settings . biography || '' ) ;
68- this . philosophy . set ( settings . philosophy || '' ) ;
69- this . galleryCategories . set ( settings . galleryCategories || [ ] ) ;
70- this . treatmentCategories . set ( settings . treatmentCategories || [ ] ) ;
71- this . veilSilhouettes . set ( settings . veilSilhouettes || [ ] ) ;
72- this . veilFabrics . set ( settings . veilFabrics || [ ] ) ;
73- this . veilTrainLengths . set ( settings . veilTrainLengths || [ ] ) ;
74- this . veilNecklines . set ( settings . veilNecklines || [ ] ) ;
71+ const current = this . settingsModel ( ) ;
72+ this . settingsModel . set ( {
73+ ...current ,
74+ ...settings
75+ } ) ;
7576 if ( settings . socialLinks && Object . keys ( settings . socialLinks ) . length > 0 ) {
7677 const platforms = Object . entries ( settings . socialLinks ) . map ( ( [ name , url ] , i ) => ( {
7778 id : Date . now ( ) + i ,
@@ -90,8 +91,8 @@ export class SettingsComponent implements OnInit {
9091
9192 saveBusinessProfile ( ) {
9293 this . adminSettingsService . updateSettings ( {
93- location : this . location ( ) ,
94- ownerInfo : this . ownerInfo ( )
94+ location : this . settingsModel ( ) . location ,
95+ ownerInfo : this . settingsModel ( ) . ownerInfo
9596 } ) . subscribe ( ) ;
9697 }
9798
@@ -107,56 +108,68 @@ export class SettingsComponent implements OnInit {
107108
108109 saveGeneralInfo ( ) {
109110 this . adminSettingsService . updateSettings ( {
110- biography : this . biography ( ) ,
111- philosophy : this . philosophy ( )
111+ biography : this . settingsModel ( ) . biography ,
112+ philosophy : this . settingsModel ( ) . philosophy
112113 } ) . subscribe ( ) ;
113114 }
114115
115116 saveSelectionLists ( ) {
116117 this . adminSettingsService . updateSettings ( {
117- galleryCategories : this . galleryCategories ( ) ,
118- treatmentCategories : this . treatmentCategories ( ) ,
119- veilSilhouettes : this . veilSilhouettes ( ) ,
120- veilFabrics : this . veilFabrics ( ) ,
121- veilTrainLengths : this . veilTrainLengths ( ) ,
122- veilNecklines : this . veilNecklines ( )
118+ galleryCategories : this . settingsModel ( ) . galleryCategories ,
119+ treatmentCategories : this . settingsModel ( ) . treatmentCategories ,
120+ veilSilhouettes : this . settingsModel ( ) . veilSilhouettes ,
121+ veilFabrics : this . settingsModel ( ) . veilFabrics ,
122+ veilTrainLengths : this . settingsModel ( ) . veilTrainLengths ,
123+ veilNecklines : this . settingsModel ( ) . veilNecklines
123124 } ) . subscribe ( ) ;
124125 }
125126
126127 // --- CRUD for Selection Lists ---
127-
128+ // (Note: To simplify the implementation, dynamic arrays are updated directly via the signal model)
128129 addItem ( type : SelectListType ) {
129130 const newItem = 'New Item' ;
130- switch ( type ) {
131- case 'gallery' : this . galleryCategories . update ( items => [ ...items , newItem ] ) ; break ;
132- case 'treatment' : this . treatmentCategories . update ( items => [ ...items , newItem ] ) ; break ;
133- case 'silhouette' : this . veilSilhouettes . update ( items => [ ...items , newItem ] ) ; break ;
134- case 'fabric' : this . veilFabrics . update ( items => [ ...items , newItem ] ) ; break ;
135- case 'train' : this . veilTrainLengths . update ( items => [ ...items , newItem ] ) ; break ;
136- case 'neckline' : this . veilNecklines . update ( items => [ ...items , newItem ] ) ; break ;
137- }
131+ this . settingsModel . update ( m => {
132+ const lists = { ...m } ;
133+ switch ( type ) {
134+ case 'gallery' : lists . galleryCategories = [ ...m . galleryCategories , newItem ] ; break ;
135+ case 'treatment' : lists . treatmentCategories = [ ...m . treatmentCategories , newItem ] ; break ;
136+ case 'silhouette' : lists . veilSilhouettes = [ ...m . veilSilhouettes , newItem ] ; break ;
137+ case 'fabric' : lists . veilFabrics = [ ...m . veilFabrics , newItem ] ; break ;
138+ case 'train' : lists . veilTrainLengths = [ ...m . veilTrainLengths , newItem ] ; break ;
139+ case 'neckline' : lists . veilNecklines = [ ...m . veilNecklines , newItem ] ; break ;
140+ }
141+ return lists ;
142+ } ) ;
138143 }
139144
140145 updateItem ( type : SelectListType , index : number , value : string ) {
141- switch ( type ) {
142- case 'gallery' : this . galleryCategories . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
143- case 'treatment' : this . treatmentCategories . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
144- case 'silhouette' : this . veilSilhouettes . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
145- case 'fabric' : this . veilFabrics . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
146- case 'train' : this . veilTrainLengths . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
147- case 'neckline' : this . veilNecklines . update ( items => { items [ index ] = value ; return [ ...items ] ; } ) ; break ;
148- }
146+ this . settingsModel . update ( m => {
147+ const lists = { ...m } ;
148+ switch ( type ) {
149+ case 'gallery' : lists . galleryCategories = lists . galleryCategories . map ( ( v , i ) => i === index ? value : v ) ; break ;
150+ case 'treatment' : lists . treatmentCategories = lists . treatmentCategories . map ( ( v , i ) => i === index ? value : v ) ; break ;
151+ case 'silhouette' : lists . veilSilhouettes = lists . veilSilhouettes . map ( ( v , i ) => i === index ? value : v ) ; break ;
152+ case 'fabric' : lists . veilFabrics = lists . veilFabrics . map ( ( v , i ) => i === index ? value : v ) ; break ;
153+ case 'train' : lists . veilTrainLengths = lists . veilTrainLengths . map ( ( v , i ) => i === index ? value : v ) ; break ;
154+ case 'neckline' : lists . veilNecklines = lists . veilNecklines . map ( ( v , i ) => i === index ? value : v ) ; break ;
155+ }
156+ return lists ;
157+ } ) ;
149158 }
150159
151160 removeItem ( type : SelectListType , index : number ) {
152- switch ( type ) {
153- case 'gallery' : this . galleryCategories . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
154- case 'treatment' : this . treatmentCategories . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
155- case 'silhouette' : this . veilSilhouettes . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
156- case 'fabric' : this . veilFabrics . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
157- case 'train' : this . veilTrainLengths . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
158- case 'neckline' : this . veilNecklines . update ( items => items . filter ( ( _ , i ) => i !== index ) ) ; break ;
159- }
161+ this . settingsModel . update ( m => {
162+ const lists = { ...m } ;
163+ switch ( type ) {
164+ case 'gallery' : lists . galleryCategories = lists . galleryCategories . filter ( ( _ , i ) => i !== index ) ; break ;
165+ case 'treatment' : lists . treatmentCategories = lists . treatmentCategories . filter ( ( _ , i ) => i !== index ) ; break ;
166+ case 'silhouette' : lists . veilSilhouettes = lists . veilSilhouettes . filter ( ( _ , i ) => i !== index ) ; break ;
167+ case 'fabric' : lists . veilFabrics = lists . veilFabrics . filter ( ( _ , i ) => i !== index ) ; break ;
168+ case 'train' : lists . veilTrainLengths = lists . veilTrainLengths . filter ( ( _ , i ) => i !== index ) ; break ;
169+ case 'neckline' : lists . veilNecklines = lists . veilNecklines . filter ( ( _ , i ) => i !== index ) ; break ;
170+ }
171+ return lists ;
172+ } ) ;
160173 }
161174
162175 // --- Social Platform methods ---
0 commit comments