Add pageCount to crawls and uploads and use in frontend for page counts (#2315)
Fixes #2257 This is a follow-up to the public collections work, which adds pages to the database for uploads. All crawls and uploads now have a `pageCount` field which is populated when the item is successfully added. A new migration is also added to populate the field for existing archived items that don't have it set yet. OrgMetrics have also been modified to include `crawlPageCount` and `uploadPageCount`, and to include the total of both in `pageCount`, and all three included in the frontend org dashboard. The frontend has been updated to use `pageCount` rather than `stats.done` wherever appropriate, meaning that in archived item lists and details we now have a consistent page count for both crawls and uploads. ### New functionality - Deploy this branch - Create new crawls and uploads and verify that page count appears correctly throughout the frontend for all new crawls and uploads ### Migration - Deploy from latest main - Create some crawls and uploads - Change to this branch and re-deploy - Verify migration ran without errors in backend logs - Verify that page count has been populated successfully by checking archived items lists, crawl and upload detail pages, and dashboard to ensure there are no longer any missing page counts. --------- Co-authored-by: emma <hi@emma.cafe>
This commit is contained in:
		
							parent
							
								
									5684e896af
								
							
						
					
					
						commit
						6797b41de0
					
				| @ -17,7 +17,7 @@ from pymongo.errors import InvalidName | ||||
| from .migrations import BaseMigration | ||||
| 
 | ||||
| 
 | ||||
| CURR_DB_VERSION = "0039" | ||||
| CURR_DB_VERSION = "0040" | ||||
| 
 | ||||
| 
 | ||||
| # ============================================================================ | ||||
|  | ||||
| @ -0,0 +1,43 @@ | ||||
| """ | ||||
| Migration 0040 -- archived item pageCount | ||||
| """ | ||||
| 
 | ||||
| from btrixcloud.migrations import BaseMigration | ||||
| 
 | ||||
| 
 | ||||
| MIGRATION_VERSION = "0040" | ||||
| 
 | ||||
| 
 | ||||
| class Migration(BaseMigration): | ||||
|     """Migration class.""" | ||||
| 
 | ||||
|     # pylint: disable=unused-argument | ||||
|     def __init__(self, mdb, **kwargs): | ||||
|         super().__init__(mdb, migration_version=MIGRATION_VERSION) | ||||
| 
 | ||||
|         self.page_ops = kwargs.get("page_ops") | ||||
| 
 | ||||
|     async def migrate_up(self): | ||||
|         """Perform migration up. | ||||
| 
 | ||||
|         Calculate and store pageCount for archived items that don't have it yet | ||||
|         """ | ||||
|         crawls_mdb = self.mdb["crawls"] | ||||
| 
 | ||||
|         if self.page_ops is None: | ||||
|             print( | ||||
|                 "Unable to set pageCount for archived items, missing page_ops", | ||||
|                 flush=True, | ||||
|             ) | ||||
|             return | ||||
| 
 | ||||
|         async for crawl_raw in crawls_mdb.find({"pageCount": None}): | ||||
|             crawl_id = crawl_raw["_id"] | ||||
|             try: | ||||
|                 await self.page_ops.set_archived_item_page_count(crawl_id) | ||||
|             # pylint: disable=broad-exception-caught | ||||
|             except Exception as err: | ||||
|                 print( | ||||
|                     f"Error saving pageCount for archived item {crawl_id}: {err}", | ||||
|                     flush=True, | ||||
|                 ) | ||||
| @ -797,6 +797,8 @@ class BaseCrawl(CoreCrawlable, BaseMongoModel): | ||||
| 
 | ||||
|     reviewStatus: ReviewStatus = None | ||||
| 
 | ||||
|     pageCount: Optional[int] = 0 | ||||
| 
 | ||||
|     filePageCount: Optional[int] = 0 | ||||
|     errorPageCount: Optional[int] = 0 | ||||
| 
 | ||||
| @ -872,6 +874,7 @@ class CrawlOut(BaseMongoModel): | ||||
|     lastQAState: Optional[str] = None | ||||
|     lastQAStarted: Optional[datetime] = None | ||||
| 
 | ||||
|     pageCount: Optional[int] = 0 | ||||
|     filePageCount: Optional[int] = 0 | ||||
|     errorPageCount: Optional[int] = 0 | ||||
| 
 | ||||
| @ -1914,6 +1917,8 @@ class OrgMetrics(BaseModel): | ||||
|     crawlCount: int | ||||
|     uploadCount: int | ||||
|     pageCount: int | ||||
|     crawlPageCount: int | ||||
|     uploadPageCount: int | ||||
|     profileCount: int | ||||
|     workflowsRunningCount: int | ||||
|     maxConcurrentCrawls: int | ||||
|  | ||||
| @ -1534,6 +1534,7 @@ class CrawlOperator(BaseOperator): | ||||
|         ) | ||||
| 
 | ||||
|         if state in SUCCESSFUL_STATES and crawl.oid: | ||||
|             await self.page_ops.set_archived_item_page_count(crawl.id) | ||||
|             await self.org_ops.inc_org_bytes_stored( | ||||
|                 crawl.oid, status.filesAddedSize, "crawl" | ||||
|             ) | ||||
|  | ||||
| @ -939,7 +939,10 @@ class OrgOps: | ||||
|         archived_item_count = 0 | ||||
|         crawl_count = 0 | ||||
|         upload_count = 0 | ||||
| 
 | ||||
|         page_count = 0 | ||||
|         crawl_page_count = 0 | ||||
|         upload_page_count = 0 | ||||
| 
 | ||||
|         async for item_data in self.crawls_db.find({"oid": org.id}): | ||||
|             item = BaseCrawl.from_dict(item_data) | ||||
| @ -948,10 +951,12 @@ class OrgOps: | ||||
|             archived_item_count += 1 | ||||
|             if item.type == "crawl": | ||||
|                 crawl_count += 1 | ||||
|                 crawl_page_count += item.pageCount or 0 | ||||
|             if item.type == "upload": | ||||
|                 upload_count += 1 | ||||
|             if item.stats: | ||||
|                 page_count += item.stats.done | ||||
|                 upload_page_count += item.pageCount or 0 | ||||
|             if item.pageCount: | ||||
|                 page_count += item.pageCount | ||||
| 
 | ||||
|         profile_count = await self.profiles_db.count_documents({"oid": org.id}) | ||||
|         workflows_running_count = await self.crawls_db.count_documents( | ||||
| @ -975,6 +980,8 @@ class OrgOps: | ||||
|             "crawlCount": crawl_count, | ||||
|             "uploadCount": upload_count, | ||||
|             "pageCount": page_count, | ||||
|             "crawlPageCount": crawl_page_count, | ||||
|             "uploadPageCount": upload_page_count, | ||||
|             "profileCount": profile_count, | ||||
|             "workflowsRunningCount": workflows_running_count, | ||||
|             "maxConcurrentCrawls": max_concurrent_crawls, | ||||
|  | ||||
| @ -92,6 +92,8 @@ class PageOps: | ||||
|             if pages_buffer: | ||||
|                 await self._add_pages_to_db(crawl_id, pages_buffer) | ||||
| 
 | ||||
|             await self.set_archived_item_page_count(crawl_id) | ||||
| 
 | ||||
|             print(f"Added pages for crawl {crawl_id} to db", flush=True) | ||||
|         # pylint: disable=broad-exception-caught, raise-missing-from | ||||
|         except Exception as err: | ||||
| @ -661,6 +663,14 @@ class PageOps: | ||||
| 
 | ||||
|         return crawl_type | ||||
| 
 | ||||
|     async def set_archived_item_page_count(self, crawl_id: str): | ||||
|         """Store archived item page count in crawl document""" | ||||
|         _, page_count = await self.list_pages(crawl_id) | ||||
| 
 | ||||
|         await self.crawls.find_one_and_update( | ||||
|             {"_id": crawl_id}, {"$set": {"pageCount": page_count}} | ||||
|         ) | ||||
| 
 | ||||
| 
 | ||||
| # ============================================================================ | ||||
| # pylint: disable=too-many-arguments, too-many-locals, invalid-name, fixme | ||||
|  | ||||
| @ -877,6 +877,14 @@ def test_re_add_crawl_pages(crawler_auth_headers, default_org_id, crawler_crawl_ | ||||
|     ) | ||||
|     assert r.status_code == 403 | ||||
| 
 | ||||
|     # Check that pageCount was stored on crawl | ||||
|     r = requests.get( | ||||
|         f"{API_PREFIX}/orgs/{default_org_id}/crawls/{crawler_crawl_id}", | ||||
|         headers=crawler_auth_headers, | ||||
|     ) | ||||
|     assert r.status_code == 200 | ||||
|     assert r.json()["pageCount"] > 0 | ||||
| 
 | ||||
| 
 | ||||
| def test_crawl_page_notes(crawler_auth_headers, default_org_id, crawler_crawl_id): | ||||
|     note_text = "testing" | ||||
|  | ||||
| @ -274,6 +274,14 @@ def test_get_upload_pages(admin_auth_headers, default_org_id, upload_id): | ||||
|     assert page.get("modified") is None | ||||
|     assert page.get("approved") is None | ||||
| 
 | ||||
|     # Check that pageCount was stored on upload | ||||
|     r = requests.get( | ||||
|         f"{API_PREFIX}/orgs/{default_org_id}/uploads/{upload_id}", | ||||
|         headers=admin_auth_headers, | ||||
|     ) | ||||
|     assert r.status_code == 200 | ||||
|     assert r.json()["pageCount"] > 0 | ||||
| 
 | ||||
| 
 | ||||
| def test_replace_upload( | ||||
|     admin_auth_headers, default_org_id, uploads_collection_id, upload_id | ||||
|  | ||||
| @ -252,7 +252,24 @@ export class ArchivedItemListItem extends BtrixElement { | ||||
|         </btrix-table-cell> | ||||
|         <btrix-table-cell class="tabular-nums"> | ||||
|           ${isUpload | ||||
|             ? notApplicable | ||||
|             ? html`<sl-tooltip
 | ||||
|                 hoist | ||||
|                 @click=${this.onTooltipClick} | ||||
|                 content=${msg( | ||||
|                   str`${this.localize.number( | ||||
|                     this.item.pageCount ? +this.item.pageCount : 0, | ||||
|                   )}`,
 | ||||
|                 )} | ||||
|               > | ||||
|                 <div class="min-w-4"> | ||||
|                   ${this.localize.number( | ||||
|                     this.item.pageCount ? +this.item.pageCount : 0, | ||||
|                     { | ||||
|                       notation: "compact", | ||||
|                     }, | ||||
|                   )} | ||||
|                 </div> | ||||
|               </sl-tooltip>` | ||||
|             : html`<sl-tooltip
 | ||||
|                 hoist | ||||
|                 @click=${this.onTooltipClick} | ||||
|  | ||||
| @ -191,12 +191,13 @@ export class CrawlListItem extends BtrixElement { | ||||
|         </btrix-table-cell> | ||||
|         <btrix-table-cell> | ||||
|           ${this.safeRender((crawl) => { | ||||
|             const pagesComplete = +(crawl.stats?.done || 0); | ||||
|             const pagesFound = +(crawl.stats?.found || 0); | ||||
|             if (crawl.finished) { | ||||
|               const pagesComplete = crawl.pageCount ? +crawl.pageCount : 0; | ||||
|               return `${this.localize.number(pagesComplete, { notation: "compact" })} ${pluralOf("pages", pagesComplete)}`; | ||||
|             } | ||||
| 
 | ||||
|             const pagesComplete = +(crawl.stats?.done || 0); | ||||
|             return `${this.localize.number(pagesComplete, { notation: "compact" })} / ${this.localize.number(pagesFound, { notation: "compact" })} ${pluralOf("pages", pagesFound)}`; | ||||
|           })} | ||||
|         </btrix-table-cell> | ||||
|  | ||||
| @ -859,7 +859,7 @@ export class ArchivedItemDetail extends BtrixElement { | ||||
|             ? html`${this.item.fileSize | ||||
|                 ? html`${this.localize.bytes(this.item.fileSize || 0, { | ||||
|                     unitDisplay: "narrow", | ||||
|                   })}${this.item.stats | ||||
|                   })}${this.item.stats?.done | ||||
|                     ? html`<span>,</span
 | ||||
|                         ><span | ||||
|                           class="tracking-tighter${this.isActive | ||||
| @ -873,7 +873,18 @@ export class ArchivedItemDetail extends BtrixElement { | ||||
|                         <span | ||||
|                           >${pluralOf("pages", +this.item.stats.found)}</span | ||||
|                         >` | ||||
|                     : ""}` | ||||
|                     : html`<span>,</span
 | ||||
|                         ><span> | ||||
|                           ${this.localize.number( | ||||
|                             this.item.pageCount ? +this.item.pageCount : 0, | ||||
|                           )} | ||||
|                         </span> | ||||
|                         <span | ||||
|                           >${pluralOf( | ||||
|                             "pages", | ||||
|                             this.item.pageCount ? +this.item.pageCount : 0, | ||||
|                           )}</span | ||||
|                         >`}` | ||||
|                 : html`<span class="text-0-400">${msg("Unknown")}</span>`}` | ||||
|             : html`<sl-skeleton class="h-[16px] w-24"></sl-skeleton>`} | ||||
|         </btrix-desc-list-item> | ||||
|  | ||||
| @ -28,6 +28,8 @@ type Metrics = { | ||||
|   crawlCount: number; | ||||
|   uploadCount: number; | ||||
|   pageCount: number; | ||||
|   crawlPageCount: number; | ||||
|   uploadPageCount: number; | ||||
|   profileCount: number; | ||||
|   workflowsRunningCount: number; | ||||
|   maxConcurrentCrawls: number; | ||||
| @ -236,10 +238,31 @@ export class Dashboard extends BtrixElement { | ||||
|                   pluralLabel: msg("Crawl Workflows Waiting"), | ||||
|                   iconProps: { name: "hourglass-split", color: "violet" }, | ||||
|                 })} | ||||
|                 <sl-divider | ||||
|                   style="--spacing:var(--sl-spacing-small)" | ||||
|                 ></sl-divider> | ||||
|                 ${this.renderStat({ | ||||
|                   value: metrics.pageCount, | ||||
|                   value: metrics.crawlPageCount, | ||||
|                   singleLabel: msg("Page Crawled"), | ||||
|                   pluralLabel: msg("Pages Crawled"), | ||||
|                   iconProps: { | ||||
|                     name: "file-richtext-fill", | ||||
|                     color: this.colors.crawls, | ||||
|                   }, | ||||
|                 })} | ||||
|                 ${this.renderStat({ | ||||
|                   value: metrics.uploadPageCount, | ||||
|                   singleLabel: msg("Page Uploaded"), | ||||
|                   pluralLabel: msg("Pages Uploaded"), | ||||
|                   iconProps: { | ||||
|                     name: "file-richtext-fill", | ||||
|                     color: this.colors.uploads, | ||||
|                   }, | ||||
|                 })} | ||||
|                 ${this.renderStat({ | ||||
|                   value: metrics.pageCount, | ||||
|                   singleLabel: msg("Page Total"), | ||||
|                   pluralLabel: msg("Pages Total"), | ||||
|                   iconProps: { name: "file-richtext-fill" }, | ||||
|                 })} | ||||
|               </dl> | ||||
|  | ||||
| @ -164,6 +164,7 @@ type ArchivedItemBase = { | ||||
|   activeQAStats: { done: number; found: number } | null; | ||||
|   lastQAState: CrawlState | null; | ||||
|   lastQAStarted: string | null; | ||||
|   pageCount?: number; | ||||
|   filePageCount?: number; | ||||
|   errorPageCount?: number; | ||||
| }; | ||||
|  | ||||
| @ -5,7 +5,6 @@ const childProcess = require("child_process"); | ||||
| const fs = require("fs"); | ||||
| const path = require("path"); | ||||
| 
 | ||||
| 
 | ||||
| const CopyPlugin = require("copy-webpack-plugin"); | ||||
| const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); | ||||
| const HtmlWebpackPlugin = require("html-webpack-plugin"); | ||||
|  | ||||
							
								
								
									
										98
									
								
								frontend/xliff/de.xlf
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										98
									
								
								frontend/xliff/de.xlf
									
									
									
										generated
									
									
									
								
							| @ -1597,18 +1597,6 @@ | ||||
|         <source>Are you sure you want to delete | ||||
|                 <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s777098c61f6b518a"> | ||||
|         <source>Start building your Collection.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s04200a50c7577767"> | ||||
|         <source>No Collections Found</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9f8154ea8167f3f7"> | ||||
|         <source>Organize your crawls into a Collection to easily replay them together.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s15aac264eaeac4fc"> | ||||
|         <source>Your organization doesn't have any Collections, yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7be481b712fcb089"> | ||||
|         <source>Search by Name</source> | ||||
|       </trans-unit> | ||||
| @ -1624,9 +1612,6 @@ | ||||
|       <trans-unit id="sa3242c7021e01280"> | ||||
|         <source>Row Actions</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sf0c64ac402e1e0b9"> | ||||
|         <source>No Collections Yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5ac7d4f485d82e8c"> | ||||
|         <source>Shareable Collection</source> | ||||
|       </trans-unit> | ||||
| @ -3018,7 +3003,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saf63d34c8601dd41"> | ||||
|         <source> | ||||
|           <x id="0" equiv-text="${humanizeSchedule(workflow.schedule, {
    length: "short",
})}"/> | ||||
|           <x id="0" equiv-text="${this.localize.number(this.item.pageCount ? +this.item.pageCount : 0)}"/> | ||||
|         </source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s136b21dec9a221bd"> | ||||
| @ -3861,9 +3846,6 @@ | ||||
|       <trans-unit id="s66da7b7937e76a3a"> | ||||
|         <source>Start typing a URL...</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sfedd97f6911305d1"> | ||||
|         <source>No matching pages found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7bec6de4e84e7519"> | ||||
|         <source>ReplayWeb.Page default view</source> | ||||
|       </trans-unit> | ||||
| @ -3873,9 +3855,6 @@ | ||||
|       <trans-unit id="s5d948bb5f9f0a378"> | ||||
|         <source>Show a single URL snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7cdd26a53c30f8c5"> | ||||
|         <source>Configure Replay Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s417b90913e05bc17"> | ||||
|         <source>Preview</source> | ||||
|       </trans-unit> | ||||
| @ -3992,9 +3971,6 @@ | ||||
|       <trans-unit id="s1cb226f223599f56"> | ||||
|         <source>Add items to select a home page</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s3879a0e50452a712"> | ||||
|         <source>Configure Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1f45d250722817c7"> | ||||
|         <source>Edit About Section</source> | ||||
|       </trans-unit> | ||||
| @ -4166,6 +4142,78 @@ | ||||
|         <source><x id="0" equiv-text="${dateEarliest}"/> to <x id="1" equiv-text="${dateLatest}"/></source> | ||||
|         <note from="lit-localize">Date range formatted to show full month name and year</note> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2428027aa3e49f16"> | ||||
|         <source>Last Crawl</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb9e424bd9e3e2723"> | ||||
|         <source>No Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7da138cc56abec6c"> | ||||
|         <source>Active Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="se3d7a30d5e45c393"> | ||||
|         <source>Trial</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5aff130b6d78c668"> | ||||
|         <source>Trial Cancelled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2e515f3ca456f9c6"> | ||||
|         <source>Trial Canceled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s31e12850da47731e"> | ||||
|         <source>Payment Failed</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1ebb825e892a8359"> | ||||
|         <source>Choose a snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6e8c186600b4f8a6"> | ||||
|         <source>Enter a page URL to choose snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s537d04835ef62b2b"> | ||||
|         <source>Search for a page in this collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb48ebdd9325e370b"> | ||||
|         <source>Page exists in collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s485d151771b0a33c"> | ||||
|         <source>Page not found in collection. Please check the URL and try again</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd632247a75e16736"> | ||||
|         <source>No matching page found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6bea976384dcc959"> | ||||
|         <source>Couldn't load preview. Try another snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1b5466748e5d9733"> | ||||
|         <source>Configure Replay View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8df0435252529c62"> | ||||
|         <source>Choose a page snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7239e04f3953266c"> | ||||
|         <source>Configure View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9b649a5c57384213"> | ||||
|         <source>Your org doesn’t have any collections yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sa35d8dcb231a2c75"> | ||||
|         <source>Collections let you easily organize, replay, and share multiple crawls.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd42ed7f1a573d096"> | ||||
|         <source>Page Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8a3aa1db56f18c55"> | ||||
|         <source>Pages Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saff358234fee600c"> | ||||
|         <source>Page Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1fda6e1bbcd65195"> | ||||
|         <source>Pages Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2f8856b910d3ebf8"> | ||||
|         <source>Copy Link to Profile</source> | ||||
|       </trans-unit> | ||||
|     </body> | ||||
|   </file> | ||||
| </xliff> | ||||
|  | ||||
							
								
								
									
										100
									
								
								frontend/xliff/es.xlf
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										100
									
								
								frontend/xliff/es.xlf
									
									
									
										generated
									
									
									
								
							| @ -1766,19 +1766,6 @@ | ||||
|                 <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</source> | ||||
|         <target state="translated">¿Está seguro que desea eliminar <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s777098c61f6b518a"> | ||||
|         <source>Start building your Collection.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit xml:space="preserve" id="s04200a50c7577767"> | ||||
|         <source>No Collections Found</source> | ||||
|         <target state="translated">No se han encontrado colecciones</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9f8154ea8167f3f7"> | ||||
|         <source>Organize your crawls into a Collection to easily replay them together.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s15aac264eaeac4fc"> | ||||
|         <source>Your organization doesn't have any Collections, yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit xml:space="preserve" id="s7be481b712fcb089"> | ||||
|         <source>Search by Name</source> | ||||
|         <target state="translated">Buscar por nombre</target> | ||||
| @ -1797,10 +1784,6 @@ | ||||
|       <trans-unit id="sa3242c7021e01280"> | ||||
|         <source>Row Actions</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit xml:space="preserve" id="sf0c64ac402e1e0b9"> | ||||
|         <source>No Collections Yet.</source> | ||||
|         <target state="translated">Aún no hay colecciones.</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit xml:space="preserve" id="s5ac7d4f485d82e8c"> | ||||
|         <source>Shareable Collection</source> | ||||
|         <target state="translated">Colección compartible</target> | ||||
| @ -3273,7 +3256,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit xml:space="preserve" id="saf63d34c8601dd41"> | ||||
|         <source> | ||||
|           <x id="0" equiv-text="${humanizeSchedule(workflow.schedule, {
    length: "short",
})}"/> | ||||
|           <x id="0" equiv-text="${this.localize.number(this.item.pageCount ? +this.item.pageCount : 0)}"/> | ||||
|         </source> | ||||
|         <target state="translated"> | ||||
|           <x id="0" equiv-text="${humanizeSchedule(workflow.schedule, {
    length: "short",
})}"/> | ||||
| @ -4501,9 +4484,6 @@ | ||||
|       <trans-unit id="s66da7b7937e76a3a"> | ||||
|         <source>Start typing a URL...</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sfedd97f6911305d1"> | ||||
|         <source>No matching pages found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7bec6de4e84e7519"> | ||||
|         <source>ReplayWeb.Page default view</source> | ||||
|       </trans-unit> | ||||
| @ -4513,9 +4493,6 @@ | ||||
|       <trans-unit id="s5d948bb5f9f0a378"> | ||||
|         <source>Show a single URL snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7cdd26a53c30f8c5"> | ||||
|         <source>Configure Replay Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s417b90913e05bc17"> | ||||
|         <source>Preview</source> | ||||
|       </trans-unit> | ||||
| @ -4632,9 +4609,6 @@ | ||||
|       <trans-unit id="s1cb226f223599f56"> | ||||
|         <source>Add items to select a home page</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s3879a0e50452a712"> | ||||
|         <source>Configure Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1f45d250722817c7"> | ||||
|         <source>Edit About Section</source> | ||||
|       </trans-unit> | ||||
| @ -4806,6 +4780,78 @@ | ||||
|         <source><x id="0" equiv-text="${dateEarliest}"/> to <x id="1" equiv-text="${dateLatest}"/></source> | ||||
|         <note from="lit-localize">Date range formatted to show full month name and year</note> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2428027aa3e49f16"> | ||||
|         <source>Last Crawl</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb9e424bd9e3e2723"> | ||||
|         <source>No Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7da138cc56abec6c"> | ||||
|         <source>Active Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="se3d7a30d5e45c393"> | ||||
|         <source>Trial</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5aff130b6d78c668"> | ||||
|         <source>Trial Cancelled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2e515f3ca456f9c6"> | ||||
|         <source>Trial Canceled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s31e12850da47731e"> | ||||
|         <source>Payment Failed</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1ebb825e892a8359"> | ||||
|         <source>Choose a snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6e8c186600b4f8a6"> | ||||
|         <source>Enter a page URL to choose snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s537d04835ef62b2b"> | ||||
|         <source>Search for a page in this collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb48ebdd9325e370b"> | ||||
|         <source>Page exists in collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s485d151771b0a33c"> | ||||
|         <source>Page not found in collection. Please check the URL and try again</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd632247a75e16736"> | ||||
|         <source>No matching page found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6bea976384dcc959"> | ||||
|         <source>Couldn't load preview. Try another snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1b5466748e5d9733"> | ||||
|         <source>Configure Replay View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8df0435252529c62"> | ||||
|         <source>Choose a page snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7239e04f3953266c"> | ||||
|         <source>Configure View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9b649a5c57384213"> | ||||
|         <source>Your org doesn’t have any collections yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sa35d8dcb231a2c75"> | ||||
|         <source>Collections let you easily organize, replay, and share multiple crawls.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd42ed7f1a573d096"> | ||||
|         <source>Page Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8a3aa1db56f18c55"> | ||||
|         <source>Pages Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saff358234fee600c"> | ||||
|         <source>Page Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1fda6e1bbcd65195"> | ||||
|         <source>Pages Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2f8856b910d3ebf8"> | ||||
|         <source>Copy Link to Profile</source> | ||||
|       </trans-unit> | ||||
|     </body> | ||||
|   </file> | ||||
| </xliff> | ||||
|  | ||||
							
								
								
									
										103
									
								
								frontend/xliff/fr.xlf
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										103
									
								
								frontend/xliff/fr.xlf
									
									
									
										generated
									
									
									
								
							| @ -2125,22 +2125,6 @@ | ||||
|                 <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</source> | ||||
|         <target state="translated">Êtes-vous certain de vouloir supprimer <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s777098c61f6b518a" xml:space="preserve"> | ||||
|         <source>Start building your Collection.</source> | ||||
|         <target state="translated">Démarrer la création de la collection.</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s04200a50c7577767" xml:space="preserve"> | ||||
|         <source>No Collections Found</source> | ||||
|         <target state="translated">Aucune collection trouvée</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9f8154ea8167f3f7" xml:space="preserve"> | ||||
|         <source>Organize your crawls into a Collection to easily replay them together.</source> | ||||
|         <target state="translated">Organiser vos collectes en collection pour pouvoir les rejouer ensemble.</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s15aac264eaeac4fc" xml:space="preserve"> | ||||
|         <source>Your organization doesn't have any Collections, yet.</source> | ||||
|         <target state="translated">Votre organisation ne détient aucune collection présentement.</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7be481b712fcb089" xml:space="preserve"> | ||||
|         <source>Search by Name</source> | ||||
|         <target state="translated">Rechercher par nom</target> | ||||
| @ -2161,10 +2145,6 @@ | ||||
|         <source>Row Actions</source> | ||||
|         <target state="translated">Rangée actions</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sf0c64ac402e1e0b9" xml:space="preserve"> | ||||
|         <source>No Collections Yet.</source> | ||||
|         <target state="translated">Aucune collection jusqu'à présent.</target> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5ac7d4f485d82e8c" xml:space="preserve"> | ||||
|         <source>Shareable Collection</source> | ||||
|         <target state="translated">Collection partageable</target> | ||||
| @ -3782,7 +3762,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saf63d34c8601dd41"> | ||||
|         <source> | ||||
|           <x id="0" equiv-text="${humanizeSchedule(workflow.schedule, {
    length: "short",
})}"/> | ||||
|           <x id="0" equiv-text="${this.localize.number(this.item.pageCount ? +this.item.pageCount : 0)}"/> | ||||
|         </source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s136b21dec9a221bd"> | ||||
| @ -4625,9 +4605,6 @@ | ||||
|       <trans-unit id="s66da7b7937e76a3a"> | ||||
|         <source>Start typing a URL...</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sfedd97f6911305d1"> | ||||
|         <source>No matching pages found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7bec6de4e84e7519"> | ||||
|         <source>ReplayWeb.Page default view</source> | ||||
|       </trans-unit> | ||||
| @ -4637,9 +4614,6 @@ | ||||
|       <trans-unit id="s5d948bb5f9f0a378"> | ||||
|         <source>Show a single URL snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7cdd26a53c30f8c5"> | ||||
|         <source>Configure Replay Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s417b90913e05bc17"> | ||||
|         <source>Preview</source> | ||||
|       </trans-unit> | ||||
| @ -4756,9 +4730,6 @@ | ||||
|       <trans-unit id="s1cb226f223599f56"> | ||||
|         <source>Add items to select a home page</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s3879a0e50452a712"> | ||||
|         <source>Configure Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1f45d250722817c7"> | ||||
|         <source>Edit About Section</source> | ||||
|       </trans-unit> | ||||
| @ -4930,6 +4901,78 @@ | ||||
|         <source><x id="0" equiv-text="${dateEarliest}"/> to <x id="1" equiv-text="${dateLatest}"/></source> | ||||
|         <note from="lit-localize">Date range formatted to show full month name and year</note> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2428027aa3e49f16"> | ||||
|         <source>Last Crawl</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb9e424bd9e3e2723"> | ||||
|         <source>No Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7da138cc56abec6c"> | ||||
|         <source>Active Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="se3d7a30d5e45c393"> | ||||
|         <source>Trial</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5aff130b6d78c668"> | ||||
|         <source>Trial Cancelled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2e515f3ca456f9c6"> | ||||
|         <source>Trial Canceled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s31e12850da47731e"> | ||||
|         <source>Payment Failed</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1ebb825e892a8359"> | ||||
|         <source>Choose a snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6e8c186600b4f8a6"> | ||||
|         <source>Enter a page URL to choose snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s537d04835ef62b2b"> | ||||
|         <source>Search for a page in this collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb48ebdd9325e370b"> | ||||
|         <source>Page exists in collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s485d151771b0a33c"> | ||||
|         <source>Page not found in collection. Please check the URL and try again</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd632247a75e16736"> | ||||
|         <source>No matching page found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6bea976384dcc959"> | ||||
|         <source>Couldn't load preview. Try another snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1b5466748e5d9733"> | ||||
|         <source>Configure Replay View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8df0435252529c62"> | ||||
|         <source>Choose a page snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7239e04f3953266c"> | ||||
|         <source>Configure View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9b649a5c57384213"> | ||||
|         <source>Your org doesn’t have any collections yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sa35d8dcb231a2c75"> | ||||
|         <source>Collections let you easily organize, replay, and share multiple crawls.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd42ed7f1a573d096"> | ||||
|         <source>Page Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8a3aa1db56f18c55"> | ||||
|         <source>Pages Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saff358234fee600c"> | ||||
|         <source>Page Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1fda6e1bbcd65195"> | ||||
|         <source>Pages Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2f8856b910d3ebf8"> | ||||
|         <source>Copy Link to Profile</source> | ||||
|       </trans-unit> | ||||
|     </body> | ||||
|   </file> | ||||
| </xliff> | ||||
|  | ||||
							
								
								
									
										98
									
								
								frontend/xliff/pt.xlf
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										98
									
								
								frontend/xliff/pt.xlf
									
									
									
										generated
									
									
									
								
							| @ -1597,18 +1597,6 @@ | ||||
|         <source>Are you sure you want to delete | ||||
|                 <x id="0" equiv-text="<strong>${this.selectedCollection?.name}</strong>"/>?</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s777098c61f6b518a"> | ||||
|         <source>Start building your Collection.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s04200a50c7577767"> | ||||
|         <source>No Collections Found</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9f8154ea8167f3f7"> | ||||
|         <source>Organize your crawls into a Collection to easily replay them together.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s15aac264eaeac4fc"> | ||||
|         <source>Your organization doesn't have any Collections, yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7be481b712fcb089"> | ||||
|         <source>Search by Name</source> | ||||
|       </trans-unit> | ||||
| @ -1624,9 +1612,6 @@ | ||||
|       <trans-unit id="sa3242c7021e01280"> | ||||
|         <source>Row Actions</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sf0c64ac402e1e0b9"> | ||||
|         <source>No Collections Yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5ac7d4f485d82e8c"> | ||||
|         <source>Shareable Collection</source> | ||||
|       </trans-unit> | ||||
| @ -3018,7 +3003,7 @@ | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saf63d34c8601dd41"> | ||||
|         <source> | ||||
|           <x id="0" equiv-text="${humanizeSchedule(workflow.schedule, {
    length: "short",
})}"/> | ||||
|           <x id="0" equiv-text="${this.localize.number(this.item.pageCount ? +this.item.pageCount : 0)}"/> | ||||
|         </source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s136b21dec9a221bd"> | ||||
| @ -3861,9 +3846,6 @@ | ||||
|       <trans-unit id="s66da7b7937e76a3a"> | ||||
|         <source>Start typing a URL...</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sfedd97f6911305d1"> | ||||
|         <source>No matching pages found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7bec6de4e84e7519"> | ||||
|         <source>ReplayWeb.Page default view</source> | ||||
|       </trans-unit> | ||||
| @ -3873,9 +3855,6 @@ | ||||
|       <trans-unit id="s5d948bb5f9f0a378"> | ||||
|         <source>Show a single URL snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7cdd26a53c30f8c5"> | ||||
|         <source>Configure Replay Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s417b90913e05bc17"> | ||||
|         <source>Preview</source> | ||||
|       </trans-unit> | ||||
| @ -3992,9 +3971,6 @@ | ||||
|       <trans-unit id="s1cb226f223599f56"> | ||||
|         <source>Add items to select a home page</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s3879a0e50452a712"> | ||||
|         <source>Configure Home</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1f45d250722817c7"> | ||||
|         <source>Edit About Section</source> | ||||
|       </trans-unit> | ||||
| @ -4166,6 +4142,78 @@ | ||||
|         <source><x id="0" equiv-text="${dateEarliest}"/> to <x id="1" equiv-text="${dateLatest}"/></source> | ||||
|         <note from="lit-localize">Date range formatted to show full month name and year</note> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2428027aa3e49f16"> | ||||
|         <source>Last Crawl</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb9e424bd9e3e2723"> | ||||
|         <source>No Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7da138cc56abec6c"> | ||||
|         <source>Active Subscription</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="se3d7a30d5e45c393"> | ||||
|         <source>Trial</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s5aff130b6d78c668"> | ||||
|         <source>Trial Cancelled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2e515f3ca456f9c6"> | ||||
|         <source>Trial Canceled</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s31e12850da47731e"> | ||||
|         <source>Payment Failed</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1ebb825e892a8359"> | ||||
|         <source>Choose a snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6e8c186600b4f8a6"> | ||||
|         <source>Enter a page URL to choose snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s537d04835ef62b2b"> | ||||
|         <source>Search for a page in this collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sb48ebdd9325e370b"> | ||||
|         <source>Page exists in collection</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s485d151771b0a33c"> | ||||
|         <source>Page not found in collection. Please check the URL and try again</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd632247a75e16736"> | ||||
|         <source>No matching page found.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s6bea976384dcc959"> | ||||
|         <source>Couldn't load preview. Try another snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1b5466748e5d9733"> | ||||
|         <source>Configure Replay View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8df0435252529c62"> | ||||
|         <source>Choose a page snapshot</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s7239e04f3953266c"> | ||||
|         <source>Configure View</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s9b649a5c57384213"> | ||||
|         <source>Your org doesn’t have any collections yet.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sa35d8dcb231a2c75"> | ||||
|         <source>Collections let you easily organize, replay, and share multiple crawls.</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="sd42ed7f1a573d096"> | ||||
|         <source>Page Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s8a3aa1db56f18c55"> | ||||
|         <source>Pages Uploaded</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="saff358234fee600c"> | ||||
|         <source>Page Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s1fda6e1bbcd65195"> | ||||
|         <source>Pages Total</source> | ||||
|       </trans-unit> | ||||
|       <trans-unit id="s2f8856b910d3ebf8"> | ||||
|         <source>Copy Link to Profile</source> | ||||
|       </trans-unit> | ||||
|     </body> | ||||
|   </file> | ||||
| </xliff> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user