- Sistema de propiedades: modal add-property con autocomplete y selector de ícono - category.page rediseñado: selector de propiedad, fotos (Capacitor Camera), sin fecha/precio - Modal postulate-offer: proveedor propone 2 fechas requeridas + monto con validación de cuota mínima - viewsuppliers: chips de ordenamiento frontend (fecha, precio, certificados) - hire.page: selección de fecha (date_1/date_2) antes de contratar; selected_date en contracts/create y contracts/coupon - Modal contract-discussion: chat de burbujas para contratos activos - contracted.page: botón de chat por contrato - pending.page: botones cancelar y repostular por postulación - Modal repostulate: pre-llena categoría/propiedad, archiva original como perdido y crea nueva con related_postulation_id - current.page: temporizador de expiración basado en time_created (1000 min), oculta expiradas - ichamba.service: nuevos métodos properties, cancelPostulation, contractDiscussion, updated signatures Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
2.5 KiB
HTML
Executable File
54 lines
2.5 KiB
HTML
Executable File
<ion-header>
|
|
<ion-toolbar color="primary">
|
|
<ion-buttons slot="start">
|
|
<ion-menu-button></ion-menu-button>
|
|
</ion-buttons>
|
|
<ion-title>Postulaciones</ion-title>
|
|
</ion-toolbar>
|
|
</ion-header>
|
|
<ion-content class="ion-padding">
|
|
<h2 class="ion-text-capitalize" style="padding-bottom: 0.5em">Por postularse</h2>
|
|
<ion-refresher slot="fixed" (ionRefresh)="refresh($event)">
|
|
<ion-refresher-content></ion-refresher-content>
|
|
</ion-refresher>
|
|
|
|
<ng-container *ngIf="loading">
|
|
<ion-card *ngFor="let _ of [1,2]">
|
|
<ion-item class="no-separator">
|
|
<ion-label>
|
|
<ion-skeleton-text [animated]="true" style="width: 55%; height: 18px; margin-bottom: 8px"></ion-skeleton-text>
|
|
<ion-skeleton-text [animated]="true" style="width: 85%"></ion-skeleton-text>
|
|
<ion-skeleton-text [animated]="true" style="width: 70%"></ion-skeleton-text>
|
|
<ion-skeleton-text [animated]="true" style="width: 75%"></ion-skeleton-text>
|
|
<ion-skeleton-text [animated]="true" style="width: 80%"></ion-skeleton-text>
|
|
<ion-skeleton-text [animated]="true" style="width: 45%"></ion-skeleton-text>
|
|
</ion-label>
|
|
<ion-skeleton-text slot="end" [animated]="true" style="width: 72px; height: 36px; border-radius: 4px"></ion-skeleton-text>
|
|
</ion-item>
|
|
</ion-card>
|
|
</ng-container>
|
|
|
|
<ng-container *ngIf="!loading">
|
|
<ng-container *ngFor="let postulation of postulations; let i = index">
|
|
<ion-card *ngIf="!postulation.already_post && postulation._timer !== 'Expirada'">
|
|
<ion-item class="no-separator">
|
|
<ion-label>
|
|
<h2 class="ion-text-capitalize">{{ postulation.category }}</h2>
|
|
<ion-text color="primary"><p class="ion-text-wrap" (click)="openMaps(postulation.lat, postulation.lng)"><b><u>{{postulation.address}}</u></b></p></ion-text>
|
|
<p class="ion-text-wrap">Referencias: {{postulation.references}}</p>
|
|
<p class="ion-text-wrap ion-text-capitalize">{{postulations_dates[i]}}</p>
|
|
<p class="ion-text-wrap">Detalles: {{postulation.details}}</p>
|
|
<p class="ion-text-wrap">
|
|
<ion-text [color]="postulation._timerCritical ? 'danger' : 'medium'">
|
|
<ion-icon name="time-outline" style="vertical-align: middle"></ion-icon>
|
|
{{ postulation._timer }}
|
|
</ion-text>
|
|
</p>
|
|
</ion-label>
|
|
<ion-button slot="end" style="height: 3em;" color="secondary" (click)="addpostulation(postulation.id)">Postularse</ion-button>
|
|
</ion-item>
|
|
</ion-card>
|
|
</ng-container>
|
|
</ng-container>
|
|
</ion-content>
|