File

src/app/modules/manage/components/user-org-management/user-org-management.component.ts

Implements

OnInit AfterViewInit OnDestroy

Metadata

Index

Properties
Methods

Constructor

constructor(activatedRoute: ActivatedRoute, navigationhelperService: NavigationHelperService, userService: UserService, manageService: ManageService, router: Router, toasterService: ToasterService, resourceService: ResourceService, layoutService: LayoutService, telemetryService: TelemetryService, tncService: TncService)
Parameters :
Name Type Optional
activatedRoute ActivatedRoute No
navigationhelperService NavigationHelperService No
userService UserService No
manageService ManageService No
router Router No
toasterService ToasterService No
resourceService ResourceService No
layoutService LayoutService No
telemetryService TelemetryService No
tncService TncService No

Methods

assignUserRole
assignUserRole()
Returns : void
closeUserValidationModal
closeUserValidationModal()
Returns : void
Public downloadCSVFile
downloadCSVFile(slug, status, fileName: any)
Parameters :
Name Type Optional
slug No
status No
fileName any No
Returns : void
downloadFile
downloadFile(path)
Parameters :
Name Optional
path No
Returns : void
Public downloadZipFile
downloadZipFile(slug, fileName: any)
Parameters :
Name Type Optional
slug No
fileName any No
Returns : void
fetchDeclaredUserDetails
fetchDeclaredUserDetails()
Returns : void
Public fileChanged
fileChanged(event)
Parameters :
Name Optional
event No
Returns : void
Public geoTableView
geoTableView()
Returns : void
getAdminPolicyTnC
getAdminPolicyTnC()
Returns : void
Public getGeoDetail
getGeoDetail()
Returns : void
Public getGeoJSON
getGeoJSON()
Returns : void
initLayout
initLayout()
Returns : void
ngAfterViewInit
ngAfterViewInit()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void
ngOnInit
ngOnInit()
Returns : void
openAdminPolicyPopup
openAdminPolicyPopup(closePopup?: boolean)
Parameters :
Name Type Optional
closePopup boolean Yes
Returns : void
Public openModal
openModal()
Returns : void
openModel
openModel()
Returns : void
Public renderGeoDetails
renderGeoDetails()
Returns : void
Public renderUserDetails
renderUserDetails()
Returns : void
showAdminTncForFirstUser
showAdminTncForFirstUser()
Returns : void

Properties

Public activatedRoute
Type : ActivatedRoute
Public adminPolicyDetailsInteractEdata
Type : IInteractEventEdata
Public adminTncUrl
Type : string
Public adminTncVersion
Type : string
Public disableBtn
Default value : true
Public fileUpload
Type : null
Default value : null
Public geoButtonText
Public geoCSV
Type : string
Default value : 'geo-detail'
Public geoData
Type : any
Default value : { 'districts': 0, 'blocks': 0, 'schools': 0 }
Public geoDetail
Type : string
Default value : 'geo-summary-district'
Public geoDownloadInteractEdata
Type : IInteractEventEdata
Public geoJSON
Type : string
Default value : 'geo-summary'
Public geoSummary
Public geoTabledata
Type : []
Default value : []
Public geoTableHeader
Public GeoTableId
Type : string
Default value : 'GeoDetailsTable'
Public geoViewInteractEdata
Type : IInteractEventEdata
Public instance
Type : string
layoutConfiguration
Type : any
Public layoutService
Type : LayoutService
Public manageService
Type : ManageService
Public navigationhelperService
Type : NavigationHelperService
Public openUploadModalInteractEdata
Type : IInteractEventEdata
Public resourceService
Type : ResourceService
Public selectFileInteractEdata
Type : IInteractEventEdata
Public selectUserValidationFileInteractEdata
Type : IInteractEventEdata
Public showAdminTnC
Default value : false
Public showModal
Default value : false
Public showTncPopup
Default value : false
Public showUploadUserModal
Default value : false
Public slug
Type : any
Default value : (<HTMLInputElement>document.getElementById('defaultTenant'))
Public teacherDetailsInteractEdata
Type : IInteractEventEdata
Public teachersButtonText
Public telemetryImpression
Type : IImpressionEventInput
Public telemetryInteractObject
Type : IInteractEventObject
Public telemetryService
Type : TelemetryService
Public tncService
Type : TncService
Public unsubscribe$
Default value : new Subject<void>()
Public uploadButton
Public userDeclaredDetailsEdata
Type : IInteractEventEdata
Public userDeclaredDetailsUrl
Public userDownloadInteractEdata
Type : IInteractEventEdata
Public userProfile
Public userService
Type : UserService
Public userTabledata
Type : []
Default value : []
Public userTableHeader
Public userTableId
Type : string
Default value : 'ValidatedUserDetailsTable'
Public userValidationUploadInteractEdata
Type : IInteractEventEdata
Public userViewInteractEdata
Type : IInteractEventEdata
Public validatedUserSummary
import {Component, AfterViewInit, OnInit, OnDestroy} from '@angular/core';
import { UserService } from '../../../core/services/user/user.service';
import { ManageService } from '../../services/manage/manage.service';
import { ResourceService } from '../../../shared/services/resource/resource.service';
import {ToasterService, NavigationHelperService, LayoutService} from '@sunbird/shared';
import { IImpressionEventInput, IInteractEventEdata, IInteractEventObject, TelemetryService } from '@sunbird/telemetry';
import { Router, ActivatedRoute } from '@angular/router';
import { takeUntil} from 'rxjs/operators';
import * as _ from 'lodash-es';
import $ from 'jquery';
import 'datatables.net';
import dayjs from 'dayjs';
import {Subject} from 'rxjs';
import { TncService } from '@sunbird/core';

@Component({
  selector: 'app-user-org-management',
  templateUrl: 'user-org-management.component.html',
  styleUrls: ['user-org-management.component.scss']
})
export class UserOrgManagementComponent implements OnInit, AfterViewInit, OnDestroy {

  public showModal = false;
  public userService: UserService;
  public userProfile;
  public geoData: any = {
    'districts': 0,
    'blocks': 0,
    'schools': 0
  };
  public geoSummary;
  public validatedUserSummary;
  public geoButtonText;
  public teachersButtonText;
  public manageService: ManageService;
  public slug: any = (<HTMLInputElement>document.getElementById('defaultTenant'));
  public geoJSON = 'geo-summary';
  public geoCSV = 'geo-detail';
  public geoDetail = 'geo-summary-district';
  public GeoTableId = 'GeoDetailsTable';
  public geoTableHeader;
  public geoTabledata = [];
  public userTableId = 'ValidatedUserDetailsTable';
  public userDeclaredDetailsUrl;
  public userTableHeader;
  public userTabledata = [];
  public activatedRoute: ActivatedRoute;
  public resourceService: ResourceService;
  public telemetryImpression: IImpressionEventInput;
  public geoViewInteractEdata: IInteractEventEdata;
  public userDeclaredDetailsEdata: IInteractEventEdata;
  public geoDownloadInteractEdata: IInteractEventEdata;
  public userViewInteractEdata: IInteractEventEdata;
  public userDownloadInteractEdata: IInteractEventEdata;
  public teacherDetailsInteractEdata: IInteractEventEdata;
  public selectFileInteractEdata: IInteractEventEdata;
  layoutConfiguration: any;
  public unsubscribe$ = new Subject<void>();
  public uploadButton;
  public fileUpload = null;
  public selectUserValidationFileInteractEdata: IInteractEventEdata;
  public userValidationUploadInteractEdata: IInteractEventEdata;
  public openUploadModalInteractEdata: IInteractEventEdata;
  public telemetryInteractObject: IInteractEventObject;
  public adminPolicyDetailsInteractEdata: IInteractEventEdata;
  public showUploadUserModal = false;
  public disableBtn = true;
  public instance: string;
  public adminTncUrl: string;
  public adminTncVersion: string;
  public showAdminTnC = false;
  public showTncPopup = false;

  constructor(activatedRoute: ActivatedRoute, public navigationhelperService: NavigationHelperService,
    userService: UserService, manageService: ManageService, private router: Router, private toasterService: ToasterService, resourceService: ResourceService,
              public layoutService: LayoutService, public telemetryService: TelemetryService, public tncService: TncService) {
    this.userService = userService;
    this.manageService = manageService;
    this.activatedRoute = activatedRoute;
    this.resourceService = resourceService;
    if (this.slug) {
      this.slug = (<HTMLInputElement>document.getElementById('defaultTenant')).value;
    } else {
      this.slug = 'sunbird';
    }
  }

  ngOnInit(): void {
    this.initLayout();
    this.instance = _.upperCase(this.resourceService.instance);
    this.uploadButton = this.resourceService.frmelmnts.btn.selectCsvFile;
    this.geoButtonText = this.resourceService.frmelmnts.btn.viewdetails;
    this.teachersButtonText = this.resourceService.frmelmnts.btn.viewdetails;
    this.geoTableHeader = [this.resourceService.frmelmnts.lbl.admindshheader.index,
    this.resourceService.frmelmnts.lbl.admindshheader.districts,
    this.resourceService.frmelmnts.lbl.admindshheader.blocks,
    this.resourceService.frmelmnts.lbl.admindshheader.schools
    ];
    this.userTableHeader = [this.resourceService.frmelmnts.lbl.admindshheader.index,
    this.resourceService.frmelmnts.lbl.admindshheader.districts,
    this.resourceService.frmelmnts.lbl.admindshheader.blocks,
    this.resourceService.frmelmnts.lbl.admindshheader.schools,
    this.resourceService.frmelmnts.lbl.admindshheader.teachers
    ];
    this.userService.userData$.subscribe(async (user) => {
      if (user && user.userProfile) {
        this.userProfile = user.userProfile;
        this.getAdminPolicyTnC();
        this.fetchDeclaredUserDetails();
        this.slug = await _.get(this.userService, 'userProfile.rootOrg.slug');

        this.getGeoJSON();
       this.getGeoDetail();

      }
    });
  }

  initLayout() {
    this.layoutConfiguration = this.layoutService.initlayoutConfig();
    this.layoutService.switchableLayout().pipe(takeUntil(this.unsubscribe$)).subscribe(layoutConfig => {
      if (layoutConfig != null) {
        this.layoutConfiguration = layoutConfig.layout;
      }
    });
  }
  downloadFile(path) {
    window.open(path, '_blank');
  }

  public fileChanged(event) {
    this.fileUpload =  (event.target as HTMLInputElement).files[0];
    this.disableBtn = false;
  }
  openModel() {
    this.showUploadUserModal = !this.showUploadUserModal;
    this.fileUpload = null;
  }

  closeUserValidationModal() {
    this.showUploadUserModal = false;
    const interactData = {
      context: {
        env: this.activatedRoute.snapshot.data.telemetry.env,
        cdata: []
      },
      edata: {
        id: 'close-upload-validation-status-modal',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      }
    };
    this.telemetryService.interact(interactData);
  }

  fetchDeclaredUserDetails() {
    let channelName = _.get(this.userProfile, 'rootOrg.channel');
    if (channelName) {
      channelName = channelName + '.zip';
      this.manageService.getData('declared_user_detail', channelName).subscribe(response => {
          const url = (_.get(response, 'result.signedUrl'));
          if (url) {
            this.userDeclaredDetailsUrl = url;
          }
        }
      );
    }
  }

  ngAfterViewInit() {
    setTimeout(() => {
      this.telemetryImpression = {
        context: {
          env: this.activatedRoute.snapshot.data.telemetry.env
        },
        edata: {
          type: this.activatedRoute.snapshot.data.telemetry.type,
          pageid: this.activatedRoute.snapshot.data.telemetry.pageid,
          uri: this.activatedRoute.snapshot.data.telemetry.uri,
          duration: this.navigationhelperService.getPageLoadTime()
        }
      };
      this.geoViewInteractEdata = {
        id: 'geo-details',
        type: 'view',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.userDeclaredDetailsEdata = {
        id: 'user-declared-details',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.geoDownloadInteractEdata = {
        id: 'geo-details',
        type: 'download',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.userViewInteractEdata = {
        id: 'teacher-details',
        type: 'view',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.userDownloadInteractEdata = {
        id: 'teacher-details',
        type: 'download',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.teacherDetailsInteractEdata = {
        id: 'account-details',
        type: 'download',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.selectFileInteractEdata = {
        id: 'upload-user',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.selectUserValidationFileInteractEdata = {
        id: 'select-user-validation-file',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.userValidationUploadInteractEdata = {
        id: 'upload-user-validation-status',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.openUploadModalInteractEdata = {
        id: 'open-upload-validation-status-modal',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.adminPolicyDetailsInteractEdata = {
        id: 'admin-policy-tnc-popup',
        type: 'click',
        pageid: this.activatedRoute.snapshot.data.telemetry.pageid
      };
      this.telemetryInteractObject = {
        id: this.userService.userid,
        type: 'User',
        ver: '1.0'
      };
    });
  }
  public getGeoJSON() {
    this.manageService.getData(this.geoJSON, `${this.slug}.json`).subscribe(
      data => {
        const result = _.get(data, 'result');
        this.geoData = {
          'districts': result['districts'] ? result['districts'] : 0,
          'blocks': result['blocks'] ? result['blocks'] : 0,
          'schools': result['schools'] ? result['schools'] : 0
        };
      },
      error => {
        console.log(error);
      }
    );
  }



  public getGeoDetail() {
    this.manageService.getData(this.geoDetail, `${this.slug}.json`).subscribe(
      data => {
        const result = _.get(data, 'result');
        this.geoSummary = result;
      },
      error => {
        console.log(error);
      }
    );
  }



  public renderGeoDetails() {
    setTimeout(() => {
      $(`#${this.GeoTableId}`).removeAttr('width').DataTable({
        retrieve: true,
        'columnDefs': [
          {
            'targets': 0,
            'render': (data) => {
              const date = dayjs(data, 'DD-MM-YYYY');
              if (date.isValid()) {
                return `<td><span style="display:none">
                            ${dayjs(data, 'DD-MM-YYYY').format('YYYYMMDD')}</span> ${data}</td>`;
              }
              return data;
            },
          }],
        'data': this.geoTabledata,
        'searching': false,
        'lengthChange': false
      });
    }, 100);
  }

  public geoTableView() {
    this.geoTabledata = [];
    if (this.geoButtonText === this.resourceService.frmelmnts.btn.viewdetails) {
      this.geoButtonText = this.resourceService.frmelmnts.btn.viewless;
      for (let i = 0; i < this.geoSummary.length; i++) {
        this.geoTabledata.push([
          this.geoSummary[i].index, this.geoSummary[i].districtName,
          this.geoSummary[i].blocks, this.geoSummary[i].schools
        ]);
        if (i === (this.geoSummary.length - 1)) {
          this.renderGeoDetails();
        }
      }
    } else {
      this.geoButtonText = this.resourceService.frmelmnts.btn.viewdetails;
    }
  }

  public renderUserDetails() {
    setTimeout(() => {
      $(`#${this.userTableId}`).removeAttr('width').DataTable({
        retrieve: true,
        'columnDefs': [
          {
            'targets': 0,
            'render': (data) => {
              const date = dayjs(data, 'DD-MM-YYYY');
              if (date.isValid()) {
                return `<td><span style="display:none">
                            ${dayjs(data, 'DD-MM-YYYY').format('YYYYMMDD')}</span> ${data}</td>`;
              }
              return data;
            },
          }],
        'data': this.userTabledata,
        'searching': false,
        'lengthChange': false
      });
    }, 100);
  }

  public openModal() {
    this.showModal = false;
    setTimeout(() => {
      this.showModal = true;
    }, 500);
  }

  public downloadCSVFile(slug, status, fileName: any) {
    const slugName = status ? slug + '__' + status : slug;
    const downloadFileName = status ? status + '_' + dayjs().format('DDMMYYYY') + '.csv' : undefined;
    this.manageService.getData(slugName, fileName, downloadFileName)
      .subscribe(
        response => {
          const url = (_.get(response, 'result.signedUrl'));
          if (url) { window.open(url, '_blank'); }
        },
        error => {
          console.log(error);
        }
      );
  }

  public downloadZipFile(slug, fileName: any) {
    this.manageService.getData(slug, fileName)
      .subscribe(
        response => {
          if (response && response.result && response.result.signedUrl) {
            window.open(response.result.signedUrl, '_blank');
          } else {
            this.toasterService.error(this.resourceService.messages.emsg.m0076);
          }
        },
        error => {
          this.toasterService.error(this.resourceService.messages.emsg.m0076);
        }
      );
  }

  getAdminPolicyTnC() {
    this.tncService.getAdminTnc().subscribe(data => {
      const adminTncData = JSON.parse(_.get(data, 'result.response.value'));
      if (_.get(adminTncData, 'latestVersion')) {
        this.adminTncVersion = _.get(adminTncData, 'latestVersion');
        this.showAdminTnC = true;
        this.adminTncUrl = _.get(_.get(adminTncData, _.get(adminTncData, 'latestVersion')), 'url');
        this.showAdminTncForFirstUser();
      }
    });
  }
  showAdminTncForFirstUser() {
    const adminTncObj = _.get(this.userProfile, 'allTncAccepted.orgAdminTnc');
    if (!adminTncObj) {
      this.showTncPopup = true;
    } else {
      this.showTncPopup = false;
    }

  }
  openAdminPolicyPopup(closePopup?: boolean) {
    if (closePopup) {
      this.showTncPopup = false;
    } else {
      this.showTncPopup = true;
    }
  }

  assignUserRole() {
    this.router.navigate(['/manage/userRoleAssign']);
  }

  ngOnDestroy() {
    this.unsubscribe$.next();
    this.unsubscribe$.complete();
  }
}
<app-landing-section [noTitle]="true" [layoutConfiguration]="layoutConfiguration">
</app-landing-section>
<div [ngClass]="layoutConfiguration ? 'sbt-container sbt-user-management relative9 sbt-inside-page-container':''">

  <div class="sb-manage-section" [appTelemetryImpression]="telemetryImpression">
    <div class="sb-multi-rows py-16">
      <div class="d-flex flex-ai-center flex-jc-space-between flex-w-wrap ui container">
        <div class="d-flex flex-dc mr-auto">
        <h4 class="sb-manage-section-title m-0 font-weight-normal">Add new user roles</h4>
        <p class="fsmall">Search and add more user roles</p>
        </div>
        <button class="sb-btn sb-btn-normal sb-btn-primary" tabindex="0" type="button" (click)="assignUserRole()">Add User Role</button>
      </div>   
    </div>
    <div class="sb-multi-rows py-16">
      <div class="d-flex flex-ai-center flex-jc-space-between flex-w-wrap ui container">
        <h4 class="sb-manage-section-title m-0 font-weight-normal mr-auto">
          {{resourceService.frmelmnts?.lbl?.selfDeclaredDetails}}</h4>
        <button [disabled]="!userDeclaredDetailsUrl" appTelemetryInteract
          [telemetryInteractEdata]="userDeclaredDetailsEdata"
          [ngClass]="{'disabled':!userDeclaredDetailsUrl, 'sb-btn-secondary':userDeclaredDetailsUrl}" type="button"
          class="sb-btn sb-btn-secondary sb-btn-normal" (click)="downloadFile(userDeclaredDetailsUrl)">
          {{resourceService.frmelmnts?.btn?.download}}
        </button>
        <!-- <span *ngIf="!userDeclaredDetailsUrl">{{resourceService.frmelmnts?.lbl?.noDataAvailable}}</span> -->
        <!-- <button type="button" (click) = "openModel()" class="sb-btn sb-btn-outline-primary sb-btn-normal" appTelemetryInteract 
      [telemetryInteractObject]="telemetryInteractObject" [telemetryInteractEdata]="openUploadModalInteractEdata">{{resourceService.frmelmnts?.lbl?.uploadValidationStatus}}</button> -->
      </div>
      <div class="d-flex flex-ai-center ui container" *ngIf="!userDeclaredDetailsUrl">
        <img src="./assets/images/icon-info.svg" height="16px">
        <label class="no-data-label font-weight-normal ml-4">{{resourceService.frmelmnts?.lbl?.noDataAvailable}}</label>
      </div>
      <p class="font-weight-normal fsmall ui container">
        {{resourceService?.frmelmnts?.imsg?.admintnc | interpolate:'{instance}': instance }} <a
          class="sb-color-primary cursor-pointer" appTelemetryInteract
          [telemetryInteractObject]="telemetryInteractObject" [telemetryInteractEdata]="adminPolicyDetailsInteractEdata"
          (click)=openAdminPolicyPopup()>{{resourceService?.frmelmnts?.lnk?.adminPolicy}}</a></p>
    </div>

    <div class="sb-pageSection sb-multi-rows py-16">
      <div class="ui container">
       <h4 class="sb-manage-section-title m-0 pb-16">User & Org Management</h4>
        <div class="sb-pageSection-content">
          <div class="d-flex">
            <div class="sb-label-name">Geo Data:</div>
            <div class="ml-auto" *ngIf="geoSummary && geoSummary.length">
              <button class="sb-btn sb-btn-normal"
                [ngClass]="(geoButtonText == 'View Less') ? 'sb-btn-outline-primary' : 'sb-btn-primary'"
                (click)="geoTableView()" appTelemetryInteract
                [telemetryInteractEdata]="geoViewInteractEdata">{{geoButtonText}}</button>
              <button type="button" class="sb-btn sb-btn-secondary sb-btn-normal ml-16"
                (click)="downloadCSVFile(geoCSV, '', slug + '.csv')" appTelemetryInteract
                [telemetryInteractEdata]="geoDownloadInteractEdata"> {{resourceService.frmelmnts.btn.download}}
              </button>
            </div>
          </div>
          <div class="sb-meta-data-container pt-16 sb-meta-data-column d-flex flex-w-wrap">
            <dl class="sb-meta-data">
              <dt>{{ geoData['districts'] }}</dt>
              <dd>Districts</dd>
            </dl>
            <dl class="sb-meta-data">
              <dt>{{ geoData['blocks'] }}</dt>
              <dd>Blocks</dd>
            </dl>
            <dl class="sb-meta-data">
              <dt>{{ geoData['schools'] }}</dt>
              <dd>Schools</dd>
            </dl>
          </div>
        </div>
      </div>
      <div class="sb-manage-table-section" *ngIf="geoButtonText === resourceService.frmelmnts.btn.viewless">
        <div class="ui container">
          <div class="sb-table-responsive">
            <div class="sb-table-container">
              <table [attr.id]="GeoTableId"
                class="sb-table sb-table-hover sb-table-striped sb-table-sortable br-0 width-100">
                <thead>
                  <tr>
                    <th *ngFor="let header of geoTableHeader">{{header}}</th>
                  </tr>
                </thead>
              </table>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<!-- Upload validation status modal -->
<app-modal-wrapper *ngIf="showUploadUserModal" [config]="{disableClose: false, size: 'normal'}"
  (dismiss)="closeUserValidationModal()" #modal>
  <ng-template sbModalContent>
    <div class="sb-modal">
      <div class="transition ui dimmer page modals active visible">
        <div class="ui modal transition active visible normal">
          <div class="sb-modal-header">
            {{resourceService?.frmelmnts?.lbl?.uploadingValidationStatusHeader}}
          </div>
          <div class="sb-modal-content">
            <div class="m-0">
              <span class="m-0 mr-16">{{resourceService?.frmelmnts?.lbl?.uploadcsvfile}}</span>
            </div>
            <div class="sb-btn sb-btn-tertiary sb-btn-normal mt-8 sb-bulk-upload-btn">
              {{uploadButton}}
              <input type="file" appTelemetryInteract [telemetryInteractObject]="telemetryInteractObject"
                [telemetryInteractEdata]="selectUserValidationFileInteractEdata" class="sb-btn-upload upload-btn"
                (change)="fileChanged($event)" />
            </div>
            <div *ngIf="fileUpload">
              <span> {{resourceService?.frmelmnts?.lbl?.upldfile }} :</span>
              <label>{{fileUpload.name}}</label>
            </div>
            <div class="ui info message">
              <div class="header">
                {{resourceService?.frmelmnts?.scttl?.instructions}}
              </div>
              <ol class="ui list">
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0107}} </li>
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0108}} </li>
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0109}} </li>
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0110}} </li>
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0111}} </li>
                <li class="self-users-list">{{resourceService?.frmelmnts?.instn?.t0112}} </li>
              </ol>
            </div>
          </div>
          <div class="sb-modal-actions">
            <button class="sb-btn sb-btn-normal sb-btn-primary" appTelemetryInteract
              [telemetryInteractObject]="telemetryInteractObject"
              [telemetryInteractEdata]="userValidationUploadInteractEdata" [ngClass]="{'sb-btn-disabled': !fileUpload}"
              [disabled]="disableBtn">
              {{resourceService?.frmelmnts?.btn?.uploadusrscsv}}
            </button>
          </div>
        </div>
      </div>
    </div>
  </ng-template>
</app-modal-wrapper>

<app-tnc-popup (close)="openAdminPolicyPopup(true)" [showAcceptTnc]="showTncPopup" [adminTncVersion]="adminTncVersion"
  [tncUrl]="adminTncUrl" #termsAndCondPopUp *ngIf="showTncPopup">
</app-tnc-popup>

user-org-management.component.scss

// component css goes here
@use "@project-sunbird/sb-styles/assets/mixins/mixins" as *;
@use 'components/metadata' as *;

.sb-manage-section{
    .sb-manage-section-title {
        font-size: calculateRem(16.002px);
        line-height: normal;
        font-weight: 600;
    }

    .sb-multi-rows:nth-child(odd){
        background: var(--white);
        border-top: calculateRem(1px) solid var(--rc-dddddd);
        border-bottom: calculateRem(1px) solid var(--rc-dddddd);
    }

    .no-data-label{
     margin-top: calculateRem(6px);
    }

    .sb-pageSection-content{
        a{
            color: var(--primary-color);
        }
    }

    .sb-meta-data-container.sb-meta-data-column .sb-meta-data dt{
        color: var(--primary-color);
        font-size: calculateRem(16px);
    }

    .sb-user-list{
        margin-bottom: calculateRem(4px) !important;
    }
    
    .sb-manage-table-section{
        border-top: calculateRem(1px) solid var(--rc-dddddd);
    }
}

@media screen and (max-width: 1279px) and (min-width: 992px){
    .sb-manage-section {
        .sb-meta-data-container.sb-meta-data-column .sb-meta-data {
            flex-basis: 20%;
        }
    }
}

.sb-modal {
    .sb-modal-content{
      .self-users-list{
        line-height: normal;
        font-size: calculateRem(14px);
      }
      .upload-btn{
        position: absolute;
        opacity: 0;
        left: 0;
        top: 0;
        width: 100%;
        margin: 0;
        height: 100%;
        cursor: pointer;
      }
    }
  }


  .sbt-user-management {
    .sb-multi-rows {
      border-radius: calculateRem(24px);
      padding: 0px calculateRem(16px);
      margin-top: calculateRem(16px);
      background: var(--sbt-compt-bg);
    }
    .sb-manage-section .sb-multi-rows:nth-child(odd) {
        background: var(--sbt-compt-bg);
    }
  }

  // datatable //
  ::ng-deep {
      table.dataTable tbody td,
      table.dataTable tbody th {
        padding: calculateRem(8px) calculateRem(18px);
      }
    }
  
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""