From da18250f2df097c483c96f3357ae494898299a57 Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Date: Mon, 2 Jun 2025 15:54:47 +0530 Subject: [PATCH] stepper --- .../Stepper_workflow.component.html | 405 ++++++++++++++++++ .../Stepper_workflow.component.scss | 78 ++++ .../Stepper_workflow.component.ts | 243 +++++++++++ .../Stepper_workflow.service.ts | 39 ++ .../Stepper_workflow_cardvariable.ts | 4 + .../test1/test1.component.css.map | 1 + .../test1/test1.component.html | 157 +++++++ .../test1/test1.component.scss | 46 ++ .../test1/test1.component.spec.ts | 25 ++ .../stepperworkflow/test1/test1.component.ts | 387 +++++++++++++++++ .../stepperworkflow/test1/test1.service.ts | 83 ++++ .../app/modules/main/main-routing.module.ts | 31 +- .../src/app/modules/main/main.module.ts | 16 +- .../src/app/modules/main/superadmin.zip | Bin 0 -> 32277 bytes 14 files changed, 1502 insertions(+), 13 deletions(-) create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.html create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.scss create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.service.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow_cardvariable.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.css.map create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.html create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.scss create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.spec.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.service.ts create mode 100644 frontend/angular-clarity-master/src/app/modules/main/superadmin.zip diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.html b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.html new file mode 100644 index 0000000..5318bd5 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.html @@ -0,0 +1,405 @@ + +
+
+
+

Stepper Workflow

+
+
+ + + +
+
+ + + + Loading ... + +
{{error}}
+
+ + Name + + + + Description + + + + Active + + + + + + Action + + + + + + {{user. name }} + + + + + + + {{user. active }} + + + + + + + +
Who Column
+
Account ID: {{user.accountId}}
+
Created At: {{user.createdAt| date}}
+
Created By: {{user.createdBy}}
+
Updated At: {{user.updatedAt | date}}
+
Updated By: {{user.updatedBy}}
+
+
+ + + + + +
+ + + + + + + +
+ + + Users per page + {{pagination.firstItem + 1}} - {{pagination.lastItem + 1}} + of {{pagination.totalItems}} users + + +
+ + + +
+
+
+
+
+
+ +
+
+ {{beforeText(item.fieldtext)}} + {{ app[transform(item.fieldtext) ] }} + {{afterText(item.fieldtext)}} +
+ +
+ {{beforeText(item.fieldtext)}} + {{ app[transform(item.fieldtext) ] | date}} + {{afterText(item.fieldtext)}} +
+
+ {{beforeText(item.fieldtext)}} + {{ app[transform(item.fieldtext) ]}} + {{afterText(item.fieldtext)}} +
+ +
+
+
+ + +
+ +
+ +
+ File Preview +
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.scss b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.scss new file mode 100644 index 0000000..c47b921 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.scss @@ -0,0 +1,78 @@ +//@import "../../../../assets/scss/var"; +.s-info-bar { + display: flex; + flex-direction: row; + justify-content: space-between; + button { + outline: none; + } +} +.delete,.heading{ + text-align: center; + color: red; +} +.entry-pg { + width: 750px; +} + +.button1::after { + content: none; +} +.button1:hover::after { + content: "ADD ROWS"; +} + +.section { + background-color: #dddddd; + height: 40px; +} + +.section p { + //color: white; + padding: 10px; + font-size: 18px; +} + +.clr-input { + color: #212529; + border: 1px solid #ced4da; + border-radius: 0.25rem; + padding: 0.75rem 0.75rem; + margin-top: 3px; + width: 100%; + margin-bottom: 10px; +} + +.clr-file { + color: #212529; + border: 1px solid #ced4da; + border-radius: 0.25rem; + //padding: 0.6rem 0.75rem; + margin-top: 3px; + width: 100%; + margin-bottom: 10px; +} + +.center { + text-align: center; +} +select{ + width: 100%; + margin-top: 3px; + padding: 5px 5px; + border: 1px solid #ccc; + border-radius: 4px; +} +input[type=text],[type=date],[type=number],textarea { + width: 100%; + padding: 15px 15px; + background-color:rgb(255, 255, 255); + // margin: 8px 0; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} +.error_mess { + color: red; +} diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.ts new file mode 100644 index 0000000..0edb0c9 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component.ts @@ -0,0 +1,243 @@ +import { Component, OnInit } from '@angular/core'; +import { ToastrService } from 'ngx-toastr'; +import { AlertService } from 'src/app/services/alert.service'; +import { Stepper_workflowservice } from './Stepper_workflow.service'; +import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators, ValidationErrors } from '@angular/forms'; +import { ExtensionService } from 'src/app/services/fnd/extension.service'; +import { DashboardContentModel2 } from 'src/app/models/builder/dashboard'; +import { Stepper_workflowcardvariable } from './Stepper_workflow_cardvariable'; +import { UserInfoService } from 'src/app/services/user-info.service'; +import { ActivatedRoute, Router } from '@angular/router'; + +declare var JsBarcode: any; +@Component({ + selector: 'app-Stepper_workflow', + templateUrl: './Stepper_workflow.component.html', + styleUrls: ['./Stepper_workflow.component.scss'] +}) +export class Stepper_workflowComponent implements OnInit { + cardButton = Stepper_workflowcardvariable.cardButton; + cardmodeldata = Stepper_workflowcardvariable.cardmodeldata; + public dashboardArray: DashboardContentModel2[]; + isCardview = Stepper_workflowcardvariable.cardButton; + cardmodal; changeView() { + this.isCardview = !this.isCardview; + } + beforeText(fieldtext: string): string { // Extract the text before the first '<' + const index = fieldtext.indexOf('<'); + return index !== -1 ? fieldtext.substring(0, index) : fieldtext; + } + afterText(fieldtext: string): string { // Extract the text after the last '>' + const index = fieldtext.lastIndexOf('>'); + return index !== -1 ? fieldtext.substring(index + 1) : ''; + } + transform(fieldtext: string): string { + const match = fieldtext.match(/<([^>]*)>/); + return match ? match[1] : ''; // Extract the text between '<' and '>' + } + userrole; + rowSelected: any = {}; + modaldelete = false; + modalEdit = false; + modalAdd = false; + public entryForm: FormGroup; + loading = false; + product; + modalOpenedforNewLine = false; + newLine: any; + additionalFieldsFromBackend: any[] = []; + formcode = 'Stepper_workflow_formCode' + tableName = 'Stepper_workflow'; checkFormCode; selected: any[] = []; constructor( + private extensionService: ExtensionService, + private userInfoService: UserInfoService, + private mainService: Stepper_workflowservice, + private alertService: AlertService, + private toastr: ToastrService, + private _fb: FormBuilder, + private router: Router, + private route: ActivatedRoute, + ) { } + // component button + ngOnInit(): void { + if (this.cardmodeldata !== '') { + this.cardmodal = JSON.parse(this.cardmodeldata); + this.dashboardArray = this.cardmodal.dashboard.slice(); + console.log(this.dashboardArray) + } + this.userrole = this.userInfoService.getRoles(); + this.getData(); + this.entryForm = this._fb.group({ + name: [null], + + description: [null], + + active: [false], + + + + + + + + + }); // component_button200 + // form code start + this.extensionService.getJsonObjectsByFormCodeList(this.formcode).subscribe(data => { + console.log(data); + const jsonArray = data.map((str) => JSON.parse(str)); + this.additionalFieldsFromBackend = jsonArray; + this.checkFormCode = this.additionalFieldsFromBackend.some(field => field.formCode === "Stepper_workflow_formCode"); + console.log(this.checkFormCode); + console.log(this.additionalFieldsFromBackend); + if (this.additionalFieldsFromBackend && this.additionalFieldsFromBackend.length > 0) { + this.additionalFieldsFromBackend.forEach(field => { + if (field.formCode === this.formcode) { + if (!this.entryForm.contains(field.extValue)) { + // Add the control only if it doesn't exist in the form + this.entryForm.addControl(field.extValue, this._fb.control(field.fieldValue)); + } + } + }); + } + }); + console.log(this.entryForm.value); + // form code end + + + } + + + error; + getData() { + this.mainService.getAll().subscribe((data) => { + console.log(data); + this.product = data; + if (this.product.length == 0) { + this.error = "No Data Available" + } + }, (error) => { + console.log(error); + if (error) { + this.error = "Server Error"; + } + }); + } + onEdit(row) { + this.rowSelected = row; + + this.modalEdit = true; + } + onDelete(row) { + this.rowSelected = row; + this.modaldelete = true; + } + delete(id) { + this.modaldelete = false; + console.log("in delete " + id); + this.mainService.delete(id).subscribe( + (data) => { + console.log(data); + this.ngOnInit(); + if (data) { this.toastr.success('Deleted successfully'); } + }); + } + onUpdate(id) { + this.modalEdit = false; + + + //console.log("in update"); + console.log("id " + id); + console.log(this.rowSelected); + //console.log("out update"); + this.mainService.update(id, this.rowSelected).subscribe( + (data) => { + console.log(data); + if (data || data.status >= 200 && data.status <= 299) { + this.toastr.success("Update Successfully"); + } + setTimeout(() => { + this.ngOnInit(); + }, 500); + + }, (error) => { + console.log(error); + if (error.status >= 200 && error.status <= 299) { + // this.toastr.success("update Succesfully"); + } + if (error.status >= 400 && error.status <= 499) { + this.toastr.error("Not Updated"); + } + if (error.status >= 500 && error.status <= 599) { + this.toastr.error("Not Updated"); + } + }); + setTimeout(() => { + this.ngOnInit(); + }, 500); + } + onCreate() { + this.modalAdd = false; + + this.mainService.create(this.entryForm.value).subscribe( + (data) => { + console.log(data); + if (data || data.status >= 200 && data.status <= 299) { + this.toastr.success("Added Successfully"); + } + setTimeout(() => { + this.ngOnInit(); + }, 500); + + }, (error) => { + console.log(error); + if (error.status >= 200 && error.status <= 299) { + // this.toastr.success("Added Succesfully"); + } + if (error.status >= 400 && error.status <= 499) { + this.toastr.error("Not Added"); + } + if (error.status >= 500 && error.status <= 599) { + this.toastr.error("Not Added"); + } + }); + setTimeout(() => { + this.ngOnInit(); + }, 500); + } + goToAdd(row) { + this.modalAdd = true; this.submitted = false; + + } + submitted = false; + onSubmit() { + console.log(this.entryForm.value); + this.submitted = true; + if (this.entryForm.invalid) { + return; + } this.onCreate(); + + } + + + rsModaldescription = false; + goToReplaceStringdescription(row) { + this.rowSelected = row; this.rsModaldescription = true; + } + + + gotoStepper(id) { + + console.log('id is ', id) + // this.router.navigate(["/cns-portal/SiteBuilder"]); + + this.router.navigate(["../Test1/", id], { relativeTo: this.route }); + + } + + // updateaction +} + + + + + diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.service.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.service.ts new file mode 100644 index 0000000..da9eebd --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { Observable } from "rxjs"; +import { HttpClient, HttpHeaders, HttpParams, } from "@angular/common/http"; +import { ApiRequestService } from "src/app/services/api/api-request.service"; +import { environment } from 'src/environments/environment'; +@Injectable({ + providedIn: 'root' +}) +export class Stepper_workflowservice{ + private baseURL = "Stepper_workflow/Stepper_workflow" ; constructor( + private http: HttpClient, + private apiRequest: ApiRequestService, + ) { } + getAll(page?: number, size?: number): Observable { + return this.apiRequest.get(this.baseURL); + } + getById(id: number): Observable { + const _http = this.baseURL + "/" + id; + return this.apiRequest.get(_http); + } + create(data: any): Observable { + return this.apiRequest.post(this.baseURL, data); + } + update(id: number, data: any): Observable { + const _http = this.baseURL + "/" + id; + return this.apiRequest.put(_http, data); + } + delete(id: number): Observable { + const _http = this.baseURL + "/" + id; + return this.apiRequest.delete(_http); + } + + + + + + +// updateaction +} \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow_cardvariable.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow_cardvariable.ts new file mode 100644 index 0000000..1cdd2a5 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow_cardvariable.ts @@ -0,0 +1,4 @@ +export const Stepper_workflowcardvariable = { + "cardButton": false, + "cardmodeldata": `` +} \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.css.map b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.css.map new file mode 100644 index 0000000..810a211 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["test1.component.scss","test1.component.css"],"names":[],"mappings":"AAAA;EACE,UAAA;EACA,YAAA;ACCF;;ADCA;EACE,UAAA;EACA,aAAA;ACEF;;ADAA;EACE,UAAA;EACA,aAAA;ACGF;;ADDA;EACE,UAAA;EACA,aAAA;ACIF;;ADDA;EACE,WAAA;EACA,aAAA;ACIF;;ADDA;EACE,WAAA;EACA,kBAAA;EACA,aAAA;EACA,qBAAA;EACA,sBAAA;EACA,kBAAA;EACA,sBAAA;ACIF;;ADFA;EACE,UAAA;ACKF;;ADHA;EACE,kBAAA;ACMF;;ADHA;EACE,WAAA;ACMF;;ADJA;EACA;IACA,WAAA;ECOE;AACF","file":"test1.component.css"} \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.html b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.html new file mode 100644 index 0000000..e28cf67 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.html @@ -0,0 +1,157 @@ + + +
+ + + + + + + +
+ +
+
+
+
+

Customer Information

+
+ +
+ + + + + step 0 + Application Update + Datagrid + Create/test1
Information Of + Customer
+
+ step 1 + Application Update + Datagrid + Create/test2
Information Of + Customer
+ +
+ Step 2 + Review And
Confirmation
+ + Finish . + +
+
+
+
+
+ +
+
+

test1

+

Update {{test1entryForm.name}}

+
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+ +
+ +
+
+ + + + + +
+
+
+ +
+ +
+
+ +
+
+

test2

+

Update {{test2entryForm.name}}

+
+ +
+ + +
+ +
+ +
+
+ + +
+ +
+ + +
+ + +
+ +
+ +
+ +
+
+ + + + + +
+
+
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.scss b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.scss new file mode 100644 index 0000000..35a9e5a --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.scss @@ -0,0 +1,46 @@ +.horizontal{ + width: 25%; + padding: 5px; +} +.horizontal1{ + width: 50%; + padding: 10px; +} +.middle{ + width: 33%; + padding: 10px; +} +.middle1{ + width: 75%; + padding: 10px; +} + +.full{ + width: 100%; + padding: 10px; +} + +input[type=text],[type=date], select { + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} +.required-field{ + color: red; +} +.center { + text-align: center; + +} +.center{ + color: blue; +} +@media (max-width: 600px){ +.horizontal,.middle,.horizontal1,.middle1 { +width: 100%; +}} + diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.spec.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.spec.ts new file mode 100644 index 0000000..bc24b18 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { test1Component } from './test1.component'; + +describe('test1Component', () => { + let component: test1Component; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ test1Component ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(test1Component); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.ts new file mode 100644 index 0000000..9e9d7db --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.component.ts @@ -0,0 +1,387 @@ +import { Component, OnInit } from '@angular/core'; + + +import { ToastrService } from 'ngx-toastr'; +import { ActivatedRoute, Router } from '@angular/router'; +import { College } from 'src/app/models/fnd/play'; +import { student } from 'src/app/models/fnd/Studentadd'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ValidationError } from 'src/app/models/fnd/ValidationError'; +import { test1service } from './test1.service'; +import { Observable } from 'rxjs'; +@Component({ + selector: 'app-editstepper', + templateUrl: './test1.component.html', + styleUrls: ['./test1.component.scss'] +}) +export class test1Component implements OnInit { + updated = false; + // college: College; + stringJson: any; + customerId: string = ''; + selectedFile!: File; + fileName = ''; + + id: number; + errorFields: ValidationError[] = []; + appToUpdate: College = null; + trained = false; + + json: string = ""; + luisApp = + { + name: '', + created: 1, + trained: 1, + tested: 1, + updated: 1, + published: 1, + + }; + // Layout direction changing + layout = { + direction: "vertical", + block1: "clr-col-lg-3 clr-col-12 ", + block2: "clr-col-lg-9 clr-col-12 ", + }; + + timelineStyle = { + step0: { state: "current", open: true, failed: false }, + step1: { state: "not-started", open: false, failed: false }, + step2: { state: "not-started", open: false, failed: false }, + + }; + public test1entryForm: FormGroup; + public test2entryForm: FormGroup; + submitted = false; + rowSelected: any = {}; + modalcomplete = false; + + constructor(private mainService: test1service, + + private test1_fb: FormBuilder, + private test2_fb: FormBuilder, + private router: Router, + private route: ActivatedRoute, + private toastr: ToastrService, + ) { } + + ngOnInit(): void { + // this.college = new College(); + this.id = this.route.snapshot.params["id"]; + console.log("update with id = ", this.id); + + this.test1entryForm = this.test1_fb.group({ + name: [null], + + description: [null], + + active: [false], + + }); + + this.test2entryForm = this.test2_fb.group({ + name: [null], + + description: [null], + + }); + const stepId = this.id; // or from route/query/etc + this.getResolvedDataFromStepper(stepId).subscribe(res => { + console.log('response get ', res); + + if (res === null) { + this.showEmptyForm(); + } else { + if (res['Test2']) { + this.prefillTest1Form(res['Test2']); + } + + if (res['Basicp']) { + this.prefillTest2Form(res['Basicp']); + } + + } + }); + + + } + + showEmptyForm(): void { + console.log('No config found. Showing empty form.'); + // You can choose to show one or both based on some logic + this.test1entryForm.reset(); + this.test2entryForm.reset(); + } + + prefillTest1Form(data: any): void { + + console.log(' test1 data ', data) + this.test1entryForm.patchValue({ + id: data.id || '', + name: data.name || '', + description: data.description || '', + active: data.active || false + }); + } + + prefillTest2Form(data: any): void { + console.log(' test2 data ', data) + + this.test2entryForm.patchValue({ + id: data.id || '', + name: data.name || '', + description: data.description || '' + }); + } + + + getResolvedDataFromStepper(id: number): Observable { + console.log('get step config'); + + return new Observable(observer => { + this.mainService.gettabledata(id).subscribe(configList => { + if (!configList || configList.length === 0) { + console.log('empty config'); + observer.next(null); + observer.complete(); + return; + } + + const results: { [key: string]: any } = {}; + let processed = 0; + + configList.forEach(config => { + const { table_name, table_id } = config; + + this.getByTableNameAndId(table_name, table_id).subscribe(data => { + + console.log('data is ', data); + results[table_name] = data; + + processed++; + if (processed === configList.length) { + observer.next(results); // emit combined data + observer.complete(); + } + + }, error => { + console.error(`Error loading data for table ${table_name}`, error); + processed++; + if (processed === configList.length) { + observer.next(results); // continue with what we have + observer.complete(); + } + }); + }); + + }, error => { + console.error("Error loading stepper config", error); + observer.error(error); + }); + }); + } + + + + getByTableNameAndId(tableName: string, id: number): Observable { + + switch (tableName) { + case 'Test2': + return this.mainService.getTest2ById(id); + case 'Basicp': + return this.mainService.getBasicpById(id); + // aur bhi cases agar naye table add ho to + default: + throw new Error(`Unknown table name: ${tableName}`); + } + } + + // Change to Horizontal Layout + changeToHorizonTal() { + this.layout = { + direction: "horizontal", + block1: "clr-col-lg-12 clr-col-12 height container", + block2: "clr-col-lg-12 clr-col-12 container", + } + } + // Change to Vertical Layout + changeToVertical() { + this.layout = { + direction: "vertical", + block1: "clr-col-lg-3 clr-col-12 ", + block2: "clr-col-lg-9 clr-col-12 ", + } + } + + + + ontest1Save() { + console.log('Form Submitted:', this.test1entryForm.value); + this.submitted = true; + if (this.test1entryForm.invalid) { + + console.log('invalid form ..'); + // Log all form errors + Object.keys(this.test1entryForm.controls).forEach(field => { + const control = this.test1entryForm.get(field); + if (control && control.invalid) { + console.log(`Error in field: ${field}`, control.errors); + } + } + ); + return; + } + this.ontest1Create(); + } + + ontest1Create() { + this.mainService.createTest2(this.test1entryForm.value).subscribe( + (data) => { + console.log('adding data ', data); + this.customerId = data.id; + + console.log('id is ', this.customerId); + const tableId = data.id; + const tableName = 'Test2'; + const stepperId = this.id; + + // Save stepper config + this.mainService.saveStepperConfig(stepperId, tableId, tableName).subscribe(() => { + this.toastr.success("Stepper Config Saved"); + }); + + if (data || data.status >= 200 && data.status <= 299) { + this.toastr.success("Added Successfully"); + } + setTimeout(() => { + this.ngOnInit(); + }, 500); + + }, (error) => { + console.log(error); + if (error.status >= 200 && error.status <= 299) { + // this.toastr.success("Added Succesfully"); + } + if (error.status >= 400 && error.status <= 499) { + this.toastr.error("Not Added"); + } + if (error.status >= 500 && error.status <= 599) { + this.toastr.error("Not Added"); + } + }); + this.rowSelected = this.test1entryForm.value; + + setTimeout(() => { + this.ngOnInit(); + }, 500); + } + + + ontest2Save() { + console.log('Form Submitted:', this.test2entryForm.value); + this.submitted = true; + if (this.test2entryForm.invalid) { + + console.log('invalid form ..'); + // Log all form errors + Object.keys(this.test2entryForm.controls).forEach(field => { + const control = this.test2entryForm.get(field); + if (control && control.invalid) { + console.log(`Error in field: ${field}`, control.errors); + } + } + ); + return; + } + this.ontest2Create(); + } + + ontest2Create() { + this.mainService.createBasicp(this.test2entryForm.value).subscribe( + (data) => { + console.log('adding data ', data); + this.customerId = data.id; + + console.log('id is ', this.customerId); + + const tableId = data.id; + const tableName = 'Basicp'; + const stepperId = this.id; + + // Save stepper config + this.mainService.saveStepperConfig(stepperId, tableId, tableName).subscribe(() => { + this.toastr.success("Stepper Config Saved"); + }); + + if (data || data.status >= 200 && data.status <= 299) { + this.toastr.success("Added Successfully"); + } + setTimeout(() => { + this.ngOnInit(); + }, 500); + + }, (error) => { + console.log(error); + if (error.status >= 200 && error.status <= 299) { + // this.toastr.success("Added Succesfully"); + } + if (error.status >= 400 && error.status <= 499) { + this.toastr.error("Not Added"); + } + if (error.status >= 500 && error.status <= 599) { + this.toastr.error("Not Added"); + } + }); + this.rowSelected = this.test2entryForm.value; + + setTimeout(() => { + this.ngOnInit(); + }, 500); + } + + + onnext() { + this.router.navigate(["../../main/workflow"], { relativeTo: this.route }); + } + reset() { + this.json = ""; + this.luisApp = + { + name: '', + trained: 1, + tested: 1, + updated: 1, + published: 1, + created: 1, + + }; + + this.timelineStyle = { + step0: { state: "current", open: true, failed: false }, + step1: { state: "not-started", open: false, failed: false }, + step2: { state: "not-started", open: false, failed: false }, + + }; + } + current() { + console.log(this.timelineStyle) + this.stringJson = JSON.stringify(this.timelineStyle); + console.log("String json object :", this.stringJson); + + // this.mainService.update(this.id, this.college, this.stringJson).subscribe( + // (data) => { + // console.log(data); + // }, + + // ); + } + + + rsModaldescription = false; + goToReplaceStringdescription(row) { + this.rowSelected = row; this.rsModaldescription = true; + } + + // updateaction +} \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.service.ts b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.service.ts new file mode 100644 index 0000000..3791929 --- /dev/null +++ b/frontend/angular-clarity-master/src/app/modules/main/BuilderComponents/stepperworkflow/test1/test1.service.ts @@ -0,0 +1,83 @@ +import { Injectable } from '@angular/core'; +import { Observable } from "rxjs"; +import { HttpClient, HttpHeaders, HttpParams, } from "@angular/common/http"; +import { ApiRequestService } from "src/app/services/api/api-request.service"; +import { environment } from 'src/environments/environment'; +@Injectable({ + providedIn: 'root' +}) +export class test1service { + + private StepperURL = "Stepper_table_config/Stepper_table_config"; + + private Test2URL = "Test2/Test2"; + private BasicpURL = "Basicp/Basicp"; + + constructor( + private http: HttpClient, + private apiRequest: ApiRequestService, + ) { } + + gettabledata(id: number): Observable { + const _http = this.StepperURL + "/stepId/" + id; + return this.apiRequest.get(_http); + } + + saveStepperConfig(stepperId: number, tableId: number, tableName: string): Observable { + const params = new HttpParams() + .set('stepperId', stepperId.toString()) + .set('tableId', tableId.toString()) + .set('tableName', tableName); + + return this.apiRequest.post(this.StepperURL, null, params); // null body, params used + } + + + getAllTest2(page?: number, size?: number): Observable { + return this.apiRequest.get(this.Test2URL); + } + getTest2ById(id: number): Observable { + const _http = this.Test2URL + "/" + id; + return this.apiRequest.get(_http); + } + createTest2(data: any): Observable { + return this.apiRequest.post(this.Test2URL, data); + } + updateTest2(id: number, data: any): Observable { + const _http = this.Test2URL + "/" + id; + return this.apiRequest.put(_http, data); + } + deleteTest2(id: number): Observable { + const _http = this.Test2URL + "/" + id; + return this.apiRequest.delete(_http); + } + + + + + + + getAllBasicp(page?: number, size?: number): Observable { + return this.apiRequest.get(this.BasicpURL); + } + getBasicpById(id: number): Observable { + const _http = this.BasicpURL + "/" + id; + return this.apiRequest.get(_http); + } + createBasicp(data: any): Observable { + return this.apiRequest.post(this.BasicpURL, data); + } + updateBasicp(id: number, data: any): Observable { + const _http = this.BasicpURL + "/" + id; + return this.apiRequest.put(_http, data); + } + deleteBasicp(id: number): Observable { + const _http = this.BasicpURL + "/" + id; + return this.apiRequest.delete(_http); + } + + + + + // updateaction +} \ No newline at end of file diff --git a/frontend/angular-clarity-master/src/app/modules/main/main-routing.module.ts b/frontend/angular-clarity-master/src/app/modules/main/main-routing.module.ts index c7450e8..4e04639 100644 --- a/frontend/angular-clarity-master/src/app/modules/main/main-routing.module.ts +++ b/frontend/angular-clarity-master/src/app/modules/main/main-routing.module.ts @@ -1,7 +1,4 @@ - - - import { SequencegenaratorComponent } from './fnd/sequencegenarator/sequencegenarator.component'; import { Component, NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; @@ -84,9 +81,11 @@ import { MappingruleComponent } from './datamanagement/mappingrule/mappingrule.c import { MappingruleallComponent } from './datamanagement/mappingrule/mappingruleall/mappingruleall.component'; import { MappingruleaddComponent } from './datamanagement/mappingrule/mappingruleadd/mappingruleadd.component'; import { MappingruleeditComponent } from './datamanagement/mappingrule/mappingruleedit/mappingruleedit.component'; -import { QueryComponent } from './superadmin/query/query.component'; -import { QueryaddComponent } from './superadmin/queryadd/queryadd.component'; -import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; +import { test1Component } from './BuilderComponents/stepperworkflow/test1/test1.component'; +import { Stepper_workflowComponent } from './BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component'; +// import { QueryComponent } from './superadmin/query/query.component'; +// import { QueryaddComponent } from './superadmin/queryadd/queryadd.component'; +// import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; @@ -132,9 +131,9 @@ const routes: Routes = [ //SUPER ADMIN - { path: 'query', component: QueryComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, - { path: 'reportQuery/:id/queryadd', component: QueryaddComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, - { path: 'reportQuery/queryedit/:id', component: QueryeditComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, + // { path: 'query', component: QueryComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, + // { path: 'reportQuery/:id/queryadd', component: QueryaddComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, + // { path: 'reportQuery/queryedit/:id', component: QueryeditComponent, canActivate: [AuthGuard], data: { roles: [Role.Admin] } }, @@ -259,6 +258,20 @@ const routes: Routes = [ // buildercomponents + + + + { path: 'Stepper_workflow', component: Stepper_workflowComponent }, + + { path: 'Test1/:id', component: test1Component }, + + + + + + + + { path: '**', component: PageNotFoundComponent }, ] diff --git a/frontend/angular-clarity-master/src/app/modules/main/main.module.ts b/frontend/angular-clarity-master/src/app/modules/main/main.module.ts index dacaf40..ae29aea 100644 --- a/frontend/angular-clarity-master/src/app/modules/main/main.module.ts +++ b/frontend/angular-clarity-master/src/app/modules/main/main.module.ts @@ -104,9 +104,11 @@ import { MappingruleComponent } from './datamanagement/mappingrule/mappingrule.c import { MappingruleaddComponent } from './datamanagement/mappingrule/mappingruleadd/mappingruleadd.component'; import { MappingruleallComponent } from './datamanagement/mappingrule/mappingruleall/mappingruleall.component'; import { MappingruleeditComponent } from './datamanagement/mappingrule/mappingruleedit/mappingruleedit.component'; -import { QueryComponent } from './superadmin/query/query.component'; -import { QueryaddComponent } from './superadmin/queryadd/queryadd.component'; -import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; +import { test1Component } from './BuilderComponents/stepperworkflow/test1/test1.component'; +import { Stepper_workflowComponent } from './BuilderComponents/stepperworkflow/Stepper_workflow/Stepper_workflow.component'; +// import { QueryComponent } from './superadmin/query/query.component'; +// import { QueryaddComponent } from './superadmin/queryadd/queryadd.component'; +// import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; @NgModule({ declarations: [ @@ -118,7 +120,8 @@ import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; DashboardnewComponent, EditformnewdashComponent, EditnewdashComponent, ScheduleComponent, DoughnutChartComponent, LineChartComponent, RadarChartComponent, BarChartComponent, BubbleChartComponent, DynamicChartComponent, ScatterChartComponent, PolarChartComponent, PieChartComponent, FinancialChartComponent, ToDoChartComponent, GridViewComponent, DashrunnerlineComponent, BarRunnerComponent, LineRunnerComponent, DoughnutRunnerComponent, GridRunnerComponent, PieRunnerComponent, PolarRunnerComponent, RadarRunnerComponent, ScatterRunnerComponent, TodoRunnerComponent, BubbleRunnerComponent, - ReportBuildComponent, ReportbuildeditComponent, ReportbuildqueryComponent, ReportBuild2Component, ReportBuild2editComponent, QueryComponent, QueryaddComponent, QueryeditComponent, + ReportBuildComponent, ReportbuildeditComponent, ReportbuildqueryComponent, ReportBuild2Component, ReportBuild2editComponent, + // QueryComponent, QueryaddComponent, QueryeditComponent, ExtensionComponent, AllextensionComponent, AddextensionComponent, EditextensionComponent, ApiregisteryComponent, @@ -128,6 +131,11 @@ import { QueryeditComponent } from './superadmin/queryedit/queryedit.component'; // buildercomponents + Stepper_workflowComponent, + test1Component, + + + ], imports: [ diff --git a/frontend/angular-clarity-master/src/app/modules/main/superadmin.zip b/frontend/angular-clarity-master/src/app/modules/main/superadmin.zip new file mode 100644 index 0000000000000000000000000000000000000000..06627f665445ab07e21a5cb5e3a94170a2bbc328 GIT binary patch literal 32277 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

>>ozm@id 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 K(bb^A|NaLDuDPE8 literal 0 HcmV?d00001