@rolatech/angular-property 20.0.2-beta.2 → 20.0.2-beta.3
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.
- package/fesm2022/{rolatech-angular-property-property-index.component-Birv1xyB.mjs → rolatech-angular-property-property-index.component-Bg9L4p2Z.mjs} +3 -2
- package/fesm2022/rolatech-angular-property-property-index.component-Bg9L4p2Z.mjs.map +1 -0
- package/fesm2022/{rolatech-angular-property-property-manage-viewings-index.component-gVG8HPPp.mjs → rolatech-angular-property-property-manage-viewings-index.component-UsM6RfhW.mjs} +2 -2
- package/fesm2022/{rolatech-angular-property-property-manage-viewings-index.component-gVG8HPPp.mjs.map → rolatech-angular-property-property-manage-viewings-index.component-UsM6RfhW.mjs.map} +1 -1
- package/fesm2022/{rolatech-angular-property-rolatech-angular-property-B4w7sAFv.mjs → rolatech-angular-property-rolatech-angular-property-CQG71H-d.mjs} +349 -97
- package/fesm2022/rolatech-angular-property-rolatech-angular-property-CQG71H-d.mjs.map +1 -0
- package/fesm2022/rolatech-angular-property.mjs +1 -1
- package/index.d.ts +25 -17
- package/package.json +5 -5
- package/fesm2022/rolatech-angular-property-property-index.component-Birv1xyB.mjs.map +0 -1
- package/fesm2022/rolatech-angular-property-rolatech-angular-property-B4w7sAFv.mjs.map +0 -1
|
@@ -10,11 +10,11 @@ import { MatSnackBar } from '@angular/material/snack-bar';
|
|
|
10
10
|
import { MatTableModule } from '@angular/material/table';
|
|
11
11
|
import * as i1$1 from '@angular/router';
|
|
12
12
|
import { RouterLink, RouterModule, Router, ActivatedRoute, RouterLinkActive, RouterOutlet } from '@angular/router';
|
|
13
|
-
import { ThumbnailComponent, ImagePlaceholderComponent, ToolbarComponent, SpinnerComponent, ImagePreviewDialogComponent, BaseComponent, AcceptDialogComponent, RejectDialogComponent, RichLabelComponent, AngularComponentsModule, ConfirmationDialogComponent, TabsComponent, TabComponent, EmptyComponent, ContainerComponent, ListComponent, MediaListComponent, MediaListItemComponent,
|
|
14
|
-
import { PropertyService, FeatureService } from '@rolatech/angular-services';
|
|
13
|
+
import { ThumbnailComponent, ImagePlaceholderComponent, ToolbarComponent, SpinnerComponent, ImagePreviewDialogComponent, BaseComponent, AcceptDialogComponent, RejectDialogComponent, RichLabelComponent, AngularComponentsModule, ConfirmationDialogComponent, TabsComponent, TabComponent, EmptyComponent, ContainerComponent, ListComponent, MediaListComponent, MediaListItemComponent, InputComponent } from '@rolatech/angular-components';
|
|
14
|
+
import { PropertyService, FeatureService, PropertySearchService, DialogService } from '@rolatech/angular-services';
|
|
15
15
|
import * as i1 from '@angular/common';
|
|
16
16
|
import { CommonModule, NgClass, isPlatformBrowser, ViewportScroller, KeyValuePipe, Location } from '@angular/common';
|
|
17
|
-
import { FixedPipe, AngularCommonModule, OptionsFormatPipe, APP_CONFIG, DecimalDirective } from '@rolatech/angular-common';
|
|
17
|
+
import { FixedPipe, AngularCommonModule, OptionsFormatPipe, APP_CONFIG, DecimalDirective, DurationPipe } from '@rolatech/angular-common';
|
|
18
18
|
import * as i2 from '@angular/material/icon';
|
|
19
19
|
import { MatIconModule, MatIcon } from '@angular/material/icon';
|
|
20
20
|
import { MatDialog } from '@angular/material/dialog';
|
|
@@ -61,13 +61,13 @@ var PropertyPriceType;
|
|
|
61
61
|
PropertyPriceType["PARTIAL"] = "\u652F\u4ED8\u5B9A\u91D1";
|
|
62
62
|
PropertyPriceType["VARIED"] = "\u591A\u53D8\u7684";
|
|
63
63
|
})(PropertyPriceType || (PropertyPriceType = {}));
|
|
64
|
-
var
|
|
65
|
-
(function (
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
})(
|
|
64
|
+
var PropertyVideoProvider;
|
|
65
|
+
(function (PropertyVideoProvider) {
|
|
66
|
+
PropertyVideoProvider["YOUTUBE"] = "YOUTUBE";
|
|
67
|
+
PropertyVideoProvider["S3"] = "AWS S3";
|
|
68
|
+
PropertyVideoProvider["LOCAL"] = "Local server";
|
|
69
|
+
PropertyVideoProvider["COS"] = "COS";
|
|
70
|
+
})(PropertyVideoProvider || (PropertyVideoProvider = {}));
|
|
71
71
|
var PropertyStatus;
|
|
72
72
|
(function (PropertyStatus) {
|
|
73
73
|
PropertyStatus[PropertyStatus["DRAFT"] = 'Draft'] = "DRAFT";
|
|
@@ -1240,22 +1240,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
1240
1240
|
args: [{ selector: 'rolatech-property-section', imports: [CommonModule, ThumbnailComponent], encapsulation: ViewEncapsulation.None, template: "@if (section(); as section) {\n <div>\n @if (section.title) {\n <div class=\"py-3 flex items-center gap-3\">\n <span class=\"h-4 w-1 bg-[--rt-brand-color] inline-block\"></span>\n <span class=\"text-lg font-medium py-1\"> {{ section.title }}</span>\n </div>\n }\n @if (section.description) {\n <div>\n {{ section.description }}\n </div>\n }\n @if (section.media) {\n <div class=\"w-80%\">\n @for (item of section.media; track item) {\n <div class=\"py-3\">\n <rolatech-thumbnail\n [src]=\"item.url\"\n size=\"small\"\n mode=\"full\"\n [width]=\"item.width\"\n [height]=\"item.height\"\n ></rolatech-thumbnail>\n </div>\n }\n </div>\n }\n </div>\n}\n" }]
|
|
1241
1241
|
}] });
|
|
1242
1242
|
|
|
1243
|
-
class
|
|
1243
|
+
class PropertyVideoComponent {
|
|
1244
1244
|
sanitizer = inject(DomSanitizer);
|
|
1245
|
-
|
|
1245
|
+
video = input.required(...(ngDevMode ? [{ debugName: "video" }] : []));
|
|
1246
1246
|
videoUrl = computed(() => {
|
|
1247
|
-
const match = this.
|
|
1247
|
+
const match = this.video().url.match(/(?:youtu\.be\/|youtube\.com\/watch\?v=)([\w-]+)/);
|
|
1248
1248
|
if (match && match[1]) {
|
|
1249
1249
|
return this.sanitizer.bypassSecurityTrustResourceUrl(`https://www.youtube.com/embed/${match[1]}`);
|
|
1250
1250
|
}
|
|
1251
1251
|
return null; // Not a valid YouTube URL
|
|
1252
1252
|
}, ...(ngDevMode ? [{ debugName: "videoUrl" }] : []));
|
|
1253
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
1254
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.2.0", type:
|
|
1253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1254
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.2.0", type: PropertyVideoComponent, isStandalone: true, selector: "rolatech-property-video", inputs: { video: { classPropertyName: "video", publicName: "video", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-4\" i18n>Videos</div>\n <iframe [src]=\"videoUrl()\" frameborder=\"0\" allowfullscreen class=\"w-full aspect-video\"></iframe>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
1255
1255
|
}
|
|
1256
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
1256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoComponent, decorators: [{
|
|
1257
1257
|
type: Component,
|
|
1258
|
-
args: [{ selector: 'rolatech-property-video
|
|
1258
|
+
args: [{ selector: 'rolatech-property-video', imports: [CommonModule], template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-4\" i18n>Videos</div>\n <iframe [src]=\"videoUrl()\" frameborder=\"0\" allowfullscreen class=\"w-full aspect-video\"></iframe>\n</div>\n" }]
|
|
1259
1259
|
}] });
|
|
1260
1260
|
|
|
1261
1261
|
class PropertyActionContactComponent {
|
|
@@ -1289,6 +1289,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
1289
1289
|
args: [{ selector: 'rolatech-property-agent-renderer', imports: [AngularCommonModule, MatIconModule], template: "<div class=\"flex flex-col\">\n <div class=\"flex flex-row items-center py-3\">\n <div class=\"flex mr-3 gap-2 items-center\">\n @if (avatar()) {\n <div class=\"cursor-pointer\" [routerLink]=\"['/', '@' + username()]\">\n <img [src]=\"avatar()\" class=\"w-14 h-14 rounded-full\" alt />\n </div>\n } @else {\n <div class=\"w-14 h-14 rounded-full bg-[--rt-brand-color]\"></div>\n }\n <div class=\"flex flex-col\">\n <div class=\"flex items-center text-lg font-bold cursor-pointer\">\n <a [routerLink]=\"['/', '@' + username()]\">\n <span>{{ name() }}</span>\n </a>\n <mat-icon class=\"verified-icon\">verified</mat-icon>\n </div>\n <div class=\"text-lg font-bold text-[--rt-brand-color]\">{{ subtitle() }}</div>\n </div>\n </div>\n </div>\n <div class=\"text-sm opacity-70\">This listing is verified and managed by an Primecase agent</div>\n</div>\n" }]
|
|
1290
1290
|
}] });
|
|
1291
1291
|
|
|
1292
|
+
class PropertyHighlights {
|
|
1293
|
+
highlights = input.required(...(ngDevMode ? [{ debugName: "highlights" }] : []));
|
|
1294
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyHighlights, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1295
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyHighlights, isStandalone: true, selector: "rolatech-property-highlights", inputs: { highlights: { classPropertyName: "highlights", publicName: "highlights", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-3\" i18n>Highlights</div>\n <div class=\"flex flex-col flex-wrap items-center text-sm\">\n @for (item of highlights(); track item) {\n <div class=\"flex items-center mr-2\">\n <mat-icon>check</mat-icon>\n <span>{{ item.text }}</span>\n </div>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
|
|
1296
|
+
}
|
|
1297
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyHighlights, decorators: [{
|
|
1298
|
+
type: Component,
|
|
1299
|
+
args: [{ selector: 'rolatech-property-highlights', imports: [MatIcon], template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-3\" i18n>Highlights</div>\n <div class=\"flex flex-col flex-wrap items-center text-sm\">\n @for (item of highlights(); track item) {\n <div class=\"flex items-center mr-2\">\n <mat-icon>check</mat-icon>\n <span>{{ item.text }}</span>\n </div>\n }\n </div>\n</div>\n" }]
|
|
1300
|
+
}] });
|
|
1301
|
+
|
|
1302
|
+
class PropertyEpc {
|
|
1303
|
+
epc = input.required(...(ngDevMode ? [{ debugName: "epc" }] : []));
|
|
1304
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyEpc, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1305
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.2.0", type: PropertyEpc, isStandalone: true, selector: "rolatech-property-epc", inputs: { epc: { classPropertyName: "epc", publicName: "epc", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-3\" i18n>EPC</div>\n <div class=\"flex flex-col flex-wrap items-center text-sm\">\n <div>{{epc().name}}</div>\n <div>{{epc().score}}</div>\n </div>\n</div>\n", styles: [""] });
|
|
1306
|
+
}
|
|
1307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyEpc, decorators: [{
|
|
1308
|
+
type: Component,
|
|
1309
|
+
args: [{ selector: 'rolatech-property-epc', imports: [], template: "<div class=\"\">\n <div class=\"text-2xl font-bold py-3\" i18n>EPC</div>\n <div class=\"flex flex-col flex-wrap items-center text-sm\">\n <div>{{epc().name}}</div>\n <div>{{epc().score}}</div>\n </div>\n</div>\n" }]
|
|
1310
|
+
}] });
|
|
1311
|
+
|
|
1292
1312
|
class PropertyDetailsComponent extends BaseComponent {
|
|
1293
1313
|
authService = inject(AuthService);
|
|
1294
1314
|
authUserService = inject(AuthUserService);
|
|
@@ -1303,6 +1323,8 @@ class PropertyDetailsComponent extends BaseComponent {
|
|
|
1303
1323
|
selectedOption;
|
|
1304
1324
|
variants = [];
|
|
1305
1325
|
features = [];
|
|
1326
|
+
highlights = [];
|
|
1327
|
+
epc;
|
|
1306
1328
|
selectedVariant;
|
|
1307
1329
|
variantOption = signal(undefined, ...(ngDevMode ? [{ debugName: "variantOption" }] : []));
|
|
1308
1330
|
variantOptionChanged = computed(() => {
|
|
@@ -1320,6 +1342,8 @@ class PropertyDetailsComponent extends BaseComponent {
|
|
|
1320
1342
|
ngOnInit() {
|
|
1321
1343
|
this.getProperty();
|
|
1322
1344
|
this.findFeatures();
|
|
1345
|
+
this.findHighlights();
|
|
1346
|
+
this.getEpc();
|
|
1323
1347
|
}
|
|
1324
1348
|
getProperty() {
|
|
1325
1349
|
this.propertyService.get(this.id).subscribe({
|
|
@@ -1356,13 +1380,26 @@ class PropertyDetailsComponent extends BaseComponent {
|
|
|
1356
1380
|
});
|
|
1357
1381
|
}
|
|
1358
1382
|
findFeatures() {
|
|
1359
|
-
console.log(this.id);
|
|
1360
1383
|
this.propertyService.findFeatures(this.id).subscribe({
|
|
1361
1384
|
next: (res) => {
|
|
1362
1385
|
this.features = res.data;
|
|
1363
1386
|
}
|
|
1364
1387
|
});
|
|
1365
1388
|
}
|
|
1389
|
+
findHighlights() {
|
|
1390
|
+
this.propertyService.getHighlights(this.id).subscribe({
|
|
1391
|
+
next: (res) => {
|
|
1392
|
+
this.highlights = res.data;
|
|
1393
|
+
}
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
getEpc() {
|
|
1397
|
+
this.propertyService.getEpc(this.id).subscribe({
|
|
1398
|
+
next: (res) => {
|
|
1399
|
+
this.epc = res.data;
|
|
1400
|
+
}
|
|
1401
|
+
});
|
|
1402
|
+
}
|
|
1366
1403
|
wishListCheck() {
|
|
1367
1404
|
this.propertyService.wishListCheck(this.id).subscribe({
|
|
1368
1405
|
next: (res) => {
|
|
@@ -1441,7 +1478,7 @@ class PropertyDetailsComponent extends BaseComponent {
|
|
|
1441
1478
|
// const updatedCriteria = matchingVariant ? updateCriteriaFromVariant(matchingVariant) : [];
|
|
1442
1479
|
}
|
|
1443
1480
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1444
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyDetailsComponent, isStandalone: true, selector: "rolatech-property-details", usesInheritance: true, ngImport: i0, template: "@if (property) {\n <rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <!-- <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer> -->\n <mat-divider></mat-divider>\n <rolatech-property-features [features]=\"features\"></rolatech-property-features>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.
|
|
1481
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyDetailsComponent, isStandalone: true, selector: "rolatech-property-details", usesInheritance: true, ngImport: i0, template: "@if (property) {\n <rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <!-- <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer> -->\n <mat-divider></mat-divider>\n <rolatech-property-features [features]=\"features\"></rolatech-property-features>\n <rolatech-property-highlights [highlights]=\"highlights\"></rolatech-property-highlights>\n <rolatech-property-epc [epc]=\"epc\"></rolatech-property-epc>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.videos) {\n @for (item of property.videos; track $index) {\n <rolatech-property-video [video]=\"item\"></rolatech-property-video>\n }\n }\n <div class=\"flex flex-col\">\n <div class=\"text-2xl font-bold pt-3\" i18n>Sections</div>\n @for (section of property.sections; track $index) {\n <rolatech-property-section [section]=\"section\"></rolatech-property-section>\n }\n <rolatech-comments [itemId]=\"property.id\"></rolatech-comments>\n </div>\n </div>\n <div class=\"w-full md:w-1/3\">\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-pricing (wish)=\"onWish($event)\" [property]=\"property\"></rolatech-property-pricing>\n <rolatech-property-actions\n [property]=\"property\"\n (offer)=\"onOffer($event)\"\n (deposit)=\"onOffer($event)\"\n (requestViewing)=\"onRequestViewing($event)\"\n >\n @if (user) {\n <rolatech-property-action-contact [email]=\"user.email\" [phone]=\"user.phone\"></rolatech-property-action-contact>\n }\n </rolatech-property-actions>\n </div>\n </div>\n </div>\n </rolatech-container>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i2$1.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: PropertyInfoComponent, selector: "rolatech-property-info", inputs: ["property", "inWishList"], outputs: ["wish"] }, { kind: "component", type: PropertyMediaComponent, selector: "rolatech-property-media", inputs: ["media", "min"] }, { kind: "component", type: PropertyPricingComponent, selector: "rolatech-property-pricing", inputs: ["property", "price"] }, { kind: "component", type: PropertySectionComponent, selector: "rolatech-property-section", inputs: ["section", "user", "username"] }, { kind: "component", type: PropertyActionsComponent, selector: "rolatech-property-actions", inputs: ["property"], outputs: ["requestViewing", "offer", "deposit"] }, { kind: "component", type: CommentsComponent, selector: "rolatech-comments", inputs: ["itemId"] }, { kind: "component", type: PropertyAgentRenderer, selector: "rolatech-property-agent-renderer", inputs: ["name", "avatar", "username", "subtitle"] }, { kind: "component", type: PropertyLocationComponent, selector: "rolatech-property-location", inputs: ["location"] }, { kind: "component", type: PropertyFeaturesComponent, selector: "rolatech-property-features", inputs: ["features"] }, { kind: "component", type: PropertyVideoComponent, selector: "rolatech-property-video", inputs: ["video"] }, { kind: "component", type: PropertyActionContactComponent, selector: "rolatech-property-action-contact", inputs: ["email", "phone"], outputs: ["callAgent", "emailAgent"] }, { kind: "component", type: PropertyHighlights, selector: "rolatech-property-highlights", inputs: ["highlights"] }, { kind: "component", type: PropertyEpc, selector: "rolatech-property-epc", inputs: ["epc"] }] });
|
|
1445
1482
|
}
|
|
1446
1483
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyDetailsComponent, decorators: [{
|
|
1447
1484
|
type: Component,
|
|
@@ -1458,9 +1495,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
1458
1495
|
PropertyAgentRenderer,
|
|
1459
1496
|
PropertyLocationComponent,
|
|
1460
1497
|
PropertyFeaturesComponent,
|
|
1461
|
-
|
|
1498
|
+
PropertyVideoComponent,
|
|
1462
1499
|
PropertyActionContactComponent,
|
|
1463
|
-
|
|
1500
|
+
PropertyHighlights,
|
|
1501
|
+
PropertyEpc
|
|
1502
|
+
], template: "@if (property) {\n <rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <!-- <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer> -->\n <mat-divider></mat-divider>\n <rolatech-property-features [features]=\"features\"></rolatech-property-features>\n <rolatech-property-highlights [highlights]=\"highlights\"></rolatech-property-highlights>\n <rolatech-property-epc [epc]=\"epc\"></rolatech-property-epc>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.videos) {\n @for (item of property.videos; track $index) {\n <rolatech-property-video [video]=\"item\"></rolatech-property-video>\n }\n }\n <div class=\"flex flex-col\">\n <div class=\"text-2xl font-bold pt-3\" i18n>Sections</div>\n @for (section of property.sections; track $index) {\n <rolatech-property-section [section]=\"section\"></rolatech-property-section>\n }\n <rolatech-comments [itemId]=\"property.id\"></rolatech-comments>\n </div>\n </div>\n <div class=\"w-full md:w-1/3\">\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-pricing (wish)=\"onWish($event)\" [property]=\"property\"></rolatech-property-pricing>\n <rolatech-property-actions\n [property]=\"property\"\n (offer)=\"onOffer($event)\"\n (deposit)=\"onOffer($event)\"\n (requestViewing)=\"onRequestViewing($event)\"\n >\n @if (user) {\n <rolatech-property-action-contact [email]=\"user.email\" [phone]=\"user.phone\"></rolatech-property-action-contact>\n }\n </rolatech-property-actions>\n </div>\n </div>\n </div>\n </rolatech-container>\n}\n" }]
|
|
1464
1503
|
}], ctorParameters: () => [] });
|
|
1465
1504
|
|
|
1466
1505
|
const MY_FORMATS$5 = {
|
|
@@ -2270,7 +2309,7 @@ const propertyRoutes = [
|
|
|
2270
2309
|
children: [
|
|
2271
2310
|
{
|
|
2272
2311
|
path: '',
|
|
2273
|
-
loadComponent: () => import('./rolatech-angular-property-property-index.component-
|
|
2312
|
+
loadComponent: () => import('./rolatech-angular-property-property-index.component-Bg9L4p2Z.mjs').then((x) => x.PropertyIndexComponent),
|
|
2274
2313
|
},
|
|
2275
2314
|
],
|
|
2276
2315
|
},
|
|
@@ -2339,6 +2378,7 @@ class PropertyManageIndexComponent {
|
|
|
2339
2378
|
dialog = inject(MatDialog);
|
|
2340
2379
|
snackBar = inject(MatSnackBar);
|
|
2341
2380
|
propertyService = inject(PropertyService);
|
|
2381
|
+
propertySearchService = inject(PropertySearchService);
|
|
2342
2382
|
isLoading = false;
|
|
2343
2383
|
isSearch = false;
|
|
2344
2384
|
properties = [];
|
|
@@ -2492,11 +2532,11 @@ class PropertyManageLayoutComponent extends BaseComponent {
|
|
|
2492
2532
|
});
|
|
2493
2533
|
}
|
|
2494
2534
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageLayoutComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2495
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyManageLayoutComponent, isStandalone: true, selector: "rolatech-property-manage-layout", usesInheritance: true, ngImport: i0, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-1\" i18n>Property</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Basic info</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Media</a>\n <a routerLink=\"./
|
|
2535
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyManageLayoutComponent, isStandalone: true, selector: "rolatech-property-manage-layout", usesInheritance: true, ngImport: i0, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-1\" i18n>Property</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Basic info</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Media</a>\n <a routerLink=\"./videos\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Videos</a>\n <a routerLink=\"./sections\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Details</a>\n <a routerLink=\"./location\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Location</a>\n <a routerLink=\"./features\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Features</a>\n <a routerLink=\"./highlights\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Highlights</a>\n <a routerLink=\"./epc\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>EPC</a>\n <a routerLink=\"./translation\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Translation</a>\n <!-- <a routerLink=\"./amenities\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Amenities</a> -->\n <!-- <a routerLink=\"./tags\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Tags</a> -->\n <!-- <a routerLink=\"./options\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Options</a> -->\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\" i18n>Settings</div>\n <!-- <a routerLink=\"./variants\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Variants</a> -->\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Schedule</a>\n <a routerLink=\"./pricing\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Pricing</a>\n </div>\n <!-- <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\" i18n>Others</div>\n </div> -->\n @if (property) {\n @if (property.status.toString() === 'DRAFT') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button (click)=\"submit()\" i18n>Submit for review</button>\n </div>\n }\n @if (property.status.toString() === 'PENDING') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button disabled i18n>Pending</button>\n </div>\n }\n @if (property.status.toString() === 'APPROVED') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button (click)=\"publish()\" i18n>Publish</button>\n </div>\n }\n }\n </div>\n <div class=\"w-full\">\n <router-outlet></router-outlet>\n </div>\n</div>\n", styles: [".manage-active{background-color:var(--rt-10-percent-layer, rgba(0, 0, 0, .05));box-shadow:4px 0 var(--rt-base-background-inverse, #000) inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px 0 0 var(--rt-base-background-inverse, #000)}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$4.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
2496
2536
|
}
|
|
2497
2537
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageLayoutComponent, decorators: [{
|
|
2498
2538
|
type: Component,
|
|
2499
|
-
args: [{ selector: 'rolatech-property-manage-layout', imports: [RouterLink, RouterLinkActive, MatButtonModule, RouterOutlet], encapsulation: ViewEncapsulation.None, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-1\" i18n>Property</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Basic info</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Media</a>\n <a routerLink=\"./
|
|
2539
|
+
args: [{ selector: 'rolatech-property-manage-layout', imports: [RouterLink, RouterLinkActive, MatButtonModule, RouterOutlet], encapsulation: ViewEncapsulation.None, template: "<div class=\"flex flex-col md:flex-row m-auto\">\n <div\n class=\"min-w-[256px] px-3 md:px-0 flex flex-row md:flex-col md:h-full items-center md:items-start h-16 overflow-x-scroll overflow-y-hidden scrollbar-hide whitespace-pre\"\n >\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-1\" i18n>Property</div>\n <a routerLink=\"./info\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Basic info</a>\n <a routerLink=\"./media\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Media</a>\n <a routerLink=\"./videos\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Videos</a>\n <a routerLink=\"./sections\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Details</a>\n <a routerLink=\"./location\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Location</a>\n <a routerLink=\"./features\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Features</a>\n <a routerLink=\"./highlights\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Highlights</a>\n <a routerLink=\"./epc\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>EPC</a>\n <a routerLink=\"./translation\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Translation</a>\n <!-- <a routerLink=\"./amenities\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Amenities</a> -->\n <!-- <a routerLink=\"./tags\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Tags</a> -->\n <!-- <a routerLink=\"./options\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Options</a> -->\n </div>\n <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\" i18n>Settings</div>\n <!-- <a routerLink=\"./variants\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Variants</a> -->\n <a routerLink=\"./schedule\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Schedule</a>\n <a routerLink=\"./pricing\" routerLinkActive=\"manage-active\" class=\"p-2\" i18n>Pricing</a>\n </div>\n <!-- <div class=\"flex flex-row md:flex-col md:w-full\">\n <div class=\"hidden md:flex text-xl font-bold h-14 items-center px-2\" i18n>Others</div>\n </div> -->\n @if (property) {\n @if (property.status.toString() === 'DRAFT') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button (click)=\"submit()\" i18n>Submit for review</button>\n </div>\n }\n @if (property.status.toString() === 'PENDING') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button disabled i18n>Pending</button>\n </div>\n }\n @if (property.status.toString() === 'APPROVED') {\n <div class=\"md:mt-6 md:ml-2 flex items-center\">\n <button mat-flat-button (click)=\"publish()\" i18n>Publish</button>\n </div>\n }\n }\n </div>\n <div class=\"w-full\">\n <router-outlet></router-outlet>\n </div>\n</div>\n", styles: [".manage-active{background-color:var(--rt-10-percent-layer, rgba(0, 0, 0, .05));box-shadow:4px 0 var(--rt-base-background-inverse, #000) inset;font-weight:600}@media (max-width: 768px){.manage-active{box-shadow:inset 0 -4px 0 0 var(--rt-base-background-inverse, #000)}}.scrollbar-hide::-webkit-scrollbar{display:none}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}\n"] }]
|
|
2500
2540
|
}] });
|
|
2501
2541
|
|
|
2502
2542
|
class PropertyManageContentComponent {
|
|
@@ -3069,7 +3109,6 @@ class PropertyManageFeaturesComponent extends BaseComponent {
|
|
|
3069
3109
|
features: this.featureService.find({}),
|
|
3070
3110
|
options: this.propertyService.findFeatures(this.id),
|
|
3071
3111
|
}).subscribe(({ features, options }) => {
|
|
3072
|
-
console.log(options);
|
|
3073
3112
|
this.features = features.data;
|
|
3074
3113
|
if (options.data) {
|
|
3075
3114
|
this.selected = this.convertToBinding(options.data);
|
|
@@ -3334,9 +3373,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
3334
3373
|
args: ['autocompleteInput', { static: false }]
|
|
3335
3374
|
}] } });
|
|
3336
3375
|
|
|
3337
|
-
class
|
|
3338
|
-
|
|
3339
|
-
videoId = '';
|
|
3376
|
+
class PropertyVideoYoutubeAddComponent {
|
|
3377
|
+
url = '';
|
|
3340
3378
|
output = output();
|
|
3341
3379
|
getYouTubeVideoId(url) {
|
|
3342
3380
|
const regex = /(?:youtube\.com\/(?:watch\?v=|embed\/|v\/|shorts\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/;
|
|
@@ -3344,40 +3382,141 @@ class PropertyVideoTourAddComponent {
|
|
|
3344
3382
|
return match ? match[1] : null;
|
|
3345
3383
|
}
|
|
3346
3384
|
ngDoCheck() {
|
|
3347
|
-
this.
|
|
3348
|
-
this.output.emit(this.videoId);
|
|
3385
|
+
this.output.emit(this.url);
|
|
3349
3386
|
}
|
|
3350
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
3351
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.0", type:
|
|
3387
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoYoutubeAddComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3388
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.0", type: PropertyVideoYoutubeAddComponent, isStandalone: true, selector: "rolatech-property-video-youtube-add", outputs: { output: "output" }, ngImport: i0, template: "<mat-form-field appearance=\"fill\">\n <mat-label>Youtube Video URL</mat-label>\n <input matInput placeholder=\"Youtube Video URL\" type=\"text\" [(ngModel)]=\"url\" i18n />\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
3352
3389
|
}
|
|
3353
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
3390
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoYoutubeAddComponent, decorators: [{
|
|
3354
3391
|
type: Component,
|
|
3355
|
-
args: [{ selector: 'rolatech-property-video-
|
|
3392
|
+
args: [{ selector: 'rolatech-property-video-youtube-add', imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule], template: "<mat-form-field appearance=\"fill\">\n <mat-label>Youtube Video URL</mat-label>\n <input matInput placeholder=\"Youtube Video URL\" type=\"text\" [(ngModel)]=\"url\" i18n />\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"] }]
|
|
3356
3393
|
}] });
|
|
3357
3394
|
|
|
3358
|
-
class
|
|
3359
|
-
propertyService = inject(PropertyService);
|
|
3395
|
+
class SafeUrlPipe {
|
|
3360
3396
|
sanitizer = inject(DomSanitizer);
|
|
3361
|
-
|
|
3397
|
+
transform(url) {
|
|
3398
|
+
if (!url) {
|
|
3399
|
+
return null;
|
|
3400
|
+
}
|
|
3401
|
+
// If you want to allow in [href], [src], [poster], [srcdoc], etc.
|
|
3402
|
+
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
|
|
3403
|
+
}
|
|
3404
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: SafeUrlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
3405
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.2.0", ngImport: i0, type: SafeUrlPipe, isStandalone: true, name: "safeUrl" });
|
|
3406
|
+
}
|
|
3407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: SafeUrlPipe, decorators: [{
|
|
3408
|
+
type: Pipe,
|
|
3409
|
+
args: [{
|
|
3410
|
+
name: 'safeUrl',
|
|
3411
|
+
standalone: true
|
|
3412
|
+
}]
|
|
3413
|
+
}] });
|
|
3414
|
+
|
|
3415
|
+
class PropertyVideoItem {
|
|
3416
|
+
platformId = inject(PLATFORM_ID);
|
|
3417
|
+
el = inject(ElementRef);
|
|
3418
|
+
dialogService = inject(DialogService);
|
|
3419
|
+
myVideo = viewChild('video', ...(ngDevMode ? [{ debugName: "myVideo" }] : []));
|
|
3420
|
+
progress = input(0, ...(ngDevMode ? [{ debugName: "progress" }] : []));
|
|
3421
|
+
video = input.required(...(ngDevMode ? [{ debugName: "video" }] : []));
|
|
3422
|
+
actions = input(true, ...(ngDevMode ? [{ debugName: "actions" }] : []));
|
|
3423
|
+
hasUnsaved = input(false, ...(ngDevMode ? [{ debugName: "hasUnsaved" }] : []));
|
|
3424
|
+
editId = model(...(ngDevMode ? [undefined, { debugName: "editId" }] : []));
|
|
3425
|
+
save = output();
|
|
3426
|
+
cancel = output();
|
|
3427
|
+
delete = output();
|
|
3428
|
+
edit = output();
|
|
3429
|
+
upload = output();
|
|
3430
|
+
editTitle = false;
|
|
3431
|
+
editing = false;
|
|
3432
|
+
onSave(video) {
|
|
3433
|
+
this.editTitle = false;
|
|
3434
|
+
this.editId.set(null);
|
|
3435
|
+
this.save.emit(video);
|
|
3436
|
+
}
|
|
3437
|
+
onCancel(video) {
|
|
3438
|
+
this.editTitle = false;
|
|
3439
|
+
this.editId.set(null);
|
|
3440
|
+
this.cancel.emit(video);
|
|
3441
|
+
}
|
|
3442
|
+
onDelete(video) {
|
|
3443
|
+
this.delete.emit(video);
|
|
3444
|
+
}
|
|
3445
|
+
onEdit(video) {
|
|
3446
|
+
this.editId.set(video.id);
|
|
3447
|
+
this.editTitle = true;
|
|
3448
|
+
this.edit.emit(video);
|
|
3449
|
+
}
|
|
3450
|
+
onMediaEdit(video) {
|
|
3451
|
+
this.editId.set(video.id);
|
|
3452
|
+
this.editing = true;
|
|
3453
|
+
}
|
|
3454
|
+
onUpload(id, data) {
|
|
3455
|
+
this.video().uploading = true;
|
|
3456
|
+
this.upload.emit({ id, data });
|
|
3457
|
+
}
|
|
3458
|
+
onLoadedMetadata(event) {
|
|
3459
|
+
if (this.video().duration) {
|
|
3460
|
+
return;
|
|
3461
|
+
}
|
|
3462
|
+
const videoElement = event.target;
|
|
3463
|
+
this.video().duration = videoElement.duration;
|
|
3464
|
+
}
|
|
3465
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3466
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyVideoItem, isStandalone: true, selector: "rolatech-property-video-item", inputs: { progress: { classPropertyName: "progress", publicName: "progress", isSignal: true, isRequired: false, transformFunction: null }, video: { classPropertyName: "video", publicName: "video", isSignal: true, isRequired: true, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, hasUnsaved: { classPropertyName: "hasUnsaved", publicName: "hasUnsaved", isSignal: true, isRequired: false, transformFunction: null }, editId: { classPropertyName: "editId", publicName: "editId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editId: "editIdChange", save: "save", cancel: "cancel", delete: "delete", edit: "edit", upload: "upload" }, viewQueries: [{ propertyName: "myVideo", first: true, predicate: ["video"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col grow p-2\">\n @if (!editTitle) {\n <div class=\"w-full flex gap-3 p-3 items-center\">\n <span>{{ video().title }}</span>\n <button mat-icon-button (click)=\"onEdit(video()); $event.stopPropagation()\" class=\"max-w-8 max-h-8 !p-1\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button (click)=\"onDelete(video()); $event.stopPropagation()\" class=\"max-w-8 max-h-8 !p-1\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n } @else {\n <div class=\"flex flex-col justify-between items-center\">\n <rolatech-input [(title)]=\"video().title\" placeholder=\"Title\"></rolatech-input>\n <div class=\"w-full flex flex-row justify-end p-3 gap-3\">\n <button mat-button class=\"max-h-8\" (click)=\"onCancel(video())\" i18n>Cancel</button>\n <button mat-flat-button class=\"max-h-8\" (click)=\"onSave(video())\" i18n>Save</button>\n </div>\n </div>\n }\n\n <div>\n @if (video().url) {\n <div class=\"flex flex-col p-2 gap-3\">\n <div class=\"bg-black h-fit\">\n <video\n controls\n #videoContainer\n [src]=\"video().url\"\n class=\"w-full aspect-video\"\n (loadedmetadata)=\"onLoadedMetadata($event)\"\n [poster]=\"video().thumbnail\"\n >\n <!-- <source [src]=\"video().url\" type=\"video/mp4\" /> -->\n </video>\n </div>\n <div class=\"flex flex-col justify-between w-full\">\n <div class=\"flex justify-between items-center w-full\">\n @if (video().uploading) {\n <div>\n <span> {{ video().progress }}%</span>\n </div>\n }\n </div>\n <div class=\"flex justify-between items-center\">\n <div>\n <span>{{ video().duration | duration }}</span>\n </div>\n </div>\n </div>\n </div>\n @if (video().uploading) {\n <div class=\"p-2\">\n <mat-progress-bar mode=\"determinate\" [value]=\"video().progress\"> </mat-progress-bar>\n </div>\n } } @else {\n <div class=\"px-3\">\n <input\n class=\"ud-sr-only\"\n type=\"file\"\n accept=\".avi,.mpg,.mpeg,.flv,.mov,.m2v,.m4v,.mp4,.rm,.ram,.vob,.ogv,.webm,.wmv\"\n (change)=\"onUpload(video().id, $event)\"\n #fileInput\n />\n <div class=\"flex justify-between items-center\">\n <div i18n>No videos</div>\n <button mat-flat-button class=\"max-h-8\" (click)=\"fileInput.click()\" i18n>Upload</button>\n </div>\n </div>\n }\n </div>\n @if (!hasUnsaved) {\n <ng-content></ng-content>\n }\n</div>\n", styles: [".ud-sr-only{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$4.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1$4.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: InputComponent, selector: "rolatech-input", inputs: ["title", "placeholder"], outputs: ["titleChange"] }, { kind: "pipe", type: DurationPipe, name: "duration" }] });
|
|
3467
|
+
}
|
|
3468
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyVideoItem, decorators: [{
|
|
3469
|
+
type: Component,
|
|
3470
|
+
args: [{ selector: 'rolatech-property-video-item', imports: [
|
|
3471
|
+
MatIconModule,
|
|
3472
|
+
AngularCommonModule,
|
|
3473
|
+
FormsModule,
|
|
3474
|
+
MatButtonModule,
|
|
3475
|
+
MatDividerModule,
|
|
3476
|
+
AngularComponentsModule,
|
|
3477
|
+
DurationPipe,
|
|
3478
|
+
InputComponent
|
|
3479
|
+
], template: "<div class=\"flex flex-col grow p-2\">\n @if (!editTitle) {\n <div class=\"w-full flex gap-3 p-3 items-center\">\n <span>{{ video().title }}</span>\n <button mat-icon-button (click)=\"onEdit(video()); $event.stopPropagation()\" class=\"max-w-8 max-h-8 !p-1\">\n <mat-icon>edit</mat-icon>\n </button>\n <button mat-icon-button (click)=\"onDelete(video()); $event.stopPropagation()\" class=\"max-w-8 max-h-8 !p-1\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n } @else {\n <div class=\"flex flex-col justify-between items-center\">\n <rolatech-input [(title)]=\"video().title\" placeholder=\"Title\"></rolatech-input>\n <div class=\"w-full flex flex-row justify-end p-3 gap-3\">\n <button mat-button class=\"max-h-8\" (click)=\"onCancel(video())\" i18n>Cancel</button>\n <button mat-flat-button class=\"max-h-8\" (click)=\"onSave(video())\" i18n>Save</button>\n </div>\n </div>\n }\n\n <div>\n @if (video().url) {\n <div class=\"flex flex-col p-2 gap-3\">\n <div class=\"bg-black h-fit\">\n <video\n controls\n #videoContainer\n [src]=\"video().url\"\n class=\"w-full aspect-video\"\n (loadedmetadata)=\"onLoadedMetadata($event)\"\n [poster]=\"video().thumbnail\"\n >\n <!-- <source [src]=\"video().url\" type=\"video/mp4\" /> -->\n </video>\n </div>\n <div class=\"flex flex-col justify-between w-full\">\n <div class=\"flex justify-between items-center w-full\">\n @if (video().uploading) {\n <div>\n <span> {{ video().progress }}%</span>\n </div>\n }\n </div>\n <div class=\"flex justify-between items-center\">\n <div>\n <span>{{ video().duration | duration }}</span>\n </div>\n </div>\n </div>\n </div>\n @if (video().uploading) {\n <div class=\"p-2\">\n <mat-progress-bar mode=\"determinate\" [value]=\"video().progress\"> </mat-progress-bar>\n </div>\n } } @else {\n <div class=\"px-3\">\n <input\n class=\"ud-sr-only\"\n type=\"file\"\n accept=\".avi,.mpg,.mpeg,.flv,.mov,.m2v,.m4v,.mp4,.rm,.ram,.vob,.ogv,.webm,.wmv\"\n (change)=\"onUpload(video().id, $event)\"\n #fileInput\n />\n <div class=\"flex justify-between items-center\">\n <div i18n>No videos</div>\n <button mat-flat-button class=\"max-h-8\" (click)=\"fileInput.click()\" i18n>Upload</button>\n </div>\n </div>\n }\n </div>\n @if (!hasUnsaved) {\n <ng-content></ng-content>\n }\n</div>\n", styles: [".ud-sr-only{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}\n"] }]
|
|
3480
|
+
}] });
|
|
3481
|
+
|
|
3482
|
+
class PropertyManageVideoComponent extends BaseComponent {
|
|
3483
|
+
propertyService = inject(PropertyService);
|
|
3484
|
+
tabIndex = signal(0, ...(ngDevMode ? [{ debugName: "tabIndex" }] : []));
|
|
3485
|
+
videos = [];
|
|
3362
3486
|
data;
|
|
3363
3487
|
iframeVisible = false;
|
|
3364
3488
|
iframeLoaded = false;
|
|
3365
|
-
safeURL = this.sanitizer.bypassSecurityTrustResourceUrl('');
|
|
3366
3489
|
thumbnailUrl;
|
|
3367
|
-
|
|
3490
|
+
provider = PropertyVideoProvider;
|
|
3368
3491
|
chunkSize = 5 * 1024 * 1024; // 切片大小
|
|
3492
|
+
selectProvider = '';
|
|
3493
|
+
videoEditId = '';
|
|
3494
|
+
get youtubeVideos() {
|
|
3495
|
+
return this.videos.filter(v => v.provider === PropertyVideoProvider.YOUTUBE);
|
|
3496
|
+
}
|
|
3497
|
+
get cosVideos() {
|
|
3498
|
+
return this.videos.filter(v => v.provider === PropertyVideoProvider.COS);
|
|
3499
|
+
}
|
|
3500
|
+
constructor() {
|
|
3501
|
+
super();
|
|
3502
|
+
effect(() => {
|
|
3503
|
+
const index = this.tabIndex();
|
|
3504
|
+
if (index === 0) {
|
|
3505
|
+
this.selectProvider = 'YOUTUBE';
|
|
3506
|
+
}
|
|
3507
|
+
if (index === 1) {
|
|
3508
|
+
this.selectProvider = 'COS';
|
|
3509
|
+
}
|
|
3510
|
+
});
|
|
3511
|
+
}
|
|
3369
3512
|
ngOnInit() {
|
|
3370
3513
|
this.id = this.route.parent?.snapshot.paramMap.get('id');
|
|
3371
|
-
this.
|
|
3514
|
+
this.getVideos();
|
|
3372
3515
|
}
|
|
3373
|
-
|
|
3374
|
-
this.propertyService.
|
|
3516
|
+
getVideos() {
|
|
3517
|
+
this.propertyService.getVideos(this.id).subscribe({
|
|
3375
3518
|
next: (res) => {
|
|
3376
|
-
this.
|
|
3377
|
-
// this.safeURL = this.sanitizer.bypassSecurityTrustResourceUrl(
|
|
3378
|
-
// `https://www.youtube.com/embed/${this.propertyVideoTour.videoId}`,
|
|
3379
|
-
// );
|
|
3380
|
-
// this.thumbnailUrl = `https://i.ytimg.com/vi/${this.propertyVideoTour.videoId}/hqdefault.jpg`;
|
|
3519
|
+
this.videos = Array.isArray(res.data) ? res.data : [];
|
|
3381
3520
|
},
|
|
3382
3521
|
});
|
|
3383
3522
|
}
|
|
@@ -3387,68 +3526,129 @@ class PropertyManageVideoTourComponent extends BaseComponent {
|
|
|
3387
3526
|
onIframeLoad() {
|
|
3388
3527
|
this.iframeLoaded = true;
|
|
3389
3528
|
}
|
|
3390
|
-
|
|
3391
|
-
const
|
|
3392
|
-
title: 'Add
|
|
3529
|
+
addYoutubeUrl() {
|
|
3530
|
+
const options = {
|
|
3531
|
+
title: 'Add Youtube url',
|
|
3393
3532
|
cancelText: 'Cancel',
|
|
3394
3533
|
confirmText: 'Confirm',
|
|
3395
3534
|
data: {
|
|
3396
|
-
|
|
3535
|
+
url: '',
|
|
3397
3536
|
},
|
|
3398
|
-
component:
|
|
3537
|
+
component: PropertyVideoYoutubeAddComponent,
|
|
3399
3538
|
};
|
|
3400
|
-
this.dialogService.open(
|
|
3539
|
+
this.dialogService.open(options);
|
|
3401
3540
|
this.dialogService.confirmed().subscribe({
|
|
3402
3541
|
next: (res) => {
|
|
3403
3542
|
if (res) {
|
|
3404
3543
|
const data = {
|
|
3405
|
-
|
|
3544
|
+
url: res,
|
|
3545
|
+
title: 'Youtube',
|
|
3546
|
+
provider: PropertyVideoProvider.YOUTUBE
|
|
3406
3547
|
};
|
|
3407
|
-
this.propertyService.
|
|
3548
|
+
this.propertyService.addVideo(this.id, data).subscribe({
|
|
3408
3549
|
next: (res) => {
|
|
3409
|
-
this.
|
|
3410
|
-
this.snackBarService.open('Video
|
|
3550
|
+
this.videos.push(res.data);
|
|
3551
|
+
this.snackBarService.open('Video added');
|
|
3411
3552
|
},
|
|
3412
3553
|
});
|
|
3413
3554
|
}
|
|
3414
3555
|
},
|
|
3415
3556
|
});
|
|
3416
3557
|
}
|
|
3417
|
-
|
|
3418
|
-
const
|
|
3419
|
-
title: 'Update
|
|
3558
|
+
updateYoutubeUrl(video) {
|
|
3559
|
+
const options = {
|
|
3560
|
+
title: 'Update Youtube url',
|
|
3420
3561
|
cancelText: 'Cancel',
|
|
3421
3562
|
confirmText: 'Confirm',
|
|
3422
3563
|
data: {
|
|
3423
|
-
|
|
3564
|
+
url: video?.url || '',
|
|
3424
3565
|
},
|
|
3425
|
-
component:
|
|
3566
|
+
component: PropertyVideoYoutubeAddComponent,
|
|
3426
3567
|
};
|
|
3427
|
-
this.dialogService.open(
|
|
3568
|
+
this.dialogService.open(options);
|
|
3428
3569
|
this.dialogService.confirmed().subscribe({
|
|
3429
3570
|
next: (res) => {
|
|
3430
3571
|
if (res) {
|
|
3431
3572
|
const data = {
|
|
3432
|
-
|
|
3573
|
+
url: res,
|
|
3574
|
+
title: video.title
|
|
3433
3575
|
};
|
|
3434
|
-
this.propertyService.
|
|
3576
|
+
this.propertyService.updateVideo(this.id, video.id, data).subscribe({
|
|
3435
3577
|
next: (res) => {
|
|
3436
|
-
|
|
3437
|
-
|
|
3578
|
+
video.url = res.data.url;
|
|
3579
|
+
// Force reload
|
|
3580
|
+
this.iframeLoaded = false;
|
|
3581
|
+
this.snackBarService.open('Youtube url updated');
|
|
3582
|
+
},
|
|
3583
|
+
});
|
|
3584
|
+
}
|
|
3585
|
+
},
|
|
3586
|
+
});
|
|
3587
|
+
}
|
|
3588
|
+
toYoutubeEmbed(urlOrId) {
|
|
3589
|
+
const m = urlOrId.match(/(?:v=|\/embed\/|\.be\/)([A-Za-z0-9_-]{6,})/);
|
|
3590
|
+
const id = m ? m[1] : urlOrId;
|
|
3591
|
+
return `https://www.youtube-nocookie.com/embed/${id}`;
|
|
3592
|
+
}
|
|
3593
|
+
addCOSVideo() {
|
|
3594
|
+
const video = {
|
|
3595
|
+
provider: PropertyVideoProvider.COS
|
|
3596
|
+
};
|
|
3597
|
+
this.propertyService.addVideo(this.id, video).subscribe({
|
|
3598
|
+
next: (res) => {
|
|
3599
|
+
this.videoEditId = res.data.id;
|
|
3600
|
+
this.videos.push(res.data);
|
|
3601
|
+
},
|
|
3602
|
+
});
|
|
3603
|
+
}
|
|
3604
|
+
onCOSVideoSave(event) {
|
|
3605
|
+
const { id, title, url } = event;
|
|
3606
|
+
const data = {
|
|
3607
|
+
title, url
|
|
3608
|
+
};
|
|
3609
|
+
this.propertyService.updateVideo(this.id, id, data).subscribe({
|
|
3610
|
+
next: (res) => {
|
|
3611
|
+
this.snackBarService.open('Youtube url updated');
|
|
3612
|
+
},
|
|
3613
|
+
});
|
|
3614
|
+
}
|
|
3615
|
+
onCOSVideoDelete(video, event) {
|
|
3616
|
+
if (!video.id) {
|
|
3617
|
+
return;
|
|
3618
|
+
}
|
|
3619
|
+
const options = {
|
|
3620
|
+
title: 'Confirm delete',
|
|
3621
|
+
message: 'Are you sure?',
|
|
3622
|
+
cancelText: 'Cancel',
|
|
3623
|
+
confirmText: 'Ok',
|
|
3624
|
+
};
|
|
3625
|
+
this.dialogService.open(options);
|
|
3626
|
+
this.dialogService.confirmed().subscribe({
|
|
3627
|
+
next: (res) => {
|
|
3628
|
+
if (res) {
|
|
3629
|
+
this.propertyService.deleteVideo(this.id, video.id).subscribe({
|
|
3630
|
+
next: res => {
|
|
3631
|
+
this.videos = this.videos.filter(v => v.id !== video.id);
|
|
3632
|
+
this.snackBarService.open("Video deleted");
|
|
3633
|
+
},
|
|
3634
|
+
error: (error) => {
|
|
3635
|
+
this.snackBarService.open(error.message);
|
|
3438
3636
|
},
|
|
3439
3637
|
});
|
|
3440
3638
|
}
|
|
3441
3639
|
},
|
|
3442
3640
|
});
|
|
3443
3641
|
}
|
|
3444
|
-
|
|
3642
|
+
onVideoEdit(event) { }
|
|
3643
|
+
onMediaDelete(video, event) { }
|
|
3644
|
+
onCOSVideoUpload(video, event) {
|
|
3445
3645
|
const file = event.data.target.files[0];
|
|
3446
3646
|
if (!file) {
|
|
3447
3647
|
return;
|
|
3448
3648
|
}
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3649
|
+
video.url = URL.createObjectURL(file);
|
|
3650
|
+
video.progress = 0;
|
|
3651
|
+
video.uploading = true;
|
|
3452
3652
|
const reader = new FileReader();
|
|
3453
3653
|
if (reader.readyState === FileReader.EMPTY) {
|
|
3454
3654
|
reader.onload = async (e) => {
|
|
@@ -3456,10 +3656,10 @@ class PropertyManageVideoTourComponent extends BaseComponent {
|
|
|
3456
3656
|
crypto.subtle.digest('SHA-256', fileBuffer).then((res) => {
|
|
3457
3657
|
const hashArray = Array.from(new Uint8Array(res));
|
|
3458
3658
|
const hashHex = hashArray.map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
3459
|
-
const data = { hash: hashHex, filename: file.name, fileType: file.type };
|
|
3460
|
-
this.propertyService.
|
|
3659
|
+
const data = { hash: hashHex, filename: file.name, fileType: file.type, type: 'COS' };
|
|
3660
|
+
this.propertyService.uploadVideosInit(this.id, data).subscribe({
|
|
3461
3661
|
next: (res) => {
|
|
3462
|
-
this.uploadPart(
|
|
3662
|
+
this.uploadPart(video, res.data.uploadId, file);
|
|
3463
3663
|
},
|
|
3464
3664
|
error: (e) => { },
|
|
3465
3665
|
});
|
|
@@ -3469,34 +3669,33 @@ class PropertyManageVideoTourComponent extends BaseComponent {
|
|
|
3469
3669
|
reader.readAsArrayBuffer(file);
|
|
3470
3670
|
}
|
|
3471
3671
|
}
|
|
3472
|
-
uploadPart(
|
|
3672
|
+
uploadPart(video, uploadId, file) {
|
|
3473
3673
|
let uploadedCount = 0;
|
|
3474
3674
|
const fileChunkList = this.createFileChunk(file);
|
|
3475
3675
|
const numberOfChunks = fileChunkList.length;
|
|
3476
3676
|
from(fileChunkList)
|
|
3477
|
-
.pipe(concatMap((val, index) => this.uploadFile(
|
|
3677
|
+
.pipe(concatMap((val, index) => this.uploadFile(video, val.file, index, uploadId)), take(numberOfChunks))
|
|
3478
3678
|
.subscribe((res) => {
|
|
3479
3679
|
uploadedCount++;
|
|
3480
3680
|
const p = ((uploadedCount / numberOfChunks) * 100).toFixed(0);
|
|
3481
|
-
|
|
3681
|
+
video.progress = parseFloat(p);
|
|
3482
3682
|
if (uploadedCount === numberOfChunks) {
|
|
3483
|
-
this.completePartUpload(
|
|
3683
|
+
this.completePartUpload(video, { uploadId });
|
|
3484
3684
|
}
|
|
3485
3685
|
});
|
|
3486
3686
|
}
|
|
3487
|
-
completePartUpload(
|
|
3488
|
-
data.duration =
|
|
3489
|
-
this.propertyService.completePartUpload(
|
|
3687
|
+
completePartUpload(video, data) {
|
|
3688
|
+
data.duration = video.duration;
|
|
3689
|
+
this.propertyService.completePartUpload(video.id || '', data).subscribe({
|
|
3490
3690
|
next: (res) => {
|
|
3491
|
-
|
|
3492
|
-
lecture.item.id = res.data.id;
|
|
3691
|
+
video.uploading = false;
|
|
3493
3692
|
},
|
|
3494
3693
|
error: (e) => {
|
|
3495
3694
|
this.snackBarService.open('Upload failed: ' + e.message);
|
|
3496
3695
|
},
|
|
3497
3696
|
});
|
|
3498
3697
|
}
|
|
3499
|
-
uploadFile(
|
|
3698
|
+
uploadFile(property, file, index, uploadId) {
|
|
3500
3699
|
const reader = new FileReader();
|
|
3501
3700
|
return new Observable((observer) => {
|
|
3502
3701
|
reader.readAsArrayBuffer(file);
|
|
@@ -3510,7 +3709,8 @@ class PropertyManageVideoTourComponent extends BaseComponent {
|
|
|
3510
3709
|
formData.append('uploadId', uploadId);
|
|
3511
3710
|
formData.append('number', index + 1);
|
|
3512
3711
|
formData.append('hash', hashHex);
|
|
3513
|
-
|
|
3712
|
+
formData.append('type', 'COS');
|
|
3713
|
+
this.propertyService.uploadVideosPartsToProperty(property.id, formData).subscribe({
|
|
3514
3714
|
next: (res) => {
|
|
3515
3715
|
observer.next(res);
|
|
3516
3716
|
observer.complete();
|
|
@@ -3537,12 +3737,52 @@ class PropertyManageVideoTourComponent extends BaseComponent {
|
|
|
3537
3737
|
}
|
|
3538
3738
|
return fileChunkList;
|
|
3539
3739
|
}
|
|
3540
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
3541
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type:
|
|
3740
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3741
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyManageVideoComponent, isStandalone: true, selector: "rolatech-property-manage-video", usesInheritance: true, ngImport: i0, template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"Videos\" class=\"hidden md:block\" divider> </rolatech-toolbar>\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"Youtube\"></rolatech-tab>\n <rolatech-tab label=\"COS\"></rolatech-tab>\n </rolatech-tabs>\n <div class=\"py-2\">\n @if (tabIndex() === 0) {\n @if (youtubeVideos.length > 0 && youtubeVideos[0].url) {\n <div class=\"relative w-full aspect-video\">\n @if (!iframeLoaded) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-black/10 border bg-white\">\n <span>Loading...</span>\n </div>\n }\n <iframe\n [src]=\"toYoutubeEmbed(youtubeVideos[0].url) | safeUrl\"\n frameborder=\"0\"\n allowfullscreen\n class=\"w-full h-full\"\n (load)=\"iframeLoaded = true\"\n ></iframe>\n </div>\n <button mat-flat-button (click)=\"updateYoutubeUrl(youtubeVideos[0])\" class=\"mt-3\">Update Youtube url</button>\n } @else {\n <button mat-flat-button (click)=\"addYoutubeUrl()\" class=\"mt-3\">Add Youtube url</button>\n }\n }\n @if (tabIndex() === 1) {\n @for (video of cosVideos; track $index) {\n <rolatech-property-video-item\n [video]=\"video\"\n (save)=\"onCOSVideoSave($event)\"\n (delete)=\"onCOSVideoDelete(video, $event)\"\n (edit)=\"onVideoEdit($event)\"\n (upload)=\"onCOSVideoUpload(video, $event)\"\n [editId]=\"videoEditId\"\n ></rolatech-property-video-item>\n }\n\n <div class=\"p-3\">\n <button mat-flat-button class=\"max-h-8\" (click)=\"addCOSVideo()\">\n <mat-icon>add</mat-icon>\n <span>Add video</span>\n </button>\n </div>\n <!-- <rolatech-video-upload (upload)=\"onMediaUploadInit($event)\"></rolatech-video-upload> -->\n }\n </div>\n</rolatech-property-manage-content>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }, { kind: "component", type: PropertyManageContentComponent, selector: "rolatech-property-manage-content" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$4.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"] }, { kind: "component", type: PropertyVideoItem, selector: "rolatech-property-video-item", inputs: ["progress", "video", "actions", "hasUnsaved", "editId"], outputs: ["editIdChange", "save", "cancel", "delete", "edit", "upload"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: SafeUrlPipe, name: "safeUrl" }] });
|
|
3742
|
+
}
|
|
3743
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageVideoComponent, decorators: [{
|
|
3744
|
+
type: Component,
|
|
3745
|
+
args: [{ selector: 'rolatech-property-manage-video', imports: [CommonModule, ToolbarComponent, PropertyManageContentComponent, MatButtonModule, TabsComponent, TabComponent, SafeUrlPipe, PropertyVideoItem, MatIcon], template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"Videos\" class=\"hidden md:block\" divider> </rolatech-toolbar>\n <rolatech-tabs [(select)]=\"tabIndex\">\n <rolatech-tab label=\"Youtube\"></rolatech-tab>\n <rolatech-tab label=\"COS\"></rolatech-tab>\n </rolatech-tabs>\n <div class=\"py-2\">\n @if (tabIndex() === 0) {\n @if (youtubeVideos.length > 0 && youtubeVideos[0].url) {\n <div class=\"relative w-full aspect-video\">\n @if (!iframeLoaded) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-black/10 border bg-white\">\n <span>Loading...</span>\n </div>\n }\n <iframe\n [src]=\"toYoutubeEmbed(youtubeVideos[0].url) | safeUrl\"\n frameborder=\"0\"\n allowfullscreen\n class=\"w-full h-full\"\n (load)=\"iframeLoaded = true\"\n ></iframe>\n </div>\n <button mat-flat-button (click)=\"updateYoutubeUrl(youtubeVideos[0])\" class=\"mt-3\">Update Youtube url</button>\n } @else {\n <button mat-flat-button (click)=\"addYoutubeUrl()\" class=\"mt-3\">Add Youtube url</button>\n }\n }\n @if (tabIndex() === 1) {\n @for (video of cosVideos; track $index) {\n <rolatech-property-video-item\n [video]=\"video\"\n (save)=\"onCOSVideoSave($event)\"\n (delete)=\"onCOSVideoDelete(video, $event)\"\n (edit)=\"onVideoEdit($event)\"\n (upload)=\"onCOSVideoUpload(video, $event)\"\n [editId]=\"videoEditId\"\n ></rolatech-property-video-item>\n }\n\n <div class=\"p-3\">\n <button mat-flat-button class=\"max-h-8\" (click)=\"addCOSVideo()\">\n <mat-icon>add</mat-icon>\n <span>Add video</span>\n </button>\n </div>\n <!-- <rolatech-video-upload (upload)=\"onMediaUploadInit($event)\"></rolatech-video-upload> -->\n }\n </div>\n</rolatech-property-manage-content>\n" }]
|
|
3746
|
+
}], ctorParameters: () => [] });
|
|
3747
|
+
|
|
3748
|
+
class PropertyManageHighlights extends BaseComponent {
|
|
3749
|
+
propertyService = inject(PropertyService);
|
|
3750
|
+
highlights = [];
|
|
3751
|
+
ngOnInit() {
|
|
3752
|
+
this.id = this.route.parent?.snapshot.paramMap.get('id');
|
|
3753
|
+
this.find();
|
|
3754
|
+
}
|
|
3755
|
+
find() {
|
|
3756
|
+
this.propertyService.getHighlights(this.id).subscribe({
|
|
3757
|
+
next: (res) => {
|
|
3758
|
+
this.highlights = res.data;
|
|
3759
|
+
}
|
|
3760
|
+
});
|
|
3761
|
+
}
|
|
3762
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageHighlights, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
3763
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: PropertyManageHighlights, isStandalone: true, selector: "rolatech-property-manage-highlights", usesInheritance: true, ngImport: i0, template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"Highlights\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div>\n @for (item of highlights; track $index) {\n <div class=\"font-bold p-1\">{{item}}</div>\n }\n </div>\n</rolatech-property-manage-content>\n", styles: [""], dependencies: [{ kind: "component", type: PropertyManageContentComponent, selector: "rolatech-property-manage-content" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }] });
|
|
3764
|
+
}
|
|
3765
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageHighlights, decorators: [{
|
|
3766
|
+
type: Component,
|
|
3767
|
+
args: [{ selector: 'rolatech-property-manage-highlights', imports: [PropertyManageContentComponent, ToolbarComponent], template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"Highlights\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div>\n @for (item of highlights; track $index) {\n <div class=\"font-bold p-1\">{{item}}</div>\n }\n </div>\n</rolatech-property-manage-content>\n" }]
|
|
3768
|
+
}] });
|
|
3769
|
+
|
|
3770
|
+
class PropertyManageEpc {
|
|
3771
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageEpc, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3772
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.0", type: PropertyManageEpc, isStandalone: true, selector: "rolatech-property-manage-epc", ngImport: i0, template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"EPC\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div></div>\n</rolatech-property-manage-content>\n", styles: [""], dependencies: [{ kind: "component", type: PropertyManageContentComponent, selector: "rolatech-property-manage-content" }, { kind: "component", type: ToolbarComponent, selector: "rolatech-toolbar", inputs: ["title", "subtitle", "back", "link", "large", "divider"] }] });
|
|
3542
3773
|
}
|
|
3543
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type:
|
|
3774
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageEpc, decorators: [{
|
|
3544
3775
|
type: Component,
|
|
3545
|
-
args: [{ selector: 'rolatech-property-manage-
|
|
3776
|
+
args: [{ selector: 'rolatech-property-manage-epc', imports: [PropertyManageContentComponent, ToolbarComponent], template: "<rolatech-property-manage-content>\n <rolatech-toolbar title=\"EPC\" class=\"hidden md:block\" divider></rolatech-toolbar>\n <div></div>\n</rolatech-property-manage-content>\n" }]
|
|
3777
|
+
}] });
|
|
3778
|
+
|
|
3779
|
+
class PropertyManageTranslation {
|
|
3780
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageTranslation, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3781
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.2.0", type: PropertyManageTranslation, isStandalone: true, selector: "rolatech-property-manage-translation", ngImport: i0, template: "<p>property-manage-translation works!</p>\n", styles: [""] });
|
|
3782
|
+
}
|
|
3783
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: PropertyManageTranslation, decorators: [{
|
|
3784
|
+
type: Component,
|
|
3785
|
+
args: [{ selector: 'rolatech-property-manage-translation', imports: [], template: "<p>property-manage-translation works!</p>\n" }]
|
|
3546
3786
|
}] });
|
|
3547
3787
|
|
|
3548
3788
|
const propertyManageRoutes = [
|
|
@@ -3567,8 +3807,8 @@ const propertyManageRoutes = [
|
|
|
3567
3807
|
component: PropertyManageMediaComponent,
|
|
3568
3808
|
},
|
|
3569
3809
|
{
|
|
3570
|
-
path: '
|
|
3571
|
-
component:
|
|
3810
|
+
path: 'videos',
|
|
3811
|
+
component: PropertyManageVideoComponent,
|
|
3572
3812
|
},
|
|
3573
3813
|
{
|
|
3574
3814
|
path: 'sections',
|
|
@@ -3582,6 +3822,18 @@ const propertyManageRoutes = [
|
|
|
3582
3822
|
path: 'features',
|
|
3583
3823
|
component: PropertyManageFeaturesComponent,
|
|
3584
3824
|
},
|
|
3825
|
+
{
|
|
3826
|
+
path: 'highlights',
|
|
3827
|
+
component: PropertyManageHighlights,
|
|
3828
|
+
},
|
|
3829
|
+
{
|
|
3830
|
+
path: 'epc',
|
|
3831
|
+
component: PropertyManageEpc,
|
|
3832
|
+
},
|
|
3833
|
+
{
|
|
3834
|
+
path: 'translation',
|
|
3835
|
+
component: PropertyManageTranslation,
|
|
3836
|
+
},
|
|
3585
3837
|
// {
|
|
3586
3838
|
// path: 'amenities',
|
|
3587
3839
|
// component: PropertyManageAmenitiesComponent,
|
|
@@ -3696,7 +3948,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
3696
3948
|
const propertyManageViewingsRoutes = [
|
|
3697
3949
|
{
|
|
3698
3950
|
path: '',
|
|
3699
|
-
loadComponent: () => import('./rolatech-angular-property-property-manage-viewings-index.component-
|
|
3951
|
+
loadComponent: () => import('./rolatech-angular-property-property-manage-viewings-index.component-UsM6RfhW.mjs').then((x) => x.PropertyManageViewingsIndexComponent),
|
|
3700
3952
|
},
|
|
3701
3953
|
{
|
|
3702
3954
|
path: ':id',
|
|
@@ -3942,7 +4194,7 @@ class LettingManageDetail extends BaseComponent {
|
|
|
3942
4194
|
// const updatedCriteria = matchingVariant ? updateCriteriaFromVariant(matchingVariant) : [];
|
|
3943
4195
|
}
|
|
3944
4196
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: LettingManageDetail, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
3945
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: LettingManageDetail, isStandalone: true, selector: "rolatech-letting-manage-detail", usesInheritance: true, ngImport: i0, template: "@if (property) {\n<rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-features [features]=\"property.features\"></rolatech-property-features>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.
|
|
4197
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.0", type: LettingManageDetail, isStandalone: true, selector: "rolatech-letting-manage-detail", usesInheritance: true, ngImport: i0, template: "@if (property) {\n<rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-features [features]=\"property.features\"></rolatech-property-features>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.videos) {\n <rolatech-property-video [video]=\"property.videos[0]\"></rolatech-property-video>\n }\n <div class=\"flex flex-col\">\n <div class=\"text-2xl font-bold pt-3\" i18n>Sections</div>\n @for (section of property.sections; track $index) {\n <rolatech-property-section [section]=\"section\"></rolatech-property-section>\n }\n </div>\n </div>\n <div class=\"w-full h-fit md:w-1/3 rounded-md border shadow p-3\">\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n subtitle=\"PrimeCase Agent\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-pricing (wish)=\"onWish($event)\" [property]=\"property\"></rolatech-property-pricing>\n <rolatech-letting-actions\n [letting]=\"property\"\n (offer)=\"onOffer($event)\"\n (deposit)=\"onOffer($event)\"\n (requestViewing)=\"onRequestViewing($event)\"\n >\n @if (user) {\n <rolatech-letting-action-contact [phone]=\"user.phone\"></rolatech-letting-action-contact>\n }\n </rolatech-letting-actions>\n </div>\n </div>\n </div>\n</rolatech-container>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: AngularCommonModule }, { kind: "ngmodule", type: AngularComponentsModule }, { kind: "component", type: ContainerComponent, selector: "rolatech-container" }, { kind: "component", type: PropertyInfoComponent, selector: "rolatech-property-info", inputs: ["property", "inWishList"], outputs: ["wish"] }, { kind: "component", type: PropertyMediaComponent, selector: "rolatech-property-media", inputs: ["media", "min"] }, { kind: "component", type: PropertyPricingComponent, selector: "rolatech-property-pricing", inputs: ["property", "price"] }, { kind: "component", type: PropertySectionComponent, selector: "rolatech-property-section", inputs: ["section", "user", "username"] }, { kind: "component", type: LettingActions, selector: "rolatech-letting-actions", inputs: ["letting"], outputs: ["requestViewing", "offer", "deposit"] }, { kind: "component", type: LettingActionContact, selector: "rolatech-letting-action-contact", inputs: ["phone"], outputs: ["callAgent", "emailAgent"] }, { kind: "component", type: PropertyLocationComponent, selector: "rolatech-property-location", inputs: ["location"] }, { kind: "component", type: PropertyFeaturesComponent, selector: "rolatech-property-features", inputs: ["features"] }, { kind: "component", type: PropertyVideoComponent, selector: "rolatech-property-video", inputs: ["video"] }, { kind: "component", type: PropertyAgentRenderer, selector: "rolatech-property-agent-renderer", inputs: ["name", "avatar", "username", "subtitle"] }] });
|
|
3946
4198
|
}
|
|
3947
4199
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImport: i0, type: LettingManageDetail, decorators: [{
|
|
3948
4200
|
type: Component,
|
|
@@ -3958,9 +4210,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0", ngImpor
|
|
|
3958
4210
|
LettingActionContact,
|
|
3959
4211
|
PropertyLocationComponent,
|
|
3960
4212
|
PropertyFeaturesComponent,
|
|
3961
|
-
|
|
4213
|
+
PropertyVideoComponent,
|
|
3962
4214
|
PropertyAgentRenderer
|
|
3963
|
-
], template: "@if (property) {\n<rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-features [features]=\"property.features\"></rolatech-property-features>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.
|
|
4215
|
+
], template: "@if (property) {\n<rolatech-container>\n <div class=\"flex flex-col w-full\">\n <div class=\"py-3\">\n <rolatech-property-media [media]=\"property.media\"></rolatech-property-media>\n </div>\n <div class=\"flex flex-col md:flex-row gap-3 w-full\">\n <div class=\"w-full md:w-2/3\">\n <rolatech-property-info [property]=\"property\" (wish)=\"onWish($event)\" [inWishList]=\"inWishList\">\n </rolatech-property-info>\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-features [features]=\"property.features\"></rolatech-property-features>\n <rolatech-property-location [location]=\"property.location\"></rolatech-property-location>\n @if (property.videos) {\n <rolatech-property-video [video]=\"property.videos[0]\"></rolatech-property-video>\n }\n <div class=\"flex flex-col\">\n <div class=\"text-2xl font-bold pt-3\" i18n>Sections</div>\n @for (section of property.sections; track $index) {\n <rolatech-property-section [section]=\"section\"></rolatech-property-section>\n }\n </div>\n </div>\n <div class=\"w-full h-fit md:w-1/3 rounded-md border shadow p-3\">\n <rolatech-property-agent-renderer\n [name]=\"fullname\"\n [avatar]=\"user?.avatar\"\n [username]=\"username\"\n subtitle=\"PrimeCase Agent\"\n ></rolatech-property-agent-renderer>\n <rolatech-property-pricing (wish)=\"onWish($event)\" [property]=\"property\"></rolatech-property-pricing>\n <rolatech-letting-actions\n [letting]=\"property\"\n (offer)=\"onOffer($event)\"\n (deposit)=\"onOffer($event)\"\n (requestViewing)=\"onRequestViewing($event)\"\n >\n @if (user) {\n <rolatech-letting-action-contact [phone]=\"user.phone\"></rolatech-letting-action-contact>\n }\n </rolatech-letting-actions>\n </div>\n </div>\n </div>\n</rolatech-container>\n}\n" }]
|
|
3964
4216
|
}], ctorParameters: () => [] });
|
|
3965
4217
|
|
|
3966
4218
|
const MY_FORMATS$1 = {
|
|
@@ -4309,5 +4561,5 @@ const tenantManageRoutes = [
|
|
|
4309
4561
|
* Generated bundle index. Do not edit.
|
|
4310
4562
|
*/
|
|
4311
4563
|
|
|
4312
|
-
export { AdverseCreditStatus as A, EmploymentStatus as E, PropertyViewingItemComponent as P, ResidencyStatus as R, ViewingTime as V, propertyManageOffersRoutes as a, propertyRoutes as b, propertyManageRoutes as c, propertyManageViewingsRoutes as d, PropertyActionsComponent as e, featureManageRoutes as f, PropertyItemComponent as g, PropertyPricingComponent as h, PropertyPriceType as i,
|
|
4313
|
-
//# sourceMappingURL=rolatech-angular-property-rolatech-angular-property-
|
|
4564
|
+
export { AdverseCreditStatus as A, EmploymentStatus as E, PropertyViewingItemComponent as P, ResidencyStatus as R, ViewingTime as V, propertyManageOffersRoutes as a, propertyRoutes as b, propertyManageRoutes as c, propertyManageViewingsRoutes as d, PropertyActionsComponent as e, featureManageRoutes as f, PropertyItemComponent as g, PropertyPricingComponent as h, PropertyPriceType as i, PropertyVideoProvider as j, PropertyStatus as k, lettingManageRoutes as l, PropertyType as m, PropertyInventoryStatus as n, PropertyScope as o, propertyReviewRoutes as p, PropertyViewingStatus as q, PropertyViewerCategory as r, PropertyOfferTimelineStatus as s, tenantManageRoutes as t, PropertyOfferType as u, PropertyOfferStatus as v, PropertyApplicantType as w };
|
|
4565
|
+
//# sourceMappingURL=rolatech-angular-property-rolatech-angular-property-CQG71H-d.mjs.map
|