### Start Development Server for Sitefinity Extensions Source: https://github.com/sitefinity/sitefinity-admin-app-extensions/blob/master/README.md Starts the development server for the Sitefinity Admin App Extensions. This allows for live reloading and testing of your extensions during development. Requires Node.js and npm to be installed. ```shell npm start ``` -------------------------------- ### Development Server and Build Commands Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Manage the development workflow for Sitefinity Admin App extensions using npm commands. Includes commands for installing dependencies, starting a hot-reloading development server, building development and production bundles, and running code linters. ```bash # Install dependencies npm install # Start development server on http://localhost:3000 npm start # Build development bundle npm run build # Output: dist/sample.extensions.bundle.js # Build minified production bundle (Sitefinity >= 11.1) npm run build:prod # Run ESLint on code npm run lint # Fix ESLint errors automatically npm run lint:fix # Update samples submodule npm run submodule:update ``` -------------------------------- ### Install npm Packages for Sitefinity Extensions Source: https://github.com/sitefinity/sitefinity-admin-app-extensions/blob/master/README.md Installs all the necessary npm packages required for developing Sitefinity Admin App extensions. This command should be executed in the root folder of the cloned repository. If version conflicts occur, 'npm install -f' can be used. ```shell npm install ``` -------------------------------- ### Clone Sitefinity Admin App Extensions Repository Source: https://github.com/sitefinity/sitefinity-admin-app-extensions/blob/master/README.md This command clones the Sitefinity Admin App Extensions repository and its submodules. It's the first step in setting up the development environment. Ensure you have Git installed. ```shell git clone https://github.com/Sitefinity/sitefinity-admin-app-extensions --recurse-submodules ``` -------------------------------- ### Custom Dialogs with Sitefinity Admin App SDK Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Integrate custom dialogs for content selection, data entry, or user interactions using the SelectorService. This example demonstrates opening a video selector dialog with specific configurations for content type and provider. ```typescript import { Injectable } from '@angular/core'; import { SelectorService } from '@progress/sitefinity-adminapp-sdk/app/api/v1'; @Injectable() export class VideoSelectorService { constructor(private selectorService: SelectorService) {} openVideoSelector() { const dialogConfig = { title: 'Select Video', width: '800px', height: '600px', data: { contentType: 'Telerik.Sitefinity.Libraries.Model.Video', provider: 'OpenAccessDataProvider' } }; this.selectorService.openDialog(dialogConfig).subscribe( selectedItems => { if (selectedItems && selectedItems.length > 0) { console.log('Selected video:', selectedItems[0]); // Process selected video } }, error => { console.error('Dialog error:', error); } ); } } ``` -------------------------------- ### Access Sitefinity OData Services with Angular HttpClient Source: https://github.com/sitefinity/sitefinity-admin-app-extensions/blob/master/README.md This snippet demonstrates how to access Sitefinity CMS OData services using Angular's HttpClient. It utilizes the HTTP_PREFIX constant to ensure proper authentication for backend services. The example fetches all news items. ```typescript const url = `${HTTP_PREFIX}/sf/system/newsitems`; this.http.get(url).subscribe(response => { /* do work */ }); ``` -------------------------------- ### Implement Fields Binding Service in Sitefinity Admin App Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Demonstrates how to create a service that binds fields together, allowing dynamic updates to field values, visibility, or settings based on changes in related fields. This example uses Angular and the Sitefinity Admin App SDK. ```typescript import { Injectable } from '@angular/core'; import { FieldsChangeService } from '@progress/sitefinity-adminapp-sdk/app/api/v1'; @Injectable() export class CustomFieldsChangeService implements FieldsChangeService { handleFieldChange(changedField: any, allFields: any[]) { if (changedField.name === 'Category') { const subcategoryField = allFields.find(f => f.name === 'Subcategory'); if (subcategoryField) { if (changedField.value === 'Technology') { subcategoryField.visible = true; subcategoryField.options = [ { value: 'Software', label: 'Software' }, { value: 'Hardware', label: 'Hardware' } ]; } else { subcategoryField.visible = false; subcategoryField.value = null; } } } } } ``` -------------------------------- ### Access OData Services in Sitefinity Admin App Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Provides an example of accessing Sitefinity CMS backend OData services using Angular's HttpClient. It utilizes the `HTTP_PREFIX` constant for authentication and demonstrates methods for fetching all news items and a specific news item by its ID. This allows programmatic retrieval and manipulation of CMS content. ```typescript import { HttpClient } from '@angular/common/http'; import { HTTP_PREFIX } from '@progress/sitefinity-adminapp-sdk/app/v1'; export class NewsService { constructor(private http: HttpClient) {} getAllNewsItems() { const url = `${HTTP_PREFIX}/sf/system/newsitems`; return this.http.get(url).subscribe( response => { console.log('News items:', response); // Process news items }, error => { console.error('Failed to fetch news:', error); } ); } getNewsItemById(id: string) { const url = `${HTTP_PREFIX}/sf/system/newsitems(${id})`; return this.http.get(url); } } ``` -------------------------------- ### Custom Grid Columns with Sitefinity Admin App SDK Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Enhance content grids by adding custom columns to display additional information. This example shows how to create custom columns for 'Status' with conditional styling and 'Images' count, utilizing custom cell rendering logic. ```typescript import { Injectable } from '@angular/core'; import { GridColumnProvider } from '@progress/sitefinity-adminapp-sdk/app/api/v1'; @Injectable() export class CustomGridColumnProvider implements GridColumnProvider { getColumns() { return [ { field: 'CustomStatus', title: 'Status', width: 150, cell: (dataItem: any) => { const status = dataItem.Status; const cssClass = status === 'Published' ? 'status-published' : 'status-draft'; return `${status}`; } }, { field: 'ImageCount', title: 'Images', width: 100, cell: (dataItem: any) => { const count = dataItem.RelatedImages?.length || 0; return `${count}`; } } ]; } } ``` -------------------------------- ### Create Custom Widget Editor in Sitefinity Admin App Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Shows how to create a custom widget designer to override the default auto-generated property editors in the Sitefinity page editor. This example uses Angular and the Sitefinity Admin App SDK, demonstrating how to extend the WidgetEditorBase class and register the custom editor. ```typescript import { Component } from '@angular/core'; import { WidgetEditorBase } from '@progress/sitefinity-adminapp-sdk/app/api/v1'; @Component({ selector: 'custom-widget-editor', template: `
` }) export class CustomWidgetEditor extends WidgetEditorBase { onPropertyChange() { this.notifyPropertiesChanged(this.properties); } } // Register for specific widget type { provide: WIDGET_EDITOR_TOKEN, useClass: CustomWidgetEditor, multi: true, widgetName: 'MyCustomWidget' } ``` -------------------------------- ### Register Custom Fields in Sitefinity Admin App Source: https://context7.com/sitefinity/sitefinity-admin-app-extensions/llms.txt Explains how to create and register custom field components for Sitefinity content editing forms. These custom fields can replace default input controls, offering specialized validation and user experiences. The example shows a custom color picker field extending `FieldBase` and registering using `FIELD_TOKEN`. ```typescript import { Component, OnInit } from '@angular/core'; import { FieldBase } from '@progress/sitefinity-adminapp-sdk/app/v1'; @Component({ selector: 'custom-color-picker', template: `