{"version":3,"file":"pba-core.umd.cjs","sources":["../src/api/client.ts","../src/api/accounts.ts","../src/api/asrunLog.ts","../src/api/auditLog.ts","../src/api/breakPatterns.ts","../src/api/configComponents.ts","../src/api/dashboard.ts","../src/api/events.ts","../src/api/folders.ts","../src/api/files.ts","../src/api/graphicPages.ts","../src/api/htmlTemplates.ts","../src/api/jobs.ts","../src/api/onAirLayers.ts","../src/api/playout.ts","../src/api/recordings.ts","../src/api/rules.ts","../src/api/schedItems.ts","../src/api/schedPatterns.ts","../src/api/schedules.ts","../src/api/servers.ts","../src/api/socialSites.ts","../src/api/stamps.ts","../src/api/subtitles.ts","../src/api/tasks.ts","../src/api/templates.ts","../src/api/textFormats.ts","../src/api/tickerFeeds.ts","../src/api/transfers.ts","../src/api/unitTest.ts","../src/api/v2.ts","../src/api/workflows.ts","../src/connection/types.ts","../src/connection/monitor.ts","../src/connection/guardedEndpoints.ts","../src/signalr/connection.ts","../src/utils/validation.ts","../src/utils/filters.ts","../src/utils/formatters.ts","../src/utils/FilterDate.ts","../src/utils/strings.ts","../src/utils/mimeTypes.ts","../src/utils/auth.ts","../src/utils/mediaTypes.ts","../src/utils/playout.ts","../src/utils/selection.ts","../src/utils/pagination.ts","../src/utils/progress.ts","../src/utils/schedItemTypes.ts","../src/utils/queryBuilder.ts","../src/utils/ordering.ts","../src/utils/storage.ts","../src/utils/semaphore.ts","../src/utils/taskQueue.ts","../src/utils/openglProperties.ts","../src/utils/oauthUrls.ts","../src/utils/audioLevel.ts","../src/utils/timeSyncModel.ts","../src/utils/cssClasses.ts","../src/utils/rowStyles.ts","../src/utils/timeBreaks.ts","../src/utils/gradients.ts","../src/utils/durationValidation.ts","../src/utils/objects.ts","../src/constants/enums.ts","../src/constants/config.ts","../src/routes/types.ts","../src/routes/routeConfig.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosError, AxiosRequestConfig } from 'axios';\r\n\r\n/** Default request timeout (ms) used when PbaClientConfig.timeout is not supplied. */\r\nexport const DEFAULT_API_TIMEOUT_MS = 30_000;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Standard PBA API success/error envelope. */\r\nexport interface ApiResult {\r\n success: boolean;\r\n output?: string;\r\n message?: string;\r\n data?: T;\r\n}\r\n\r\n/** Shape returned by the server on errors. */\r\nexport interface ApiErrorBody {\r\n errors?: Record;\r\n ExceptionMessage?: string;\r\n Message?: string;\r\n message?: string;\r\n MessageDetail?: string;\r\n}\r\n\r\n/** Configuration for the PBA API client. */\r\nexport interface PbaClientConfig {\r\n /** Base URL of the webserver API (e.g. \"http://localhost:1971/pba/api\"). */\r\n baseUrl: string;\r\n /** Base URL of the portal API. */\r\n portalBaseUrl: string;\r\n /** Return the current JWT token (called on every request). */\r\n getToken?: () => string | null;\r\n /** Return the current SignalR connection ID (called on every request). */\r\n getSignalRClientId?: () => string | null;\r\n /** Called when a request returns 401 Unauthorized. */\r\n onUnauthorized?: () => void;\r\n /** Called after every successful response (e.g. to trigger framework digest cycle). */\r\n onResponse?: () => void;\r\n /** Called after every failed response (e.g. to show default error alert). Receives the parsed error message. */\r\n onResponseError?: (errorMessage: string) => void;\r\n /** Request timeout in milliseconds (default: 30 000). */\r\n timeout?: number;\r\n /**\r\n * Veto a request before it is sent (SCP-1118). Return a refusal reason to block\r\n * it, or null/undefined to allow it.\r\n *\r\n * This is the single enforcement point for the playout command guard: every\r\n * app-server call in the AngularJS app goes through this client — the typed\r\n * domain methods and the raw postData/postDataSync/postFile helpers alike — so a\r\n * veto here cannot be bypassed by a call site, a context menu or a hotkey.\r\n *\r\n * A blocked request rejects immediately with `PbaRequestBlockedError`. It is\r\n * never queued or retried: a playout command that fired after recovery would put\r\n * the wrong item to air.\r\n *\r\n * Applies to the main API only, not the portal API.\r\n */\r\n canDispatch?: (url: string, method: string) => string | null | undefined;\r\n}\r\n\r\n/**\r\n * Thrown when `canDispatch` vetoes a request. Carries the refusal reason so the\r\n * consumer can explain it once, rather than per attempt.\r\n */\r\nexport class PbaRequestBlockedError extends Error {\r\n readonly isRequestBlocked = true;\r\n readonly url: string;\r\n readonly method: string;\r\n\r\n constructor(reason: string, url: string, method: string) {\r\n super(reason);\r\n this.name = 'PbaRequestBlockedError';\r\n this.url = url;\r\n this.method = method;\r\n }\r\n}\r\n\r\n/** Type guard for a request refused by `canDispatch`. */\r\nexport function isRequestBlockedError(error: unknown): error is PbaRequestBlockedError {\r\n return !!error && (error as PbaRequestBlockedError).isRequestBlocked === true;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Error parsing (mirrors getErrorMessage in factoriesService.js)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Extract a human-readable error message from an axios error (or any thrown value). */\r\n\r\nfunction fromApiError(body: ApiErrorBody){\r\n if (body.errors) return JSON.stringify(body.errors, null, 2);\r\n return body.ExceptionMessage || body.Message || body.message || body.MessageDetail || String(body);\r\n}\r\nexport function getErrorMessage(data: string | { config?: { url?: string }, message: string } | { config?: { url?: string }, response: { data: ApiErrorBody } }): string {\r\n // typechecking (including the try-catch)\r\n // should not be needed once the entire codebase is TS, but i don't know what some random old code decides to pass here\r\n if (!data) return \"unnown error 1\";\r\n // A command refused by canDispatch has no request config, so the generic\r\n // \"error at []\" framing below would render as \"error at [unknown path]\".\r\n // Its message is already written for the operator — pass it through as-is.\r\n if (isRequestBlockedError(data)) return data.message;\r\n try {\r\n if (typeof data === 'string') return data;\r\n let url = \"error at [\" + (data.config?.url ?? \"unknown path\") + \"]: \"\r\n if (\"message\" in data) return url + data.message;\r\n return url + fromApiError(data.response.data);\r\n } catch {\r\n return \"unexpected error code: \" + JSON.stringify(data);\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Client class\r\n// ---------------------------------------------------------------------------\r\n\r\nexport class PbaApiClient {\r\n readonly http: AxiosInstance;\r\n readonly portalHttp: AxiosInstance | null;\r\n private cfg: PbaClientConfig;\r\n\r\n constructor(config: PbaClientConfig) {\r\n this.cfg = config;\r\n\r\n // ---- Main API instance ------------------------------------------------\r\n this.http = axios.create({\r\n baseURL: config.baseUrl,\r\n timeout: config.timeout ?? DEFAULT_API_TIMEOUT_MS,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n\r\n this.http.interceptors.request.use((req) => {\r\n // Playout command guard (SCP-1118). Checked first, so a blocked command\r\n // never reaches the network and never carries credentials.\r\n if (config.canDispatch) {\r\n const reason = config.canDispatch(req.url ?? '', (req.method ?? 'get').toUpperCase());\r\n if (reason) {\r\n throw new PbaRequestBlockedError(reason, req.url ?? '', (req.method ?? 'get').toUpperCase());\r\n }\r\n }\r\n\r\n const token = config.getToken?.();\r\n if (token) {\r\n req.headers.Authorization = `Bearer ${token}`;\r\n }\r\n const clientId = config.getSignalRClientId?.();\r\n if (clientId) {\r\n req.headers['SignalR-ClientID'] = clientId;\r\n }\r\n return req;\r\n });\r\n\r\n this.http.interceptors.response.use(\r\n (res) => {\r\n config.onResponse?.();\r\n return res;\r\n },\r\n (err: AxiosError) => {\r\n // A request vetoed by canDispatch travels this same chain, because axios\r\n // runs request-interceptor failures through the response handlers. It must\r\n // NOT raise the default error alert: the consumer explains a blocked\r\n // playout command once, not once per button press (SCP-1118).\r\n if (isRequestBlockedError(err)) {\r\n config.onResponse?.();\r\n return Promise.reject(err);\r\n }\r\n\r\n if (err.response?.status === 401) {\r\n config.onUnauthorized?.();\r\n } else {\r\n config.onResponseError?.(getErrorMessage(err));\r\n }\r\n config.onResponse?.();\r\n return Promise.reject(err);\r\n },\r\n );\r\n\r\n // ---- Portal API instance (optional) -----------------------------------\r\n if (config.portalBaseUrl) {\r\n this.portalHttp = axios.create({\r\n baseURL: config.portalBaseUrl,\r\n timeout: config.timeout ?? DEFAULT_API_TIMEOUT_MS,\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n\r\n this.portalHttp.interceptors.request.use((req) => {\r\n const token = config.getToken?.();\r\n if (token) {\r\n req.headers.Authorization = `Bearer ${token}`;\r\n }\r\n return req;\r\n });\r\n\r\n this.portalHttp.interceptors.response.use(\r\n (res) => {\r\n config.onResponse?.();\r\n return res;\r\n },\r\n (err: AxiosError) => {\r\n if (err.response?.status === 401) {\r\n config.onUnauthorized?.();\r\n } else {\r\n config.onResponseError?.(getErrorMessage(err));\r\n }\r\n config.onResponse?.();\r\n return Promise.reject(err);\r\n },\r\n );\r\n } else {\r\n this.portalHttp = null;\r\n }\r\n }\r\n\r\n // ---- Core HTTP helpers --------------------------------------------------\r\n\r\n /** POST JSON to the main API. Always sends a body to ensure Content-Type is set. */\r\n async post(url: string, data?: unknown): Promise {\r\n const res = await this.http.post(url, data ?? null);\r\n return res.data;\r\n }\r\n\r\n /** GET from the main API. */\r\n async get(url: string, config?: AxiosRequestConfig): Promise {\r\n const res = await this.http.get(url, config);\r\n return res.data;\r\n }\r\n\r\n /** DELETE on the main API. */\r\n async delete(url: string): Promise {\r\n const res = await this.http.delete(url);\r\n return res.data;\r\n }\r\n\r\n /** POST multipart/form-data (file upload) to the main API. */\r\n async postFile(url: string, formData: FormData): Promise {\r\n const res = await this.http.post(url, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data' },\r\n });\r\n return res.data;\r\n }\r\n\r\n /** POST JSON to a remote PBA server (e.g. for cross-server commands). */\r\n async postRemote(serverAddress: string, url: string, data?: unknown): Promise {\r\n const token = this.cfg.getToken?.();\r\n const headers: Record = { 'Content-Type': 'application/json' };\r\n if (token) {\r\n headers.Authorization = `Bearer ${token}`;\r\n }\r\n const res = await axios.post(`http://${serverAddress}/pba/api${url}`, data, {\r\n headers,\r\n timeout: this.cfg.timeout ?? DEFAULT_API_TIMEOUT_MS,\r\n });\r\n return res.data;\r\n }\r\n\r\n // ---- Portal helpers -----------------------------------------------------\r\n\r\n /** POST JSON to the portal API. */\r\n async portalPost(url: string, data?: unknown): Promise {\r\n if (!this.portalHttp) throw new Error('Portal API not configured');\r\n const res = await this.portalHttp.post(url, data ?? null);\r\n return res.data;\r\n }\r\n\r\n /** GET from the portal API. */\r\n async portalGet(url: string): Promise {\r\n if (!this.portalHttp) throw new Error('Portal API not configured');\r\n const res = await this.portalHttp.get(url);\r\n return res.data;\r\n }\r\n\r\n /** POST multipart/form-data to the portal API. */\r\n async portalPostFile(url: string, formData: FormData): Promise {\r\n if (!this.portalHttp) throw new Error('Portal API not configured');\r\n const res = await this.portalHttp.post(url, formData, {\r\n headers: { 'Content-Type': 'multipart/form-data' },\r\n });\r\n return res.data;\r\n }\r\n\r\n /** Build a download URL on the main API (for window.open / file-save). */\r\n getDownloadUrl(path: string): string {\r\n return `${this.cfg.baseUrl}${path}`;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Singleton helper\r\n// ---------------------------------------------------------------------------\r\n\r\nlet _defaultClient: PbaApiClient | null = null;\r\n\r\n/** Initialise the default (singleton) PBA API client. Call once at app startup. */\r\nexport function initApiClient(config: PbaClientConfig): PbaApiClient {\r\n _defaultClient = new PbaApiClient(config);\r\n return _defaultClient;\r\n}\r\n\r\n/** Get the default PBA API client. Throws if not yet initialised. */\r\nexport function getApiClient(): PbaApiClient {\r\n if (!_defaultClient) {\r\n throw new Error('PBA API client not initialised. Call initApiClient() first.');\r\n }\r\n return _defaultClient;\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const ACCOUNT_URLS = {\r\n INDEX: '/Account/index',\r\n INDEX_DETAIL: '/Account/indexDetail',\r\n DETAIL: '/Account/detail',\r\n MY_DETAIL: '/Account/myDetail',\r\n SAVE: '/Account/save',\r\n DELETE: '/Account/delete',\r\n HARD_DELETE: '/Account/harddelete',\r\n COPY: '/Account/copy',\r\n VALIDATE: '/Account/validate',\r\n INIT: '/Account/init',\r\n CREATE_LINK: '/Account/createlink',\r\n INIT_GENRE: '/Account/initGenre',\r\n INIT_LANGUAGE: '/Account/initLanguage',\r\n INIT_COUNTRY: '/Account/initCountry',\r\n GENRE: '/Account/genre',\r\n GENRE_SUB: '/Account/genre?subGenreOnly=true',\r\n LANGUAGE: '/Account/language',\r\n COUNTRY: '/Account/country',\r\n PARENTAL_GUIDANCE: '/Account/parentalGuidance',\r\n CREDENTIAL_TARGETS: '/Account/credentialTargets',\r\n TEMPLATES: '/Account/templates/',\r\n TEMPLATES_ALL: '/Account/templates/0',\r\n SAVE_TEMPLATE: '/Account/saveTemplate',\r\n DELETE_TEMPLATE: '/Account/deleteTemplate',\r\n GET_TEMPLATE: '/Account/getTemplate/',\r\n HAS_NDI_MULTIVIEWER: '/Account/HasNDImultiviewer',\r\n NDI_MULTIVIEWER_CONFIG: '/Account/NDImultiviewerConfig',\r\n NDI_MULTIVIEWER_INIT: '/Account/NDImultiviewerInit',\r\n NDI_MULTIVIEWER_CLEAR: '/Account/NDImultiviewerClear',\r\n INFO: '/Account/info',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Account extends EntityBase {\r\n AccountID?: number | null;\r\n NameNM?: string;\r\n UniqueID?: string;\r\n IsActive?: boolean;\r\n IsMine?: boolean;\r\n SpaceLimitFmt?: string;\r\n AccountDriveSpace?: number | null;\r\n AccountDriveSpaceFmt?: string;\r\n CredentialStorages?: CredentialStorage[];\r\n}\r\n\r\nexport interface CredentialStorage {\r\n CredentialStorageID?: number | null;\r\n AccountID?: number | null;\r\n Target?: string;\r\n UserName?: string;\r\n Password?: string;\r\n}\r\n\r\nexport interface XlsTemplate {\r\n XlsTemplateID?: number | null;\r\n AccountID?: number | null;\r\n NameNM?: string;\r\n Description?: string;\r\n}\r\n\r\nexport interface GenreItem extends SelectItem {\r\n GenreID?: number;\r\n}\r\n\r\nexport interface LanguageItem extends SelectItem {\r\n LanguageID?: number;\r\n}\r\n\r\nexport interface CountryItem extends SelectItem {\r\n CountryID?: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function accountApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(ACCOUNT_URLS.INDEX, params),\r\n indexDetail: (params: FilterParamList) => client.post(ACCOUNT_URLS.INDEX_DETAIL, params),\r\n detail: (params: UidRequest) => client.post(ACCOUNT_URLS.DETAIL, params),\r\n myDetail: () => client.post(ACCOUNT_URLS.MY_DETAIL),\r\n save: (item: Account) => client.post(ACCOUNT_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(ACCOUNT_URLS.DELETE, params),\r\n hardDelete: (params: UidRequest) => client.post(ACCOUNT_URLS.HARD_DELETE, params),\r\n copy: (params: UidRequest) => client.post(ACCOUNT_URLS.COPY, params),\r\n validate: (item: Account) => client.post(ACCOUNT_URLS.VALIDATE, item),\r\n init: (params: UidRequest) => client.post(ACCOUNT_URLS.INIT, params),\r\n createLink: (params: UidRequest) => client.post(ACCOUNT_URLS.CREATE_LINK, params),\r\n initGenre: (params: UidRequest) => client.post(ACCOUNT_URLS.INIT_GENRE, params),\r\n initLanguage: (params: UidRequest) => client.post(ACCOUNT_URLS.INIT_LANGUAGE, params),\r\n initCountry: (params: UidRequest) => client.post(ACCOUNT_URLS.INIT_COUNTRY, params),\r\n genre: () => client.get(ACCOUNT_URLS.GENRE),\r\n genreSub: () => client.get(ACCOUNT_URLS.GENRE_SUB),\r\n language: () => client.get(ACCOUNT_URLS.LANGUAGE),\r\n country: () => client.get(ACCOUNT_URLS.COUNTRY),\r\n parentalGuidance: () => client.get(ACCOUNT_URLS.PARENTAL_GUIDANCE),\r\n credentialTargets: () => client.get(ACCOUNT_URLS.CREDENTIAL_TARGETS),\r\n templates: (accountId: number) => client.get(`${ACCOUNT_URLS.TEMPLATES}${accountId}`),\r\n templatesAll: () => client.get(ACCOUNT_URLS.TEMPLATES_ALL),\r\n saveTemplate: (item: XlsTemplate) => client.post(ACCOUNT_URLS.SAVE_TEMPLATE, item),\r\n deleteTemplate: (params: UidRequest) => client.post(ACCOUNT_URLS.DELETE_TEMPLATE, params),\r\n getTemplateDownloadUrl: (templateId: number) => client.getDownloadUrl(`${ACCOUNT_URLS.GET_TEMPLATE}${templateId}`),\r\n hasNdiMultiviewer: () => client.get(ACCOUNT_URLS.HAS_NDI_MULTIVIEWER),\r\n ndiMultiviewerConfig: () => client.get(ACCOUNT_URLS.NDI_MULTIVIEWER_CONFIG),\r\n ndiMultiviewerInit: (params: UidRequest) => client.post(ACCOUNT_URLS.NDI_MULTIVIEWER_INIT, params),\r\n ndiMultiviewerClear: (params: UidRequest) => client.post(ACCOUNT_URLS.NDI_MULTIVIEWER_CLEAR, params),\r\n info: () => client.post(ACCOUNT_URLS.INFO),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\nexport const ASRUN_LOG_URLS = {\r\n INDEX: '/AsrunLog/index',\r\n DETAIL: '/AsrunLog/detail',\r\n SAVE: '/AsrunLog/save',\r\n DELETE: '/AsrunLog/delete',\r\n DELETE_SCHED_PATTERN: '/AsrunLog/deleteSchedPattern',\r\n CONSOLIDATE: '/AsrunLog/consolidate',\r\n MERGE: '/AsrunLog/merge',\r\n MEDIA_LOG: '/AsrunLog/mediaLog',\r\n FILES: '/AsrunLog/files?asrunlogID=',\r\n PLAYLIST_ITEM_GROUP: '/AsrunLog/playlistItemGroup?asrunlogID=',\r\n} as const;\r\n\r\nexport interface AsrunLog extends EntityBase {\r\n AsrunLogID?: number | null;\r\n ScheduleID?: number | null;\r\n SchedPatternID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n StartTime?: string;\r\n Duration?: number | null;\r\n C_StartTime?: string;\r\n C_Duration?: string;\r\n}\r\n\r\nexport function asrunLogApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(ASRUN_LOG_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(ASRUN_LOG_URLS.DETAIL, params),\r\n save: (item: AsrunLog) => client.post(ASRUN_LOG_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(ASRUN_LOG_URLS.DELETE, params),\r\n deleteSchedPattern: (params: UidRequest) => client.post(ASRUN_LOG_URLS.DELETE_SCHED_PATTERN, params),\r\n consolidate: (params: UidRequest) => client.post(ASRUN_LOG_URLS.CONSOLIDATE, params),\r\n merge: (params: UidRequest) => client.post(ASRUN_LOG_URLS.MERGE, params),\r\n mediaLog: (params: UidRequest) => client.post(ASRUN_LOG_URLS.MEDIA_LOG, params),\r\n files: (asrunLogId: number) => client.get(`${ASRUN_LOG_URLS.FILES}${asrunLogId}`),\r\n playlistItemGroup: (asrunLogId: number) => client.get(`${ASRUN_LOG_URLS.PLAYLIST_ITEM_GROUP}${asrunLogId}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\nexport const AUDIT_LOG_URLS = {\r\n INDEX: '/AuditLog/index',\r\n DETAIL: '/AuditLog/detail',\r\n DELETE: '/AuditLog/delete',\r\n KINDS: '/AuditLog/kinds',\r\n SEVERITIES: '/AuditLog/severities',\r\n STATS: '/AuditLog/stats',\r\n STATE: '/AuditLog/state',\r\n SOLVED: '/AuditLog/solved',\r\n SOLVED_ALL: '/AuditLog/solvedAll',\r\n READ_ALL: '/AuditLog/readAll',\r\n} as const;\r\n\r\nexport const AUDIT_LOG_CONFIG_URLS = {\r\n INDEX: '/AuditLogConfig/index',\r\n DETAIL: '/AuditLogConfig/detail',\r\n SAVE: '/AuditLogConfig/save',\r\n DELETE: '/AuditLogConfig/delete',\r\n VALIDATE: '/AuditLogConfig/validate',\r\n TEST: '/AuditLogConfig/test',\r\n} as const;\r\n\r\nexport const SYSTEM_LOG_URLS = {\r\n SELECT: '/SystemLog/select',\r\n} as const;\r\n\r\nexport interface AuditLog extends EntityBase {\r\n AuditLogID?: number | null;\r\n Kind?: string;\r\n Severity?: string;\r\n Message?: string;\r\n Detail?: string;\r\n IsSolved?: boolean;\r\n IsRead?: boolean;\r\n C_CreatedDate?: string;\r\n}\r\n\r\nexport interface AuditLogConfig extends EntityBase {\r\n AuditLogConfigID?: number | null;\r\n NameNM?: string;\r\n Description?: string;\r\n}\r\n\r\nexport interface AuditLogStats {\r\n Total?: number;\r\n Unread?: number;\r\n Unsolved?: number;\r\n}\r\n\r\nexport function auditLogApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(AUDIT_LOG_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(AUDIT_LOG_URLS.DETAIL, params),\r\n delete: (params: UidRequest) => client.post(AUDIT_LOG_URLS.DELETE, params),\r\n kinds: () => client.get(AUDIT_LOG_URLS.KINDS),\r\n severities: () => client.get(AUDIT_LOG_URLS.SEVERITIES),\r\n stats: () => client.get(AUDIT_LOG_URLS.STATS),\r\n state: (params: UidRequest) => client.post(AUDIT_LOG_URLS.STATE, params),\r\n solved: (params: UidRequest) => client.post(AUDIT_LOG_URLS.SOLVED, params),\r\n solvedAll: (params: UidRequest) => client.post(AUDIT_LOG_URLS.SOLVED_ALL, params),\r\n readAll: (params: UidRequest) => client.post(AUDIT_LOG_URLS.READ_ALL, params),\r\n };\r\n}\r\n\r\nexport function auditLogConfigApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(AUDIT_LOG_CONFIG_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(AUDIT_LOG_CONFIG_URLS.DETAIL, params),\r\n save: (item: AuditLogConfig) => client.post(AUDIT_LOG_CONFIG_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(AUDIT_LOG_CONFIG_URLS.DELETE, params),\r\n validate: (item: AuditLogConfig) => client.post(AUDIT_LOG_CONFIG_URLS.VALIDATE, item),\r\n test: (params: UidRequest) => client.post(AUDIT_LOG_CONFIG_URLS.TEST, params),\r\n };\r\n}\r\n\r\nexport function systemLogApi(client: PbaApiClient) {\r\n return {\r\n select: (params: FilterParamList) => client.post(SYSTEM_LOG_URLS.SELECT, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, RuleConditionBuilderResult } from './types';\r\n\r\nexport const BREAK_PATTERN_URLS = {\r\n INDEX: '/BreakPattern/index',\r\n DETAIL: '/BreakPattern/detail',\r\n SAVE: '/BreakPattern/save',\r\n DELETE: '/BreakPattern/delete',\r\n VALIDATE: '/BreakPattern/validate',\r\n ITEM: '/BreakPattern/item',\r\n ITEM_BY_ID: '/BreakPattern/item/',\r\n ITEMS: '/BreakPattern/items/',\r\n BREAKS: '/BreakPattern/breaks/',\r\n RULE_CONDITION_BUILDER: '/BreakPattern/ruleConditionBuilder',\r\n RULE_CONDITION_BUILDER_BY_ID: '/BreakPattern/ruleConditionBuilder?breakPatternID=',\r\n RULE_CONDITION_PROCESS: '/BreakPattern/ruleConditionProcess',\r\n} as const;\r\n\r\nexport interface BreakPattern extends EntityBase {\r\n BreakPatternID?: number | null;\r\n NameNM?: string;\r\n AccountID?: number | null;\r\n Description?: string;\r\n}\r\n\r\nexport interface BreakPatternItem extends EntityBase {\r\n BreakPatternItemID?: number | null;\r\n BreakPatternID?: number | null;\r\n NameNM?: string;\r\n Ordinal?: number | null;\r\n Duration?: number | null;\r\n}\r\n\r\nexport function breakPatternApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(BREAK_PATTERN_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(BREAK_PATTERN_URLS.DETAIL, params),\r\n save: (item: BreakPattern) => client.post(BREAK_PATTERN_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(BREAK_PATTERN_URLS.DELETE, params),\r\n validate: (item: BreakPattern) => client.post(BREAK_PATTERN_URLS.VALIDATE, item),\r\n item: (params: UidRequest) => client.post(BREAK_PATTERN_URLS.ITEM, params),\r\n itemById: (id: number) => client.get(`${BREAK_PATTERN_URLS.ITEM_BY_ID}${id}`),\r\n items: (breakPatternId: number) => client.get(`${BREAK_PATTERN_URLS.ITEMS}${breakPatternId}`),\r\n breaks: (breakPatternId: number) => client.get(`${BREAK_PATTERN_URLS.BREAKS}${breakPatternId}`),\r\n ruleConditionBuilder: (params: UidRequest) => client.post(BREAK_PATTERN_URLS.RULE_CONDITION_BUILDER, params),\r\n ruleConditionBuilderById: (breakPatternId: number) => client.get(`${BREAK_PATTERN_URLS.RULE_CONDITION_BUILDER_BY_ID}${breakPatternId}`),\r\n ruleConditionProcess: (params: UidRequest) => client.post(BREAK_PATTERN_URLS.RULE_CONDITION_PROCESS, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const CONFIG_COMPONENT_URLS = {\r\n INDEX: '/ConfigComponent/index',\r\n DETAIL: '/ConfigComponent/detail',\r\n SAVE: '/ConfigComponent/save',\r\n DELETE: '/ConfigComponent/delete',\r\n DELETE_SIMPLE: '/ConfigComponent/deleteSimple',\r\n VALIDATE: '/ConfigComponent/validate',\r\n SELECT: '/ConfigComponent/select',\r\n DEPENDENCIES: '/ConfigComponent/dependencies?configComponentID=',\r\n SAVE_DEPENDENCY: '/ConfigComponent/saveDependency',\r\n DELETE_DEPENDENCY: '/ConfigComponent/deleteDependency',\r\n VALIDATE_DEPENDENCY: '/ConfigComponent/validateDependency',\r\n} as const;\r\n\r\nexport const CONFIG_CATEGORY_URLS = {\r\n INDEX: '/ConfigCategory/index',\r\n DETAIL: '/ConfigCategory/detail',\r\n SAVE: '/ConfigCategory/save',\r\n DELETE: '/ConfigCategory/delete',\r\n VALIDATE: '/ConfigCategory/validate',\r\n} as const;\r\n\r\nexport const CONFIG_PROFILE_URLS = {\r\n INDEX: '/ConfigProfile/index',\r\n DETAIL: '/ConfigProfile/detail',\r\n SAVE: '/ConfigProfile/save',\r\n DELETE: '/ConfigProfile/delete',\r\n VALIDATE: '/ConfigProfile/validate',\r\n SELECT: '/ConfigProfile/select',\r\n PREVIEW: '/ConfigProfile/preview?configProfileID=',\r\n V2_EXPORT: '/v2/configprofile/export',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface ConfigComponent extends EntityBase {\r\n ConfigComponentID?: number | null;\r\n NameNM?: string;\r\n ConfigCategoryID?: number | null;\r\n AccountID?: number | null;\r\n Description?: string;\r\n IsActive?: boolean;\r\n}\r\n\r\nexport interface ConfigCategory extends EntityBase {\r\n ConfigCategoryID?: number | null;\r\n NameNM?: string;\r\n Description?: string;\r\n}\r\n\r\nexport interface ConfigProfile extends EntityBase {\r\n ConfigProfileID?: number | null;\r\n NameNM?: string;\r\n Description?: string;\r\n}\r\n\r\nexport interface ConfigDependency extends EntityBase {\r\n ConfigDependencyID?: number | null;\r\n ConfigComponentID?: number | null;\r\n DependsOnConfigComponentID?: number | null;\r\n NameNM?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function configComponentApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(CONFIG_COMPONENT_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(CONFIG_COMPONENT_URLS.DETAIL, params),\r\n save: (item: ConfigComponent) => client.post(CONFIG_COMPONENT_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(CONFIG_COMPONENT_URLS.DELETE, params),\r\n deleteSimple: (params: UidRequest) => client.post(CONFIG_COMPONENT_URLS.DELETE_SIMPLE, params),\r\n validate: (item: ConfigComponent) => client.post(CONFIG_COMPONENT_URLS.VALIDATE, item),\r\n select: () => client.get(CONFIG_COMPONENT_URLS.SELECT),\r\n dependencies: (configComponentId: number) => client.get(`${CONFIG_COMPONENT_URLS.DEPENDENCIES}${configComponentId}`),\r\n saveDependency: (item: ConfigDependency) => client.post(CONFIG_COMPONENT_URLS.SAVE_DEPENDENCY, item),\r\n deleteDependency: (params: UidRequest) => client.post(CONFIG_COMPONENT_URLS.DELETE_DEPENDENCY, params),\r\n validateDependency: (item: ConfigDependency) => client.post(CONFIG_COMPONENT_URLS.VALIDATE_DEPENDENCY, item),\r\n };\r\n}\r\n\r\nexport function configCategoryApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(CONFIG_CATEGORY_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(CONFIG_CATEGORY_URLS.DETAIL, params),\r\n save: (item: ConfigCategory) => client.post(CONFIG_CATEGORY_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(CONFIG_CATEGORY_URLS.DELETE, params),\r\n validate: (item: ConfigCategory) => client.post(CONFIG_CATEGORY_URLS.VALIDATE, item),\r\n };\r\n}\r\n\r\nexport function configProfileApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(CONFIG_PROFILE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(CONFIG_PROFILE_URLS.DETAIL, params),\r\n save: (item: ConfigProfile) => client.post(CONFIG_PROFILE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(CONFIG_PROFILE_URLS.DELETE, params),\r\n validate: (item: ConfigProfile) => client.post(CONFIG_PROFILE_URLS.VALIDATE, item),\r\n select: () => client.get(CONFIG_PROFILE_URLS.SELECT),\r\n preview: (configProfileId: number) => client.get(`${CONFIG_PROFILE_URLS.PREVIEW}${configProfileId}`),\r\n exportV2: (params: UidRequest) => client.post(CONFIG_PROFILE_URLS.V2_EXPORT, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, SelectItem, MachineNameResult, ServerTimeResult, FrameRateResult, AccountUsage, ClientInfo, Tag } from './types';\r\n\r\nexport const DASHBOARD_URLS = {\r\n TIME: '/Webserver/time',\r\n SERVERS: '/Webserver/servers',\r\n MACHINE_NAME: '/Webserver/machineName',\r\n FRAME_RATE: '/Webserver/frameRate',\r\n ACCOUNT_USAGE: '/Webserver/accountUsage',\r\n CLIENTS: '/Webserver/clients',\r\n PLAYERS: '/Webserver/players',\r\n PLAYER_ITEMS: '/Webserver/playerItems',\r\n JSON2XML: '/Webserver/json2xml',\r\n MESSAGE: '/Webserver/message?message=',\r\n ROOT: '/Webserver/',\r\n MAM_INTEGRATION_SERVICE: '/Webserver/mamIntegrationService',\r\n BACKUP_DB: '/Webserver/backupDB',\r\n // Tags\r\n TAGS: '/Webserver/tags',\r\n SAVE_TAG: '/Webserver/saveTag',\r\n DELETE_TAG: '/Webserver/deleteTag',\r\n SAVE_TAGS: '/Webserver/saveTags',\r\n SAVE_TAG_OBJECTS: '/Webserver/saveTagObjects',\r\n} as const;\r\n\r\nexport const DB_STATISTICS_URLS = {\r\n LATEST: '/DbStatistics/latest',\r\n ENTITIES: '/DbStatistics/entities',\r\n TREND: '/DbStatistics/trend',\r\n DETAIL: '/DbStatistics/',\r\n ROOT: '/DbStatistics',\r\n} as const;\r\n\r\nexport const TASK_MONITOR_URLS = {\r\n ACCOUNTS: '/TaskMonitor/accounts',\r\n TASK_MANAGERS: '/TaskMonitor/taskmanagers',\r\n STATISTICS: '/TaskMonitor/statistics',\r\n TREND: '/TaskMonitor/trend',\r\n} as const;\r\n\r\nexport interface WebserverInfo {\r\n machineName?: string;\r\n version?: string;\r\n serverTime?: string;\r\n}\r\n\r\nexport interface PlayerInfo {\r\n ServerID?: number;\r\n NameNM?: string;\r\n IsRunning?: boolean;\r\n}\r\n\r\nexport interface PlayoutItemSummary {\r\n ServerID?: number;\r\n NameNM?: string;\r\n FileID?: number;\r\n Duration?: number;\r\n StartTime?: number;\r\n}\r\n\r\nexport function dashboardApi(client: PbaApiClient) {\r\n return {\r\n time: () => client.post(DASHBOARD_URLS.TIME),\r\n servers: (params?: FilterParamList) => client.post(DASHBOARD_URLS.SERVERS, params),\r\n machineName: () => client.post(DASHBOARD_URLS.MACHINE_NAME),\r\n frameRate: () => client.get(DASHBOARD_URLS.FRAME_RATE),\r\n accountUsage: () => client.get(DASHBOARD_URLS.ACCOUNT_USAGE),\r\n clients: () => client.get(DASHBOARD_URLS.CLIENTS),\r\n players: (params?: FilterParamList) => client.post(DASHBOARD_URLS.PLAYERS, params),\r\n playerItems: (params?: FilterParamList) => client.post(DASHBOARD_URLS.PLAYER_ITEMS, params),\r\n json2xml: (params: UidRequest) => client.post(DASHBOARD_URLS.JSON2XML, params),\r\n sendMessage: (message: string) => client.post(`${DASHBOARD_URLS.MESSAGE}${encodeURIComponent(message)}`),\r\n root: (params?: FilterParamList) => client.post(DASHBOARD_URLS.ROOT, params),\r\n mamIntegrationService: () => client.get(DASHBOARD_URLS.MAM_INTEGRATION_SERVICE),\r\n backupDb: () => client.post(DASHBOARD_URLS.BACKUP_DB),\r\n // Tags\r\n tags: () => client.get(DASHBOARD_URLS.TAGS),\r\n saveTag: (tag: Tag) => client.post(DASHBOARD_URLS.SAVE_TAG, tag),\r\n deleteTag: (tag: Tag) => client.post(DASHBOARD_URLS.DELETE_TAG, tag),\r\n saveTags: (tags: Tag[]) => client.post(DASHBOARD_URLS.SAVE_TAGS, tags),\r\n saveTagObjects: (tagObjects: Tag[]) => client.post(DASHBOARD_URLS.SAVE_TAG_OBJECTS, tagObjects),\r\n };\r\n}\r\n\r\nexport function dbStatisticsApi(client: PbaApiClient) {\r\n return {\r\n latest: () => client.get(DB_STATISTICS_URLS.LATEST),\r\n entities: () => client.get(DB_STATISTICS_URLS.ENTITIES),\r\n trend: (params: UidRequest) => client.post(DB_STATISTICS_URLS.TREND, params),\r\n detail: (headerId: number) => client.get(`${DB_STATISTICS_URLS.DETAIL}${headerId}`),\r\n root: (params: UidRequest) => client.post(DB_STATISTICS_URLS.ROOT, params),\r\n };\r\n}\r\n\r\nexport function taskMonitorApi(client: PbaApiClient) {\r\n return {\r\n accounts: (hours: number) => client.get(`${TASK_MONITOR_URLS.ACCOUNTS}?hours=${hours}`),\r\n taskManagers: () => client.get(TASK_MONITOR_URLS.TASK_MANAGERS),\r\n statistics: (hours: number) => client.get(`${TASK_MONITOR_URLS.STATISTICS}?hours=${hours}`),\r\n trend: (hours: number, intervalMin: number) => client.get(`${TASK_MONITOR_URLS.TREND}?hours=${hours}&intervalMin=${intervalMin}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const EVENT_URLS = {\r\n INDEX: '/Event/index',\r\n DETAIL: '/Event/detail',\r\n SAVE: '/Event/save',\r\n DELETE: '/Event/delete',\r\n COPY: '/Event/copy',\r\n VALIDATE: '/Event/validate',\r\n CATEGORIES: '/Event/categories',\r\n GROUP: '/Event/group',\r\n OPERATION: '/Event/operation',\r\n // v2\r\n V2_JSON_EXPORT: '/v2/event/JSON/export',\r\n V2_JSON_IMPORT: '/v2/event/JSON/import/',\r\n V2_XML_SINGLE_EXPORT: '/v2/event/XML/singleexport/',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface EventItem extends EntityBase {\r\n EventID?: number | null;\r\n NameNM?: string;\r\n EventCategoryID?: number | null;\r\n EventTypeID?: number | null;\r\n AccountID?: number | null;\r\n Description?: string;\r\n Duration?: number | null;\r\n C_Duration?: string;\r\n}\r\n\r\nexport interface EventCategory extends SelectItem {\r\n EventCategoryID?: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function eventApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(EVENT_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(EVENT_URLS.DETAIL, params),\r\n save: (item: EventItem) => client.post(EVENT_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(EVENT_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(EVENT_URLS.COPY, params),\r\n validate: (item: EventItem) => client.post(EVENT_URLS.VALIDATE, item),\r\n categories: () => client.get(EVENT_URLS.CATEGORIES),\r\n group: (params: UidRequest) => client.post(EVENT_URLS.GROUP, params),\r\n operation: (params: UidRequest) => client.post(EVENT_URLS.OPERATION, params),\r\n exportJson: (params: UidRequest) => client.post(EVENT_URLS.V2_JSON_EXPORT, params),\r\n importJson: (id: number, formData: FormData) => client.postFile(`${EVENT_URLS.V2_JSON_IMPORT}${id}`, formData),\r\n exportXmlSingle: (id: number, params: UidRequest) => client.post(`${EVENT_URLS.V2_XML_SINGLE_EXPORT}${id}`, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, ImageCache, RuleConditionBuilderResult } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const FOLDER_URLS = {\r\n INDEX: '/Folder/index',\r\n FLAT_INDEX: '/Folder/flatIndex',\r\n DETAIL: '/Folder/detail',\r\n SAVE: '/Folder/save',\r\n DELETE: '/Folder/delete',\r\n HARD_DELETE: '/Folder/harddelete',\r\n VALIDATE: '/Folder/validate',\r\n INIT: '/Folder/init',\r\n ROOT: '/Folder/root',\r\n TREE: '/Folder/tree/0',\r\n SUB_OBJECTS: '/Folder/subObjects',\r\n REVERT_DELETE: '/Folder/revertdelete',\r\n METADATA_DELETE: '/Folder/metadatadelete',\r\n COMPRESS: '/Folder/compress',\r\n MEDIA_INFO_FOLDER: '/Folder/mediaInfoFolder',\r\n // Thumbnails\r\n GET_FILE_THUMBNAILS: '/Folder/getFileThumbnails/',\r\n GET_LOGO_THUMBNAILS: '/Folder/getLogoThumbnails',\r\n GET_THUMBNAIL: '/Folder/getThumbnail/',\r\n // Query builder\r\n QUERY_BUILDER: '/Folder/queryBuilder?folderID=',\r\n QUERY_BUILDER_PARSE: '/Folder/queryBuilderParse',\r\n QUERY_CONDITION_BUILDER: '/Folder/queryConditionBuilder',\r\n // Inventory\r\n INVENTORY: '/Folder/inventory?folderID=',\r\n // Workflows\r\n DEFAULT_INGEST_WORKFLOW: '/Folder/defaultIngestWorkflow/',\r\n DEFAULT_WIPE_WORKFLOW: '/Folder/defaultWipeWorkflow/',\r\n} as const;\r\n\r\nexport const EXTERNAL_FOLDER_URLS = {\r\n INDEX: '/ExternalFolder/index',\r\n SELECT: '/ExternalFolder/select',\r\n SAVE: '/ExternalFolder/save',\r\n DELETE: '/ExternalFolder/delete',\r\n VALIDATE: '/ExternalFolder/validate',\r\n BROWSE: '/ExternalFolder/browse',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Folder extends EntityBase {\r\n FolderID?: number | null;\r\n NameNM?: string;\r\n ParentFolderID?: number | null;\r\n AccountID?: number | null;\r\n FolderPath?: string;\r\n Description?: string;\r\n IsDeleted?: boolean;\r\n IsExpanded?: boolean;\r\n Children?: Folder[];\r\n}\r\n\r\nexport interface ExternalFolder extends EntityBase {\r\n ExternalFolderID?: number | null;\r\n NameNM?: string;\r\n Path?: string;\r\n Description?: string;\r\n}\r\n\r\nexport interface FolderTreeNode {\r\n FolderID?: number;\r\n NameNM?: string;\r\n ParentFolderID?: number | null;\r\n Children?: FolderTreeNode[];\r\n IsExpanded?: boolean;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function folderApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(FOLDER_URLS.INDEX, params),\r\n flatIndex: (params: FilterParamList) => client.post(FOLDER_URLS.FLAT_INDEX, params),\r\n detail: (params: UidRequest) => client.post(FOLDER_URLS.DETAIL, params),\r\n save: (item: Folder) => client.post(FOLDER_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(FOLDER_URLS.DELETE, params),\r\n hardDelete: (params: UidRequest) => client.post(FOLDER_URLS.HARD_DELETE, params),\r\n validate: (item: Folder) => client.post(FOLDER_URLS.VALIDATE, item),\r\n init: (params: UidRequest) => client.post(FOLDER_URLS.INIT, params),\r\n root: (params: UidRequest) => client.post(FOLDER_URLS.ROOT, params),\r\n tree: () => client.get(FOLDER_URLS.TREE),\r\n subObjects: (params: UidRequest) => client.post(FOLDER_URLS.SUB_OBJECTS, params),\r\n revertDelete: (params: UidRequest) => client.post(FOLDER_URLS.REVERT_DELETE, params),\r\n metadataDelete: (params: UidRequest) => client.post(FOLDER_URLS.METADATA_DELETE, params),\r\n compress: (params: UidRequest) => client.post(FOLDER_URLS.COMPRESS, params),\r\n mediaInfoFolder: (params: UidRequest) => client.post(FOLDER_URLS.MEDIA_INFO_FOLDER, params),\r\n getFileThumbnails: (folderId: number) => client.get(`${FOLDER_URLS.GET_FILE_THUMBNAILS}${folderId}`),\r\n getLogoThumbnails: () => client.get(FOLDER_URLS.GET_LOGO_THUMBNAILS),\r\n getThumbnail: (folderId: number) => client.post(`${FOLDER_URLS.GET_THUMBNAIL}${folderId}`),\r\n queryBuilder: (folderId: number) => client.get(`${FOLDER_URLS.QUERY_BUILDER}${folderId}`),\r\n queryBuilderParse: (params: UidRequest) => client.post(FOLDER_URLS.QUERY_BUILDER_PARSE, params),\r\n queryConditionBuilder: (params: UidRequest) => client.post(FOLDER_URLS.QUERY_CONDITION_BUILDER, params),\r\n inventory: (folderId: number) => client.get(`${FOLDER_URLS.INVENTORY}${folderId}`),\r\n defaultIngestWorkflow: (folderId: number) => client.get(`${FOLDER_URLS.DEFAULT_INGEST_WORKFLOW}${folderId}`),\r\n defaultWipeWorkflow: (folderId: number) => client.get(`${FOLDER_URLS.DEFAULT_WIPE_WORKFLOW}${folderId}`),\r\n };\r\n}\r\n\r\nexport function externalFolderApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(EXTERNAL_FOLDER_URLS.INDEX, params),\r\n select: (params: FilterParamList) => client.post(EXTERNAL_FOLDER_URLS.SELECT, params),\r\n save: (item: ExternalFolder) => client.post(EXTERNAL_FOLDER_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(EXTERNAL_FOLDER_URLS.DELETE, params),\r\n validate: (item: ExternalFolder) => client.post(EXTERNAL_FOLDER_URLS.VALIDATE, item),\r\n browse: (params: UidRequest) => client.post(EXTERNAL_FOLDER_URLS.BROWSE, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, SuccessModelType, EntityBase, SelectItem, ImageCache } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const FILE_URLS = {\r\n INDEX: '/File/index',\r\n DETAIL: '/File/detail',\r\n SAVE: '/File/save',\r\n DELETE: '/File/delete',\r\n COPY: '/File/copy',\r\n VALIDATE: '/File/validate',\r\n // File operations\r\n FILE_MOVE: '/File/filemove',\r\n FILE_CHECK_DELETE: '/File/filecheckdelete',\r\n FILE_HARD_DELETE: '/File/fileharddelete',\r\n REVERT_FILE_DELETE: '/File/revertfiledelete',\r\n METADATA_FILE_DELETE: '/File/metadatafiledelete',\r\n CHECK_FILES: '/File/checkfiles',\r\n CONSOLIDATE: '/File/consolidate',\r\n UN_COMPRESS: '/File/unCompress',\r\n APPLY_TO: '/File/applyTo',\r\n APPLY_FILE_API: '/File/applyFileAPI',\r\n // File info\r\n FILENAME: '/File/filename/',\r\n FILE_PROPERTIES: '/File/fileProperties',\r\n FREE_ATTRS: '/File/freeAttrs',\r\n MEDIA_INFO: '/File/mediaInfo',\r\n MEDIA_TYPES: '/File/mediaTypes',\r\n RELATED_TYPES: '/File/relatedTypes',\r\n RELATEDS: '/File/relateds/',\r\n SEARCH_FILE_API: '/File/searchFileAPI?query=',\r\n // Images & thumbnails\r\n THUMBAILS: '/File/thumbails',\r\n GET_FILE_IMAGES: '/File/getFileImages/',\r\n GET_FILE_THUMBNAIL: '/File/getFileThumbnail/',\r\n REGISTRE_FILE_IMAGE: '/File/registreFileImage',\r\n REGISTRE_FILE_THUMBNAIL: '/File/registreFileThumbnail/',\r\n FILE_CAPTURE_IMAGE: '/File/fileCaptureImage',\r\n FILE_CAPTURE_THUMBNAIL: '/File/fileCaptureThumbnail',\r\n FILE_CAPTURE_POSTER_LANDSCAPE: '/File/fileCapturePosterLandscape',\r\n FILE_CAPTURE_POSTER_PORTRAIT: '/File/fileCapturePosterPortrait',\r\n SET_FILE_THUMBNAIL_BY_PATH: '/File/setFileThumbnailByPath',\r\n // Preview\r\n PREVIEW_URL: '/File/previewUrl/',\r\n FILE_PREVIEWS: '/File/filePreviews?fileID=',\r\n PLAY_FILE: '/File/playFile',\r\n // Segments\r\n SEGMENTS: '/File/segments',\r\n SEGMENT_SAVE: '/File/segmentSave',\r\n // Subtitles\r\n SUBTITLES: '/File/subtitles/',\r\n // Text\r\n GET_TEXT: '/File/getText',\r\n SAVE_TEXT: '/File/saveText',\r\n // EPG\r\n FILE_EPG: '/File/fileEPG',\r\n FILE_EPG_DATA: '/File/fileEPGdata',\r\n SET_FILE_EPG: '/File/setFileEPG',\r\n // IMDB\r\n FILE_IMDB_DETAIL: '/File/fileImdbDetail',\r\n // UMID\r\n INIT_UMID: '/File/initUMID',\r\n // VOD versions\r\n VOD_VERSIONS: '/File/vodversions/',\r\n VOD_VERSION: '/File/vodversion/',\r\n VOD_VERSION_SAVE: '/File/vodversion',\r\n VOD_VERSION_EXECUTE: '/File/vodversion/execute/',\r\n // File storage\r\n FILE_STORAGES: '/File/fileStorages/',\r\n DETAIL_FILE_STORAGE: '/File/detailFileStorage',\r\n SAVE_FILE_STORAGE: '/File/saveFileStorage',\r\n DELETE_FILE_STORAGE: '/File/deleteFileStorage',\r\n WIPE_FILE_STORAGE: '/File/wipeFileStorage',\r\n CREATE_AND_COPY_FILE_STORAGE: '/File/createAndCopyFileStorage',\r\n PROGRESS_FILE_STORAGE: '/File/progressFileStorage/',\r\n // System asset\r\n SYSTEM_ASSET: '/File/systemasset/',\r\n // SchedPatternItem default\r\n SET_FILE_DEFAULT_SCHED_PATTERN_ITEM: '/File/setFileDefaultSchedPatternItem',\r\n CLEAR_FILE_DEFAULT_SCHED_PATTERN_ITEM: '/File/clearFileDefaultSchedPatternItem',\r\n // Tx dates\r\n TX_NEXT_DAY_DATE: '/File/TxNextDayDate/',\r\n ROOT: '/File/',\r\n // Working copy\r\n WORKING_COPY_BY_CHANNEL: '/File/workingCopyByChannel?serverID=',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface FileItem extends EntityBase {\r\n FileID?: number | null;\r\n FolderID?: number | null;\r\n NameNM?: string;\r\n Title?: string;\r\n Description?: string;\r\n Duration?: number | null;\r\n C_Duration?: string;\r\n MediaTypeID?: number | null;\r\n IsActive?: boolean;\r\n IsDeleted?: boolean;\r\n FilePath?: string;\r\n FileName?: string;\r\n FileSize?: number | null;\r\n}\r\n\r\nexport interface FileStorage extends EntityBase {\r\n FileStorageID?: number | null;\r\n FileID?: number | null;\r\n StorageID?: number | null;\r\n NameNM?: string;\r\n FilePath?: string;\r\n}\r\n\r\nexport interface FileSegment extends EntityBase {\r\n FileSegmentID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n StartTC?: number | null;\r\n EndTC?: number | null;\r\n}\r\n\r\nexport interface VodVersion extends EntityBase {\r\n VodVersionID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n}\r\n\r\nexport interface RelatedFile extends EntityBase {\r\n RelatedFileID?: number | null;\r\n FileID?: number | null;\r\n RelatedID?: number | null;\r\n Type?: string;\r\n NameNM?: string;\r\n}\r\n\r\nexport interface FilePreview extends EntityBase {\r\n FilePreviewID?: number | null;\r\n ServerID?: number | null;\r\n FileID?: number | null;\r\n TimeStamp?: string;\r\n VideoName?: string;\r\n PreviewPort?: number | null;\r\n}\r\n\r\nexport interface FileTxNextDate {\r\n FileID?: number;\r\n StartDateTime?: string;\r\n SchedPatternID?: number;\r\n ScheduleID?: number;\r\n ServerID?: number;\r\n Kind?: string;\r\n}\r\n\r\nexport interface FileSystemAsset {\r\n FileID?: number;\r\n Type?: number;\r\n TypeDesc?: string;\r\n Url?: string;\r\n Path?: string;\r\n Mime?: string;\r\n}\r\n\r\nexport interface WorkingCopyInventory {\r\n ChannelNM?: string;\r\n DayDate?: string;\r\n ServerID?: number;\r\n FilesCount?: number;\r\n TotalFileSize?: number;\r\n ToCopy?: number;\r\n ToWipe?: number;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function fileApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(FILE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(FILE_URLS.DETAIL, params),\r\n save: (item: FileItem) => client.post(FILE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(FILE_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(FILE_URLS.COPY, params),\r\n validate: (item: FileItem) => client.post(FILE_URLS.VALIDATE, item),\r\n // File operations\r\n fileMove: (params: UidRequest) => client.post(FILE_URLS.FILE_MOVE, params),\r\n fileCheckDelete: (params: UidRequest) => client.post(FILE_URLS.FILE_CHECK_DELETE, params),\r\n fileHardDelete: (params: UidRequest) => client.post(FILE_URLS.FILE_HARD_DELETE, params),\r\n revertFileDelete: (params: UidRequest) => client.post(FILE_URLS.REVERT_FILE_DELETE, params),\r\n metadataFileDelete: (params: UidRequest) => client.post(FILE_URLS.METADATA_FILE_DELETE, params),\r\n checkFiles: (params: UidRequest) => client.post(FILE_URLS.CHECK_FILES, params),\r\n consolidate: (params: UidRequest) => client.post(FILE_URLS.CONSOLIDATE, params),\r\n unCompress: (params: UidRequest) => client.post(FILE_URLS.UN_COMPRESS, params),\r\n applyTo: (params: UidRequest) => client.post(FILE_URLS.APPLY_TO, params),\r\n applyFileApi: (params: UidRequest) => client.post(FILE_URLS.APPLY_FILE_API, params),\r\n // File info\r\n filename: (fileId: number) => client.get(`${FILE_URLS.FILENAME}${fileId}`),\r\n fileProperties: () => client.get(FILE_URLS.FILE_PROPERTIES),\r\n freeAttrs: () => client.get(FILE_URLS.FREE_ATTRS),\r\n mediaInfo: (params: UidRequest) => client.post(FILE_URLS.MEDIA_INFO, params),\r\n mediaTypes: () => client.get(FILE_URLS.MEDIA_TYPES),\r\n relatedTypes: () => client.get(FILE_URLS.RELATED_TYPES),\r\n relateds: (fileId: number) => client.get(`${FILE_URLS.RELATEDS}${fileId}`),\r\n searchFileApi: (query: string) => client.get(`${FILE_URLS.SEARCH_FILE_API}${encodeURIComponent(query)}`),\r\n // Images & thumbnails\r\n thumbails: (fileIds: number[]) => client.post(FILE_URLS.THUMBAILS, { Multiline: fileIds } as UidRequest),\r\n getFileImages: (fileId: number) => client.post(`${FILE_URLS.GET_FILE_IMAGES}${fileId}`),\r\n getFileThumbnail: (fileId: number) => client.post(`${FILE_URLS.GET_FILE_THUMBNAIL}${fileId}`),\r\n registreFileImage: (params: UidRequest) => client.post(FILE_URLS.REGISTRE_FILE_IMAGE, params),\r\n registreFileThumbnail: (fileId: number, params: UidRequest) => client.post(`${FILE_URLS.REGISTRE_FILE_THUMBNAIL}${fileId}`, params),\r\n fileCaptureImage: (params: UidRequest) => client.post(FILE_URLS.FILE_CAPTURE_IMAGE, params),\r\n fileCaptureThumbnail: (params: UidRequest) => client.post(FILE_URLS.FILE_CAPTURE_THUMBNAIL, params),\r\n fileCapturePosterLandscape: (params: UidRequest) => client.post(FILE_URLS.FILE_CAPTURE_POSTER_LANDSCAPE, params),\r\n fileCapturePosterPortrait: (params: UidRequest) => client.post(FILE_URLS.FILE_CAPTURE_POSTER_PORTRAIT, params),\r\n setFileThumbnailByPath: (params: UidRequest) => client.post(FILE_URLS.SET_FILE_THUMBNAIL_BY_PATH, params),\r\n // Preview\r\n previewUrl: (fileId: number) => client.get(`${FILE_URLS.PREVIEW_URL}${fileId}`),\r\n filePreviews: (fileId: number) => client.get(`${FILE_URLS.FILE_PREVIEWS}${fileId}`),\r\n playFile: (params: UidRequest) => client.post(FILE_URLS.PLAY_FILE, params),\r\n // Segments\r\n segments: (fileId: number) => client.post(FILE_URLS.SEGMENTS, { Uid: fileId } as UidRequest),\r\n segmentSave: (item: FileSegment) => client.post(FILE_URLS.SEGMENT_SAVE, item),\r\n // Subtitles\r\n subtitles: (fileId: number) => client.get(`${FILE_URLS.SUBTITLES}${fileId}`),\r\n // Text\r\n getText: (params: UidRequest) => client.post(FILE_URLS.GET_TEXT, params),\r\n saveText: (params: UidRequest) => client.post(FILE_URLS.SAVE_TEXT, params),\r\n // EPG\r\n fileEpg: (params: UidRequest) => client.post(FILE_URLS.FILE_EPG, params),\r\n fileEpgData: (params: UidRequest) => client.post[]>(FILE_URLS.FILE_EPG_DATA, params),\r\n setFileEpg: (params: UidRequest) => client.post(FILE_URLS.SET_FILE_EPG, params),\r\n // IMDB\r\n fileImdbDetail: (params: UidRequest) => client.post(FILE_URLS.FILE_IMDB_DETAIL, params),\r\n // UMID\r\n initUmid: (params: UidRequest) => client.post(FILE_URLS.INIT_UMID, params),\r\n // VOD versions\r\n vodVersions: (fileId: number) => client.get(`${FILE_URLS.VOD_VERSIONS}${fileId}`),\r\n vodVersion: (fileId: number) => client.get(`${FILE_URLS.VOD_VERSION}${fileId}`),\r\n vodVersionSave: (item: VodVersion) => client.post(FILE_URLS.VOD_VERSION_SAVE, item),\r\n vodVersionExecute: (id: number) => client.post(`${FILE_URLS.VOD_VERSION_EXECUTE}${id}`),\r\n // File storage\r\n fileStorages: (fileId: number) => client.get(`${FILE_URLS.FILE_STORAGES}${fileId}`),\r\n detailFileStorage: (params: UidRequest) => client.post(FILE_URLS.DETAIL_FILE_STORAGE, params),\r\n saveFileStorage: (item: FileStorage) => client.post(FILE_URLS.SAVE_FILE_STORAGE, item),\r\n deleteFileStorage: (params: UidRequest) => client.post(FILE_URLS.DELETE_FILE_STORAGE, params),\r\n wipeFileStorage: (params: UidRequest) => client.post(FILE_URLS.WIPE_FILE_STORAGE, params),\r\n createAndCopyFileStorage: (params: UidRequest) => client.post(FILE_URLS.CREATE_AND_COPY_FILE_STORAGE, params),\r\n progressFileStorage: (fileId: number) => client.get(`${FILE_URLS.PROGRESS_FILE_STORAGE}${fileId}`),\r\n // System asset\r\n systemAsset: (fileId: number) => client.get>(`${FILE_URLS.SYSTEM_ASSET}${fileId}`),\r\n // SchedPatternItem default\r\n setFileDefaultSchedPatternItem: (params: UidRequest) => client.post(FILE_URLS.SET_FILE_DEFAULT_SCHED_PATTERN_ITEM, params),\r\n clearFileDefaultSchedPatternItem: (params: UidRequest) => client.post(FILE_URLS.CLEAR_FILE_DEFAULT_SCHED_PATTERN_ITEM, params),\r\n // Tx dates\r\n txNextDayDate: (fileId: number) => client.get(`${FILE_URLS.TX_NEXT_DAY_DATE}${fileId}`),\r\n root: (fileId: number) => client.post(`${FILE_URLS.ROOT}${fileId}`),\r\n // Working copy\r\n workingCopyByChannel: (serverId: number) => client.get(`${FILE_URLS.WORKING_COPY_BY_CHANNEL}${serverId}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, RuleConditionBuilderResult } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const GRAPHIC_PAGE_URLS = {\r\n INDEX: '/GraphicPage/index',\r\n DETAIL: '/GraphicPage/detail',\r\n SAVE: '/GraphicPage/save',\r\n SAVE_WIZARD: '/GraphicPage/saveWizard',\r\n DELETE: '/GraphicPage/delete',\r\n VALIDATE: '/GraphicPage/validate',\r\n RULE_CONDITION_BUILDER: '/GraphicPage/ruleConditionBuilder',\r\n RULE_CONDITION_BUILDER_BY_ID: '/GraphicPage/ruleConditionBuilder?graphicPageID=',\r\n RULE_CONDITION_PROCESS: '/GraphicPage/ruleConditionProcess',\r\n GRAPHIC_PAGE_BY_RULE_CONDITION: '/GraphicPage/graphicPageByRuleCondition',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface GraphicPage extends EntityBase {\r\n GraphicPageID?: number | null;\r\n NameNM?: string;\r\n ConfigComponentID?: number | null;\r\n Description?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function graphicPageApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(GRAPHIC_PAGE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(GRAPHIC_PAGE_URLS.DETAIL, params),\r\n save: (item: GraphicPage) => client.post(GRAPHIC_PAGE_URLS.SAVE, item),\r\n saveWizard: (item: GraphicPage) => client.post(GRAPHIC_PAGE_URLS.SAVE_WIZARD, item),\r\n delete: (params: UidRequest) => client.post(GRAPHIC_PAGE_URLS.DELETE, params),\r\n validate: (item: GraphicPage) => client.post(GRAPHIC_PAGE_URLS.VALIDATE, item),\r\n ruleConditionBuilder: (params: UidRequest) => client.post(GRAPHIC_PAGE_URLS.RULE_CONDITION_BUILDER, params),\r\n ruleConditionBuilderById: (graphicPageId: number) => client.get(`${GRAPHIC_PAGE_URLS.RULE_CONDITION_BUILDER_BY_ID}${graphicPageId}`),\r\n ruleConditionProcess: (params: UidRequest) => client.post(GRAPHIC_PAGE_URLS.RULE_CONDITION_PROCESS, params),\r\n graphicPageByRuleCondition: (params: UidRequest) => client.post(GRAPHIC_PAGE_URLS.GRAPHIC_PAGE_BY_RULE_CONDITION, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\nexport const HTML_TEMPLATE_URLS = {\r\n INDEX: '/HtmlTemplate/index',\r\n DETAIL: '/HtmlTemplate/detail',\r\n SAVE: '/HtmlTemplate/save',\r\n DELETE: '/HtmlTemplate/delete',\r\n VALIDATE: '/HtmlTemplate/validate',\r\n GET_PARAMS: '/HtmlTemplate/getParams',\r\n} as const;\r\n\r\nexport interface HtmlTemplate extends EntityBase {\r\n HtmlTemplateID?: number | null;\r\n NameNM?: string;\r\n Description?: string;\r\n HtmlBody?: string;\r\n}\r\n\r\nexport function htmlTemplateApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(HTML_TEMPLATE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(HTML_TEMPLATE_URLS.DETAIL, params),\r\n save: (item: HtmlTemplate) => client.post(HTML_TEMPLATE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(HTML_TEMPLATE_URLS.DELETE, params),\r\n validate: (item: HtmlTemplate) => client.post(HTML_TEMPLATE_URLS.VALIDATE, item),\r\n getParams: (params: UidRequest) => client.post(HTML_TEMPLATE_URLS.GET_PARAMS, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const JOB_URLS = {\r\n INDEX: '/JobItem/index',\r\n DETAIL: '/JobItem/detail',\r\n SAVE: '/JobItem/save',\r\n DELETE: '/JobItem/delete',\r\n COPY: '/JobItem/copy',\r\n VALIDATE: '/JobItem/validate',\r\n RUN: '/JobItem/Run',\r\n RUN_NOW: '/JobItem/RunNow',\r\n STOP: '/JobItem/Stop',\r\n TRANSFORM: '/JobItem/transform',\r\n XML_DATA: '/JobItem/xmlData',\r\n // v2\r\n V2_XML_IMPORT: '/v2/job/XML/import',\r\n V2_XML_EXPORT: '/v2/job/XML/export',\r\n V2_XML_EXPORT_SELECTED: '/v2/job/XML/exportSelected/',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface JobItem extends EntityBase {\r\n JobItemID?: number | null;\r\n NameNM?: string;\r\n JobTypeID?: number | null;\r\n AccountID?: number | null;\r\n Description?: string;\r\n IsActive?: boolean;\r\n CronExpression?: string;\r\n LastRunDate?: string;\r\n NextRunDate?: string;\r\n Status?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function jobApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(JOB_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(JOB_URLS.DETAIL, params),\r\n save: (item: JobItem) => client.post(JOB_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(JOB_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(JOB_URLS.COPY, params),\r\n validate: (item: JobItem) => client.post(JOB_URLS.VALIDATE, item),\r\n run: (params: UidRequest) => client.post(JOB_URLS.RUN, params),\r\n runNow: (params: UidRequest) => client.post(JOB_URLS.RUN_NOW, params),\r\n stop: (params: UidRequest) => client.post(JOB_URLS.STOP, params),\r\n transform: (params: UidRequest) => client.post(JOB_URLS.TRANSFORM, params),\r\n xmlData: (params: UidRequest) => client.post(JOB_URLS.XML_DATA, params),\r\n importXml: (formData: FormData) => client.postFile(JOB_URLS.V2_XML_IMPORT, formData),\r\n exportXmlUrl: () => client.getDownloadUrl(JOB_URLS.V2_XML_EXPORT),\r\n exportXmlSelectedUrl: (ids: string) => client.getDownloadUrl(`${JOB_URLS.V2_XML_EXPORT_SELECTED}${ids}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\nexport const ON_AIR_LAYER_URLS = {\r\n INDEX: '/OnAirLayer/index',\r\n DETAIL: '/OnAirLayer/detail',\r\n SAVE: '/OnAirLayer/save',\r\n DELETE: '/OnAirLayer/delete',\r\n COPY: '/OnAirLayer/copy',\r\n VALIDATE: '/OnAirLayer/validate',\r\n PREVIEW: '/OnAirLayer/preview',\r\n PREVIEW_BY_SERVER: '/OnAirLayer/preview?serverID=',\r\n} as const;\r\n\r\nexport interface OnAirLayer extends EntityBase {\r\n OnAirLayerID?: number | null;\r\n NameNM?: string;\r\n ConfigComponentID?: number | null;\r\n Description?: string;\r\n Ordinal?: number | null;\r\n}\r\n\r\nexport function onAirLayerApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(ON_AIR_LAYER_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(ON_AIR_LAYER_URLS.DETAIL, params),\r\n save: (item: OnAirLayer) => client.post(ON_AIR_LAYER_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(ON_AIR_LAYER_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(ON_AIR_LAYER_URLS.COPY, params),\r\n validate: (item: OnAirLayer) => client.post(ON_AIR_LAYER_URLS.VALIDATE, item),\r\n preview: (params: UidRequest) => client.post(ON_AIR_LAYER_URLS.PREVIEW, params),\r\n previewByServer: (params: UidRequest, serverId: number) => client.post(`${ON_AIR_LAYER_URLS.PREVIEW_BY_SERVER}${serverId}`, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const PLAYOUT_URLS = {\r\n INDEX: '/PlayoutItem/index',\r\n FLAT_INDEX: '/PlayoutItem/flatIndex',\r\n DETAIL: '/PlayoutItem/detail',\r\n SAVE: '/PlayoutItem/save',\r\n DELETE: '/PlayoutItem/delete',\r\n VALIDATE: '/PlayoutItem/validate',\r\n // Insert operations\r\n INSERT_FILE: '/PlayoutItem/insertFile',\r\n INSERT_BLOCK: '/PlayoutItem/insertBlock',\r\n INSERT_GROUP: '/PlayoutItem/insertGroup',\r\n INSERT_PLAN_ITEM: '/PlayoutItem/insertPlanItem',\r\n INSERT_GRAPHICS: '/PlayoutItem/insertGraphics',\r\n INSERT_SEC_GRAPHICS: '/PlayoutItem/insertSecGraphics',\r\n // Parallel/image\r\n ATTACH_IMAGE: '/PlayoutItem/attachImage',\r\n DETACH_IMAGE: '/PlayoutItem/detachImage',\r\n ATTACH_PARALLEL_BLOCK: '/PlayoutItem/attachParallelBlock',\r\n DETACH_PARALLEL_BLOCK: '/PlayoutItem/detachParallelBlock',\r\n DETACH_SEC_GRAPHICS: '/PlayoutItem/detachSecGraphics',\r\n // Playout operations\r\n CHANGE_DURATION: '/PlayoutItem/changeDuration',\r\n CHANGE_POSITION: '/PlayoutItem/changePosition',\r\n CHANGE_START_TIME: '/PlayoutItem/changeStartTime',\r\n FILL_DURATION: '/PlayoutItem/fillDuration',\r\n SKIPPED: '/PlayoutItem/skipped',\r\n TOGGLE_NO_COMMANDS: '/PlayoutItem/toggleNoCommands',\r\n SWITCH_ALT: '/PlayoutItem/switchAlt',\r\n REPLACE_BLOCK: '/PlayoutItem/replaceBlock',\r\n REPARE_BY_FILE: '/PlayoutItem/repareByFile',\r\n // Split/append\r\n SPLIT_PLAYLIST: '/PlayoutItem/splitPlaylist',\r\n SPLIT_PLAYLIST_PREPARE: '/PlayoutItem/splitPlaylistPrepare',\r\n APPEND_SCHEDULE: '/PlayoutItem/appendSchedule',\r\n // Emergency\r\n EMERGENCY_PLAY: '/PlayoutItem/emergencyPlay',\r\n EMERGENCY_INSERT_PLAN_ITEM: '/PlayoutItem/emergencyInsertPlanItem',\r\n // EPG / recording\r\n EPG: '/PlayoutItem/epg',\r\n RECORDING: '/PlayoutItem/recording',\r\n // Diff\r\n CLEAN_DIFF: '/PlayoutItem/cleanDiff',\r\n // Player info\r\n PLAYER: '/PlayoutItem/player?serverID=',\r\n PLAY_NEXT_IMMEDIATE: '/PlayoutItem/playNextImmediate?serverID=',\r\n CHECK_PLAYLIST: '/PlayoutItem/checkPlaylist?serverID=',\r\n WORKING_COPY: '/PlayoutItem/workingCopy?serverID=',\r\n MEDIA_TYPE_STATISTICS: '/PlayoutItem/mediaTypeStatistics?serverID=',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface PlayoutItem extends EntityBase {\r\n PlayoutItemID?: number | null;\r\n ScheduleID?: number | null;\r\n SchedPatternID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n Title?: string;\r\n Duration?: number | null;\r\n StartTime?: number | null;\r\n Ordinal?: number | null;\r\n ParentPlayoutItemID?: number | null;\r\n IsFixed?: boolean;\r\n IsSkipped?: boolean;\r\n IsPlaying?: boolean;\r\n IsPlayed?: boolean;\r\n C_Duration?: string;\r\n C_StartTime?: string;\r\n C_EndTime?: string;\r\n PlanningError?: number | null;\r\n C_PlanningError?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function playoutApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(PLAYOUT_URLS.INDEX, params),\r\n flatIndex: (params: FilterParamList) => client.post(PLAYOUT_URLS.FLAT_INDEX, params),\r\n detail: (params: UidRequest) => client.post(PLAYOUT_URLS.DETAIL, params),\r\n save: (item: PlayoutItem) => client.post(PLAYOUT_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(PLAYOUT_URLS.DELETE, params),\r\n validate: (item: PlayoutItem) => client.post(PLAYOUT_URLS.VALIDATE, item),\r\n // Insert\r\n insertFile: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_FILE, params),\r\n insertBlock: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_BLOCK, params),\r\n insertGroup: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_GROUP, params),\r\n insertPlanItem: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_PLAN_ITEM, params),\r\n insertGraphics: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_GRAPHICS, params),\r\n insertSecGraphics: (params: UidRequest) => client.post(PLAYOUT_URLS.INSERT_SEC_GRAPHICS, params),\r\n // Parallel/image\r\n attachImage: (params: UidRequest) => client.post(PLAYOUT_URLS.ATTACH_IMAGE, params),\r\n detachImage: (params: UidRequest) => client.post(PLAYOUT_URLS.DETACH_IMAGE, params),\r\n attachParallelBlock: (params: UidRequest) => client.post(PLAYOUT_URLS.ATTACH_PARALLEL_BLOCK, params),\r\n detachParallelBlock: (params: UidRequest) => client.post(PLAYOUT_URLS.DETACH_PARALLEL_BLOCK, params),\r\n detachSecGraphics: (params: UidRequest) => client.post(PLAYOUT_URLS.DETACH_SEC_GRAPHICS, params),\r\n // Playout operations\r\n changeDuration: (params: UidRequest) => client.post(PLAYOUT_URLS.CHANGE_DURATION, params),\r\n changePosition: (params: UidRequest) => client.post(PLAYOUT_URLS.CHANGE_POSITION, params),\r\n changeStartTime: (params: UidRequest) => client.post(PLAYOUT_URLS.CHANGE_START_TIME, params),\r\n fillDuration: (params: UidRequest) => client.post(PLAYOUT_URLS.FILL_DURATION, params),\r\n skipped: (params: UidRequest) => client.post(PLAYOUT_URLS.SKIPPED, params),\r\n toggleNoCommands: (params: UidRequest) => client.post(PLAYOUT_URLS.TOGGLE_NO_COMMANDS, params),\r\n switchAlt: (params: UidRequest) => client.post(PLAYOUT_URLS.SWITCH_ALT, params),\r\n replaceBlock: (params: UidRequest) => client.post(PLAYOUT_URLS.REPLACE_BLOCK, params),\r\n repareByFile: (params: UidRequest) => client.post(PLAYOUT_URLS.REPARE_BY_FILE, params),\r\n // Split/append\r\n splitPlaylist: (params: UidRequest) => client.post(PLAYOUT_URLS.SPLIT_PLAYLIST, params),\r\n splitPlaylistPrepare: (params: UidRequest) => client.post(PLAYOUT_URLS.SPLIT_PLAYLIST_PREPARE, params),\r\n appendSchedule: (params: UidRequest) => client.post(PLAYOUT_URLS.APPEND_SCHEDULE, params),\r\n // Emergency\r\n emergencyPlay: (params: UidRequest) => client.post(PLAYOUT_URLS.EMERGENCY_PLAY, params),\r\n emergencyInsertPlanItem: (params: UidRequest) => client.post(PLAYOUT_URLS.EMERGENCY_INSERT_PLAN_ITEM, params),\r\n // EPG / recording\r\n epg: (params: UidRequest) => client.post(PLAYOUT_URLS.EPG, params),\r\n recording: (params: UidRequest) => client.post(PLAYOUT_URLS.RECORDING, params),\r\n // Diff\r\n cleanDiff: (params: UidRequest) => client.post(PLAYOUT_URLS.CLEAN_DIFF, params),\r\n // Player info\r\n player: (serverId: number) => client.get(`${PLAYOUT_URLS.PLAYER}${serverId}`),\r\n playNextImmediate: (serverId: number) => client.post(`${PLAYOUT_URLS.PLAY_NEXT_IMMEDIATE}${serverId}`),\r\n checkPlaylist: (serverId: number) => client.get(`${PLAYOUT_URLS.CHECK_PLAYLIST}${serverId}`),\r\n workingCopy: (serverId: number) => client.post(`${PLAYOUT_URLS.WORKING_COPY}${serverId}`),\r\n mediaTypeStatistics: (serverId: number) => client.get(`${PLAYOUT_URLS.MEDIA_TYPE_STATISTICS}${serverId}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const RECORDING_URLS = {\r\n INDEX: '/FileRecording/index',\r\n DETAIL: '/FileRecording/detail',\r\n SAVE: '/FileRecording/save',\r\n DELETE: '/FileRecording/delete',\r\n VALIDATE: '/FileRecording/validate',\r\n START: '/FileRecording/start',\r\n STOP: '/FileRecording/stop',\r\n STOP_FILE: '/FileRecording/stopFile',\r\n MONITOR: '/FileRecording/monitor',\r\n MONITOR_SERVER_RECORDINGS: '/FileRecording/monitorServerRecordings',\r\n STOP_MONITOR: '/FileRecording/stopMonitor',\r\n OUTPUT_FILE: '/FileRecording/outputFile?fileRecordingID=',\r\n START_TIME: '/FileRecording/startTime?serverID=',\r\n // Recurrence rules\r\n RECURRENCE_RULES: '/FileRecording/recurrenceRules',\r\n RECURRENCE_FREQUENCES: '/FileRecording/recurrenceFrequences',\r\n DETAIL_RECURRENCE_RULE: '/FileRecording/detailRecurrenceRule',\r\n SAVE_RECURRENCE_RULE: '/FileRecording/saveRecurrenceRule',\r\n DELETE_RECURRENCE_RULE: '/FileRecording/deleteRecurrenceRule',\r\n VALIDATE_RECURRENCE_RULE: '/FileRecording/validateRecurrenceRule',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface FileRecording extends EntityBase {\r\n FileRecordingID?: number | null;\r\n NameNM?: string;\r\n ServerID?: number | null;\r\n Description?: string;\r\n IsActive?: boolean;\r\n StartDate?: string;\r\n Duration?: number | null;\r\n}\r\n\r\nexport interface RecurrenceRule extends EntityBase {\r\n RecurrenceRuleID?: number | null;\r\n FileRecordingID?: number | null;\r\n FrequencyID?: number | null;\r\n NameNM?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function recordingApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(RECORDING_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(RECORDING_URLS.DETAIL, params),\r\n save: (item: FileRecording) => client.post(RECORDING_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(RECORDING_URLS.DELETE, params),\r\n validate: (item: FileRecording) => client.post(RECORDING_URLS.VALIDATE, item),\r\n start: (params: UidRequest) => client.post(RECORDING_URLS.START, params),\r\n stop: (params: UidRequest) => client.post(RECORDING_URLS.STOP, params),\r\n stopFile: (params: UidRequest) => client.post(RECORDING_URLS.STOP_FILE, params),\r\n monitor: (params: UidRequest) => client.post(RECORDING_URLS.MONITOR, params),\r\n monitorServerRecordings: (params: UidRequest) => client.post(RECORDING_URLS.MONITOR_SERVER_RECORDINGS, params),\r\n stopMonitor: (params: UidRequest) => client.post(RECORDING_URLS.STOP_MONITOR, params),\r\n outputFile: (fileRecordingId: number) => client.get(`${RECORDING_URLS.OUTPUT_FILE}${fileRecordingId}`),\r\n startTime: (serverId: number) => client.get(`${RECORDING_URLS.START_TIME}${serverId}`),\r\n recurrenceRules: () => client.get(RECORDING_URLS.RECURRENCE_RULES),\r\n recurrenceFrequences: () => client.get(RECORDING_URLS.RECURRENCE_FREQUENCES),\r\n detailRecurrenceRule: (params: UidRequest) => client.post(RECORDING_URLS.DETAIL_RECURRENCE_RULE, params),\r\n saveRecurrenceRule: (item: RecurrenceRule) => client.post(RECORDING_URLS.SAVE_RECURRENCE_RULE, item),\r\n deleteRecurrenceRule: (params: UidRequest) => client.post(RECORDING_URLS.DELETE_RECURRENCE_RULE, params),\r\n validateRecurrenceRule: (item: RecurrenceRule) => client.post(RECORDING_URLS.VALIDATE_RECURRENCE_RULE, item),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\nexport const RULE_URLS = {\r\n INDEX: '/RuleItem/index',\r\n DETAIL: '/RuleItem/detail',\r\n SAVE: '/RuleItem/save',\r\n DELETE: '/RuleItem/delete',\r\n COPY: '/RuleItem/copy',\r\n VALIDATE: '/RuleItem/validate',\r\n RULE_TYPES: '/RuleItem/ruleTypes',\r\n PARAM_TYPES: '/RuleItem/paramTypes',\r\n GET_COMMAND: '/RuleItem/getCommand',\r\n SAVE_COMMAND: '/RuleItem/saveCommand',\r\n} as const;\r\n\r\nexport interface RuleItem extends EntityBase {\r\n RuleItemID?: number | null;\r\n NameNM?: string;\r\n RuleTypeID?: number | null;\r\n Description?: string;\r\n IsActive?: boolean;\r\n}\r\n\r\nexport function ruleApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(RULE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(RULE_URLS.DETAIL, params),\r\n save: (item: RuleItem) => client.post(RULE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(RULE_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(RULE_URLS.COPY, params),\r\n validate: (item: RuleItem) => client.post(RULE_URLS.VALIDATE, item),\r\n ruleTypes: () => client.get(RULE_URLS.RULE_TYPES),\r\n paramTypes: () => client.get(RULE_URLS.PARAM_TYPES),\r\n getCommand: (params: UidRequest) => client.post(RULE_URLS.GET_COMMAND, params),\r\n saveCommand: (params: UidRequest) => client.post(RULE_URLS.SAVE_COMMAND, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const SCHED_ITEM_URLS = {\r\n INDEX: '/SchedItem/index',\r\n DETAIL: '/SchedItem/detail',\r\n SAVE: '/SchedItem/save',\r\n DELETE: '/SchedItem/delete',\r\n VALIDATE: '/SchedItem/validate',\r\n // Operations\r\n INSERT_FILE: '/SchedItem/insertFile',\r\n INSERT_BLOCK: '/SchedItem/insertBlock',\r\n INSERT_GRAPHICS: '/SchedItem/insertGraphics',\r\n INSERT_SEC_GRAPHICS: '/SchedItem/insertSecGraphics',\r\n INSERT_CLIPBOARD: '/SchedItem/insertClipboard',\r\n APPLY_BLOCK: '/SchedItem/applyBlock',\r\n APPLY_FILE_DURATION: '/SchedItem/applyFileDuration',\r\n FILL_DURATION: '/SchedItem/fillDuration',\r\n SPLIT_ITEM: '/SchedItem/splitItem',\r\n MOVE_TO_END: '/SchedItem/moveToEnd',\r\n FIX_BY_EPG_START: '/SchedItem/fixByEPGstart',\r\n END_OF_PLAN: '/SchedItem/EndOfPlan',\r\n // Parallel/image\r\n ATTACH_IMAGE: '/SchedItem/attachImage',\r\n DETACH_IMAGE: '/SchedItem/detachImage',\r\n ATTACH_PARALLEL_BLOCK: '/SchedItem/attachParallelBlock',\r\n DETACH_PARALLEL_BLOCK: '/SchedItem/detachParallelBlock',\r\n DETACH_SEC_GRAPHICS: '/SchedItem/detachSecGraphics',\r\n // Lookups\r\n PARAM_KINDS: '/SchedItem/paramKinds',\r\n PARAM_TYPES: '/SchedItem/paramTypes',\r\n DICT_PARAM_KINDS: '/SchedItem/dictParamKinds',\r\n EPG_DATA: '/SchedItem/epgData?scheduleID=',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface SchedItem extends EntityBase {\r\n SchedItemID?: number | null;\r\n ScheduleID?: number | null;\r\n SchedPatternID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n Title?: string;\r\n Duration?: number | null;\r\n StartTime?: number | null;\r\n Ordinal?: number | null;\r\n ParentSchedItemID?: number | null;\r\n SchedItemTypeID?: number | null;\r\n IsFixed?: boolean;\r\n IsSkipped?: boolean;\r\n C_Duration?: string;\r\n C_StartTime?: string;\r\n C_EndTime?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function schedItemApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SCHED_ITEM_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SCHED_ITEM_URLS.DETAIL, params),\r\n save: (item: SchedItem) => client.post(SCHED_ITEM_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(SCHED_ITEM_URLS.DELETE, params),\r\n validate: (item: SchedItem) => client.post(SCHED_ITEM_URLS.VALIDATE, item),\r\n // Operations\r\n insertFile: (params: UidRequest) => client.post(SCHED_ITEM_URLS.INSERT_FILE, params),\r\n insertBlock: (params: UidRequest) => client.post(SCHED_ITEM_URLS.INSERT_BLOCK, params),\r\n insertGraphics: (params: UidRequest) => client.post(SCHED_ITEM_URLS.INSERT_GRAPHICS, params),\r\n insertSecGraphics: (params: UidRequest) => client.post(SCHED_ITEM_URLS.INSERT_SEC_GRAPHICS, params),\r\n insertClipboard: (params: UidRequest) => client.post(SCHED_ITEM_URLS.INSERT_CLIPBOARD, params),\r\n applyBlock: (params: UidRequest) => client.post(SCHED_ITEM_URLS.APPLY_BLOCK, params),\r\n applyFileDuration: (params: UidRequest) => client.post(SCHED_ITEM_URLS.APPLY_FILE_DURATION, params),\r\n fillDuration: (params: UidRequest) => client.post(SCHED_ITEM_URLS.FILL_DURATION, params),\r\n splitItem: (params: UidRequest) => client.post(SCHED_ITEM_URLS.SPLIT_ITEM, params),\r\n moveToEnd: (params: UidRequest) => client.post(SCHED_ITEM_URLS.MOVE_TO_END, params),\r\n fixByEpgStart: (params: UidRequest) => client.post(SCHED_ITEM_URLS.FIX_BY_EPG_START, params),\r\n endOfPlan: (params: UidRequest) => client.post(SCHED_ITEM_URLS.END_OF_PLAN, params),\r\n // Parallel/image\r\n attachImage: (params: UidRequest) => client.post(SCHED_ITEM_URLS.ATTACH_IMAGE, params),\r\n detachImage: (params: UidRequest) => client.post(SCHED_ITEM_URLS.DETACH_IMAGE, params),\r\n attachParallelBlock: (params: UidRequest) => client.post(SCHED_ITEM_URLS.ATTACH_PARALLEL_BLOCK, params),\r\n detachParallelBlock: (params: UidRequest) => client.post(SCHED_ITEM_URLS.DETACH_PARALLEL_BLOCK, params),\r\n detachSecGraphics: (params: UidRequest) => client.post(SCHED_ITEM_URLS.DETACH_SEC_GRAPHICS, params),\r\n // Lookups\r\n paramKinds: () => client.get(SCHED_ITEM_URLS.PARAM_KINDS),\r\n paramTypes: () => client.get(SCHED_ITEM_URLS.PARAM_TYPES),\r\n dictParamKinds: () => client.get(SCHED_ITEM_URLS.DICT_PARAM_KINDS),\r\n epgData: (scheduleId: number) => client.get[]>(`${SCHED_ITEM_URLS.EPG_DATA}${scheduleId}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem, ImageCache } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const SCHED_PATTERN_URLS = {\r\n INDEX: '/SchedPattern/index',\r\n DETAIL: '/SchedPattern/detail',\r\n SAVE: '/SchedPattern/save',\r\n SAVE_ITEMS: '/SchedPattern/saveItems',\r\n DELETE: '/SchedPattern/delete',\r\n DELETE_FROM: '/SchedPattern/deleteFrom',\r\n DELETE_ITEMS: '/SchedPattern/deleteItems',\r\n COPY: '/SchedPattern/copy',\r\n VALIDATE: '/SchedPattern/validate',\r\n CLEAN: '/SchedPattern/clean',\r\n LOCK: '/SchedPattern/lock',\r\n UNLOCK: '/SchedPattern/unlock',\r\n PLAY: '/SchedPattern/play',\r\n DEFAULT: '/SchedPattern/default',\r\n ARCHIVE: '/SchedPattern/archive',\r\n GENERATE: '/SchedPattern/generate',\r\n GENERATE_ASYNC: '/SchedPattern/generateAsync',\r\n GENERATE_VALIDATE: '/SchedPattern/generatevalidate',\r\n EFFECTIVE_DURATION: '/SchedPattern/effectiveDuration',\r\n OPEN_PLAN: '/SchedPattern/openPlan',\r\n APPLY_QUERY_BASED_BLOCK: '/SchedPattern/applyQueryBasedBlock',\r\n CHECK_USING_BLOCK: '/SchedPattern/checkUsingBlock',\r\n CLIPBOARD: '/SchedPattern/clipboard',\r\n CONSOLE: '/SchedPattern/console',\r\n PATTERN_TYPES: '/SchedPattern/patternTypes',\r\n GET_THUMBNAILS: '/SchedPattern/getThumbnails/',\r\n RUN_INGEST_WORKFLOW: '/SchedPattern/RunIngestWorkflow',\r\n // v2\r\n V2_JSON_EXPORT: '/v2/schedpattern/JSON/export',\r\n V2_JSON_IMPORT: '/v2/schedpattern/JSON/import/0',\r\n V2_XML_IMPORT: '/v2/schedpattern/XML/import/',\r\n V2_XML_ASRUN_LOG: '/v2/schedpattern/XML/asrunlog/',\r\n V2_XML_ASRUN_LOG_CLEAR: '/v2/schedpattern/XML/asrunlogClear/',\r\n} as const;\r\n\r\nexport const SCHED_PATTERN_ITEM_URLS = {\r\n INDEX: '/SchedPatternItem/index',\r\n INDEX_SIMPLE: '/SchedPatternItem/indexSimple',\r\n DETAIL: '/SchedPatternItem/detail',\r\n SAVE_SIMPLE: '/SchedPatternItem/savesimple',\r\n DELETE: '/SchedPatternItem/delete',\r\n DELETE_ASYNC: '/SchedPatternItem/deleteAsync',\r\n FILL_DURATION: '/SchedPatternItem/fillDuration',\r\n SPLIT_SUB_ITEMS: '/SchedPatternItem/splitSubItems',\r\n COPY_TO_CLIPBOARD: '/SchedPatternItem/copyToClipboard',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface SchedPattern extends EntityBase {\r\n SchedPatternID?: number | null;\r\n ScheduleID?: number | null;\r\n NameNM?: string;\r\n PatternTypeID?: number | null;\r\n DayDate?: string;\r\n StartTime?: number | null;\r\n Duration?: number | null;\r\n IsLocked?: boolean;\r\n IsArchived?: boolean;\r\n C_DayDate?: string;\r\n C_StartTime?: string;\r\n C_Duration?: string;\r\n C_EndTime?: string;\r\n}\r\n\r\nexport interface SchedPatternItem extends EntityBase {\r\n SchedPatternItemID?: number | null;\r\n SchedPatternID?: number | null;\r\n FileID?: number | null;\r\n NameNM?: string;\r\n Duration?: number | null;\r\n StartTime?: number | null;\r\n Ordinal?: number | null;\r\n C_Duration?: string;\r\n C_StartTime?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function schedPatternApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SCHED_PATTERN_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.DETAIL, params),\r\n save: (item: SchedPattern) => client.post(SCHED_PATTERN_URLS.SAVE, item),\r\n saveItems: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.SAVE_ITEMS, params),\r\n delete: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.DELETE, params),\r\n deleteFrom: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.DELETE_FROM, params),\r\n deleteItems: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.DELETE_ITEMS, params),\r\n copy: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.COPY, params),\r\n validate: (item: SchedPattern) => client.post(SCHED_PATTERN_URLS.VALIDATE, item),\r\n clean: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.CLEAN, params),\r\n lock: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.LOCK, params),\r\n unlock: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.UNLOCK, params),\r\n play: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.PLAY, params),\r\n default: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.DEFAULT, params),\r\n archive: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.ARCHIVE, params),\r\n generate: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.GENERATE, params),\r\n generateAsync: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.GENERATE_ASYNC, params),\r\n generateValidate: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.GENERATE_VALIDATE, params),\r\n effectiveDuration: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.EFFECTIVE_DURATION, params),\r\n openPlan: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.OPEN_PLAN, params),\r\n applyQueryBasedBlock: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.APPLY_QUERY_BASED_BLOCK, params),\r\n checkUsingBlock: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.CHECK_USING_BLOCK, params),\r\n clipboard: () => client.get(SCHED_PATTERN_URLS.CLIPBOARD),\r\n console: () => client.get(SCHED_PATTERN_URLS.CONSOLE),\r\n patternTypes: () => client.get(SCHED_PATTERN_URLS.PATTERN_TYPES),\r\n getThumbnails: (patternId: number) => client.get(`${SCHED_PATTERN_URLS.GET_THUMBNAILS}${patternId}`),\r\n runIngestWorkflow: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.RUN_INGEST_WORKFLOW, params),\r\n // v2 import/export\r\n exportJson: (params: UidRequest) => client.post(SCHED_PATTERN_URLS.V2_JSON_EXPORT, params),\r\n importJson: (formData: FormData) => client.postFile(SCHED_PATTERN_URLS.V2_JSON_IMPORT, formData),\r\n importXml: (patternId: number, formData: FormData) => client.postFile(`${SCHED_PATTERN_URLS.V2_XML_IMPORT}${patternId}`, formData),\r\n asrunLogExportUrl: (id: number) => client.getDownloadUrl(`${SCHED_PATTERN_URLS.V2_XML_ASRUN_LOG}${id}`),\r\n asrunLogExportClearUrl: (id: number) => client.getDownloadUrl(`${SCHED_PATTERN_URLS.V2_XML_ASRUN_LOG_CLEAR}${id}`),\r\n };\r\n}\r\n\r\nexport function schedPatternItemApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SCHED_PATTERN_ITEM_URLS.INDEX, params),\r\n indexSimple: (params: FilterParamList) => client.post(SCHED_PATTERN_ITEM_URLS.INDEX_SIMPLE, params),\r\n detail: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.DETAIL, params),\r\n saveSimple: (item: SchedPatternItem) => client.post(SCHED_PATTERN_ITEM_URLS.SAVE_SIMPLE, item),\r\n delete: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.DELETE, params),\r\n deleteAsync: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.DELETE_ASYNC, params),\r\n fillDuration: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.FILL_DURATION, params),\r\n splitSubItems: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.SPLIT_SUB_ITEMS, params),\r\n copyToClipboard: (params: UidRequest) => client.post(SCHED_PATTERN_ITEM_URLS.COPY_TO_CLIPBOARD, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, SelectItem } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const SCHEDULE_URLS = {\r\n INDEX: '/Schedule/index',\r\n DETAIL: '/Schedule/detail',\r\n SAVE: '/Schedule/save',\r\n DELETE: '/Schedule/delete',\r\n COPY: '/Schedule/copy',\r\n VALIDATE: '/Schedule/validate',\r\n CLEAN: '/Schedule/clean',\r\n MAINTENANCE: '/Schedule/maintenance',\r\n REBUILD: '/Schedule/rebuild',\r\n PLAY: '/Schedule/play',\r\n PLAY_CHANNEL_PLAYLIST: '/Schedule/playChannelPlaylist',\r\n PLAY_CHANNEL_SCHEDULE: '/Schedule/playChannelSchedule',\r\n BREAK: '/Schedule/break',\r\n BREAK_PLAY: '/Schedule/breakPlay',\r\n DURATION: '/Schedule/duration',\r\n GROUP: '/Schedule/group',\r\n SELECT: '/Schedule/select',\r\n LAST: '/Schedule/last',\r\n SYNC: '/Schedule/sync',\r\n REVERT: '/Schedule/revert',\r\n RESTORE_LONG_TERM: '/Schedule/restoreLongTerm',\r\n APPEND_SCHEDULE: '/Schedule/appendSchedule',\r\n APPEND_LOOP: '/Schedule/appendLoop',\r\n SET_LOOP_MAIN: '/Schedule/setLoopMain',\r\n SEEK_NEXT_IMMEDIATE: '/Schedule/seekNextImmediate',\r\n REPEATING_PREFERENCE_TYPE: '/Schedule/repeatingPreferenceType',\r\n RUN_INGEST_WORKFLOW: '/Schedule/RunIngestWorkflow',\r\n RUN_WORKING_COPY: '/Schedule/RunWorkingCopy',\r\n RUN_WORKING_WIPE: '/Schedule/RunWorkingWipe',\r\n // v2 XML export/import\r\n V2_XML_EXPORT: '/v2/schedule/XML/export/',\r\n V2_XML_IMPORT: '/v2/schedule/XML/import/',\r\n V2_XML_INGEST_LIST: '/v2/schedule/XML/ingestlist/',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Schedule extends EntityBase {\r\n ScheduleID?: number | null;\r\n NameNM?: string;\r\n ServerID?: number | null;\r\n DayDate?: string;\r\n BcastDayDate?: string;\r\n StartTime?: number | null;\r\n IsBlock?: boolean;\r\n IsRunning?: boolean;\r\n IsExpanded?: boolean;\r\n WorkflowID?: number | null;\r\n C_StartTime?: string;\r\n C_DayDate?: string;\r\n C_BcastDayDate?: string;\r\n C_CreatedDate?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function scheduleApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SCHEDULE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SCHEDULE_URLS.DETAIL, params),\r\n save: (item: Schedule) => client.post(SCHEDULE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(SCHEDULE_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(SCHEDULE_URLS.COPY, params),\r\n validate: (item: Schedule) => client.post(SCHEDULE_URLS.VALIDATE, item),\r\n clean: (params: UidRequest) => client.post(SCHEDULE_URLS.CLEAN, params),\r\n maintenance: (params: UidRequest) => client.post(SCHEDULE_URLS.MAINTENANCE, params),\r\n rebuild: (params: UidRequest) => client.post(SCHEDULE_URLS.REBUILD, params),\r\n play: (params: UidRequest) => client.post(SCHEDULE_URLS.PLAY, params),\r\n playChannelPlaylist: (params: UidRequest) => client.post(SCHEDULE_URLS.PLAY_CHANNEL_PLAYLIST, params),\r\n playChannelSchedule: (params: UidRequest) => client.post(SCHEDULE_URLS.PLAY_CHANNEL_SCHEDULE, params),\r\n break: (params: UidRequest) => client.post(SCHEDULE_URLS.BREAK, params),\r\n breakPlay: (params: UidRequest) => client.post(SCHEDULE_URLS.BREAK_PLAY, params),\r\n duration: (params: UidRequest) => client.post(SCHEDULE_URLS.DURATION, params),\r\n group: (params: UidRequest) => client.post(SCHEDULE_URLS.GROUP, params),\r\n select: (params: UidRequest) => client.post(SCHEDULE_URLS.SELECT, params),\r\n last: () => client.get(SCHEDULE_URLS.LAST),\r\n sync: (params: UidRequest) => client.post(SCHEDULE_URLS.SYNC, params),\r\n revert: (params: UidRequest) => client.post(SCHEDULE_URLS.REVERT, params),\r\n restoreLongTerm: (params: UidRequest) => client.post(SCHEDULE_URLS.RESTORE_LONG_TERM, params),\r\n appendSchedule: (params: UidRequest) => client.post(SCHEDULE_URLS.APPEND_SCHEDULE, params),\r\n appendLoop: (params: UidRequest) => client.post(SCHEDULE_URLS.APPEND_LOOP, params),\r\n setLoopMain: (params: UidRequest) => client.post(SCHEDULE_URLS.SET_LOOP_MAIN, params),\r\n seekNextImmediate: (params: UidRequest) => client.post(SCHEDULE_URLS.SEEK_NEXT_IMMEDIATE, params),\r\n repeatingPreferenceType: () => client.get(SCHEDULE_URLS.REPEATING_PREFERENCE_TYPE),\r\n runIngestWorkflow: (params: UidRequest) => client.post(SCHEDULE_URLS.RUN_INGEST_WORKFLOW, params),\r\n runWorkingCopy: (params: UidRequest) => client.post(SCHEDULE_URLS.RUN_WORKING_COPY, params),\r\n runWorkingWipe: (params: UidRequest) => client.post(SCHEDULE_URLS.RUN_WORKING_WIPE, params),\r\n exportXmlUrl: (id: number) => client.getDownloadUrl(`${SCHEDULE_URLS.V2_XML_EXPORT}${id}`),\r\n importXml: (scheduleId: number, formData: FormData) => client.postFile(`${SCHEDULE_URLS.V2_XML_IMPORT}${scheduleId}`, formData),\r\n exportIngestListUrl: (id: number) => client.getDownloadUrl(`${SCHEDULE_URLS.V2_XML_INGEST_LIST}${id}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, SuccessModelType, EntityBase, SelectItem, ImageCache } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const SERVER_URLS = {\r\n INDEX: '/Server/index',\r\n DETAIL: '/Server/detail',\r\n SAVE: '/Server/save',\r\n SAVE_SIMPLE: '/Server/saveSimple',\r\n DELETE: '/Server/delete',\r\n VALIDATE: '/Server/validate',\r\n SELECT: '/Server/select',\r\n SELECT_ALT: '/Server/Select',\r\n START: '/Server/start',\r\n STOP: '/Server/stop',\r\n START_SERVICE: '/Server/startService',\r\n STOP_SERVICE: '/Server/stopService',\r\n SEND_COMMAND: '/Server/sendCommand',\r\n CHECK_MACHINE_SERVER: '/Server/checkMachineServer',\r\n GET_CHANNEL_TOKEN: '/Server/getChannelToken',\r\n GET_INIT_COMMANDS: '/Server/getInitCommands',\r\n GET_LOGO: '/Server/getLogo/',\r\n COMMAND_TYPES: '/Server/commandTypes',\r\n PARAMETER_TYPES: '/Server/parameterTypes',\r\n PROPERTY_TYPES: '/Server/propertyTypes',\r\n TIME_ZONES: '/Server/timeZones',\r\n DEVICE_STATE_SEVERITIES: '/Server/deviceStateSeverities',\r\n GET_CONFIG_CATEGORY: '/Server/getConfigCategory',\r\n MONITORING: '/Server/monitoring/',\r\n PLAYLIST: '/Server/playlist?serverID=',\r\n RECORDING: '/Server/recording?serverID=',\r\n ON_AIR_LAYERS: '/Server/onairLayers?serverID=',\r\n ON_AIR_LAYERS_ALT: '/Server/onairlayers/',\r\n ON_AIR_LAYERS_STATUS: '/Server/onairlayers/status?serverID=',\r\n FILE_LIST: '/Server/fileList/',\r\n FILE_PREVIEWS: '/Server/filePreviews?serverID=',\r\n REPLACE_PARAMETERS: '/Server/replaceParameters',\r\n DELETE_RECORDING: '/Server/deleteRecording',\r\n STOP_RECORDING: '/Server/stopRecording',\r\n // Preview\r\n PREVIEW_FILE: '/Server/previewFile',\r\n PREVIEW_FILE_PLAY: '/Server/previewFilePlay',\r\n PREVIEW_FILE_UNLOAD: '/Server/previewFileUnload',\r\n PREVIEW_FILES_STOP: '/Server/previewFilesStop',\r\n PREVIEW_FILE_STATUS: '/Server/previewFileStatus?fileID=',\r\n PREVIEW_COMMANDS: '/Server/previewCommands/',\r\n PREVIEW_COMMAND: '/Server/previewCommand/',\r\n PREVIEW_COMMAND_SAVE: '/Server/previewCommand/save',\r\n PREVIEW_COMMAND_DELETE: '/Server/previewCommand/delete/',\r\n PREVIEW_COMMAND_VALIDATE: '/Server/previewCommand/validate',\r\n // HLS\r\n HLS_PREVIEW_START: '/Server/hlsPreviewStart',\r\n HLS_PREVIEW_STOP: '/Server/hlsPreviewStop',\r\n HLS_FILE_PREVIEW_START: '/Server/hlsFilePreviewStart',\r\n HLS_FILE_PREVIEW_STOP: '/Server/hlsFilePreviewStop',\r\n HLS_SAMPLER_IS_RUNNING: '/Server/hlsSamplerIsRunning?serverID=',\r\n HLS_SAMPLER_RESET: '/Server/hlsSamplerReset',\r\n // ServerBox\r\n BACKUP_SERVER_BOX: '/Server/backupServerBox',\r\n BACKUP_SERVER_BOX_VERSION: '/Server/backupServerBoxVersion',\r\n RESTORE_SERVER_BOX: '/Server/restoreServerBox',\r\n SWITCH_SERVER_BOX: '/Server/switchServerBox',\r\n START_PREVIEW_SERVER_BOX: '/Server/startPreviewServerBox',\r\n STOP_PREVIEW_SERVER_BOX: '/Server/stopPreviewServerBox',\r\n START_SEC_SERVER_BOX: '/Server/startSecServerBox',\r\n STOP_SEC_SERVER_BOX: '/Server/stopSecServerBox',\r\n // Primary render-box maintenance (SCP-1143). Unlike the secondary pair these have no\r\n // /pba/internal AllowAnonymous twin — decision D4, authenticated web API only.\r\n START_PRI_SERVER_BOX: '/Server/startPriServerBox',\r\n STOP_PRI_SERVER_BOX: '/Server/stopPriServerBox',\r\n RESTART_PRI_SERVER_BOX: '/Server/restartPriServerBox',\r\n // StreamServer\r\n STREAM_SERVER_INDEX: '/Server/StreamServer/index',\r\n STREAM_SERVER_DETAIL: '/Server/StreamServer/detail',\r\n STREAM_SERVER_SAVE: '/Server/StreamServer/save',\r\n STREAM_SERVER_DELETE: '/Server/StreamServer/delete',\r\n STREAM_SERVER_START: '/Server/StreamServer/start',\r\n STREAM_SERVER_RESTART: '/Server/StreamServer/restart',\r\n STREAM_SERVER_VISIBLE: '/Server/StreamServer/visible',\r\n SWITCH_STREAM_SERVER: '/Server/switchStreamServer',\r\n RESTART_STREAM_SERVER: '/Server/restartStreamServer',\r\n // Wowza\r\n CREATE_WOWZA_APP: '/Server/createWowzaApp',\r\n DELETE_WOWZA_APP: '/Server/deleteWowzaApp',\r\n RESTART_WOWZA_APP: '/Server/restartWowzaApp',\r\n GET_WOWZA_APP_INFO: '/Server/getWowzaAppInfo',\r\n GET_WOWZA_IN_STREAMS: '/Server/getWowzaInStreams?id=',\r\n WOWZA_TARGET_ACTION: '/Server/wowzaTargetAction',\r\n // YouTube\r\n YOUTUBE_CHANNELS: '/Server/youtubeChannels',\r\n YOUTUBE_RELEASE_TOKEN: '/Server/youtubeReleaseToken',\r\n} as const;\r\n\r\nexport const SERVER_BOX_URLS = {\r\n INDEX: '/ServerBox/index',\r\n DETAIL: '/ServerBox/detail',\r\n SAVE: '/ServerBox/save',\r\n DELETE: '/ServerBox/delete',\r\n VALIDATE: '/ServerBox/validate',\r\n ROOT: '/ServerBox/',\r\n KINDS: '/ServerBox/kinds',\r\n COLLECTION: '/ServerBox/collection/',\r\n AVAILABLES: '/ServerBox/availables?id=',\r\n LAUNCHERS: '/ServerBox/launchers',\r\n STORAGES: '/ServerBox/storages',\r\n FILE_STORAGES: '/ServerBox/fileStorages',\r\n FILE_STORAGES_STATUS: '/ServerBox/fileStoragesStatus',\r\n INIT_STORAGES: '/ServerBox/initStorages',\r\n INIT_STORAGES_BY_SERVER: '/ServerBox/initStorages?serverID=',\r\n GET_CREDENTIALS: '/ServerBox/getCredentials?serverBoxID=',\r\n SEND_COMMAND: '/ServerBox/sendCommand',\r\n SET_TIME_SHIFT_SEC: '/ServerBox/settimeshiftsec',\r\n START: '/ServerBox/start',\r\n STOP: '/ServerBox/stop',\r\n // Operator-driven maintenance marker (SCP-1155). The escape hatch for a flag that would\r\n // otherwise be unreachable once its stop/start pair was interrupted.\r\n SET_MAINTENANCE: '/ServerBox/setMaintenance',\r\n CLEAR_MAINTENANCE: '/ServerBox/clearMaintenance',\r\n // Specific server types\r\n PLAYLIST_SERVERS: '/ServerBox/playlistservers?id=',\r\n RECORDING_SERVERS: '/ServerBox/recordingServers?id=',\r\n EXPORT_SERVERS: '/ServerBox/exportServers?id=',\r\n HTTP_SERVERS: '/ServerBox/httpservers',\r\n OPENGL_SERVERS: '/ServerBox/openglservers',\r\n TIME_SERVERS: '/ServerBox/timeservers',\r\n INGEST_SERVERS: '/ServerBox/ingestservers',\r\n FSW_SERVERS: '/ServerBox/FSWServers',\r\n BXF_MESSAGE_SERVERS: '/ServerBox/bxfMessageServers',\r\n MAM_INTEGRATION_SERVERS: '/ServerBox/mamIntegrationServers',\r\n MAM_INTEGRATION_SERVERS_BY_ID: '/ServerBox/mamIntegrationServers?id=',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Server extends EntityBase {\r\n ServerID?: number | null;\r\n NameNM?: string;\r\n ServerCategoryID?: number | null;\r\n AccountID?: number | null;\r\n IsActive?: boolean;\r\n Description?: string;\r\n MachineName?: string;\r\n Port?: number | null;\r\n\r\n /**\r\n * CHANNEL-level liveness, dual-node aware.\r\n *\r\n * True while EITHER render-box is up, so on a dual-node channel this stays true while\r\n * the primary is stopped for maintenance and the secondary carries air.\r\n *\r\n * This is NOT the primary box's state - that is `ServerBoxIsRunning`. Use `IsRunning`\r\n * for \"is the channel on air\" (the Start/Stop channel controls); never to colour a\r\n * per-box indicator, or it will read green while the primary is down.\r\n *\r\n * Before SCP-1129 this field did mean the primary box alone. The meaning changed.\r\n * @see https://streamcircle.atlassian.net/browse/SCP-1126\r\n */\r\n IsRunning?: boolean;\r\n\r\n // --- primary/secondary render-box configuration --------------------------------\r\n /** Channel is configured as dual-node, i.e. it has a usable secondary render-box. */\r\n IsDualNode?: boolean;\r\n /** Current crash/switch mode: `A` auto, `O` one-way, `M` manual, `E` emergency maintenance. */\r\n SwitchType?: string;\r\n /** Mode copied back into `SwitchType` on every channel start. */\r\n SwitchTypeDefault?: string;\r\n /**\r\n * Operator lock that blocks primary/secondary switching - manual, automatic and the\r\n * client-side offline ID swap alike.\r\n *\r\n * Deliberately a separate field from `SwitchType`, which is reset from\r\n * `SwitchTypeDefault` on every channel start and so cannot hold a durable lock.\r\n */\r\n IsSwitchBlocked?: boolean;\r\n\r\n // --- per-box status ------------------------------------------------------------\r\n /** Primary render-box process is running (resolved from the loaded ServerBox). */\r\n ServerOpenGLIsRunning?: boolean;\r\n /** Secondary render-box process is running (resolved from the loaded ServerBox). */\r\n SecondServerOpenGLIsRunning?: boolean;\r\n\r\n /**\r\n * Raw primary render-box state, projected by `Server_VW`. This is the pre-SCP-1129\r\n * meaning of `IsRunning`.\r\n *\r\n * Snapshot from when the row was read, and PLAYOUT CHANNELS ONLY: the view's `box`\r\n * alias joins on `ServerBoxID`, which recorders leave null - for a recorder this\r\n * reports the wrong device. Guard any use with `ChannelKind === Channel`.\r\n */\r\n ServerBoxIsRunning?: boolean;\r\n /** Primary render-box is deliberately stopped for maintenance. Same caveats as `ServerBoxIsRunning`. */\r\n ServerBoxIsMaintenance?: boolean;\r\n /** Raw secondary render-box state, projected by `Server_VW`. */\r\n SecondServerBoxIsRunning?: boolean;\r\n /** Secondary render-box is deliberately stopped for maintenance. */\r\n SecondServerBoxIsMaintenance?: boolean;\r\n}\r\n\r\nexport interface ServerBox extends EntityBase {\r\n ServerBoxID?: number | null;\r\n ServerID?: number | null;\r\n NameNM?: string;\r\n Kind?: string;\r\n IsActive?: boolean;\r\n Description?: string;\r\n}\r\n\r\nexport interface StreamServer extends EntityBase {\r\n StreamServerID?: number | null;\r\n ServerID?: number | null;\r\n NameNM?: string;\r\n IsActive?: boolean;\r\n IsVisible?: boolean;\r\n}\r\n\r\nexport interface PreviewCommand extends EntityBase {\r\n PreviewCommandID?: number | null;\r\n ServerID?: number | null;\r\n NameNM?: string;\r\n Command?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function serverApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SERVER_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SERVER_URLS.DETAIL, params),\r\n save: (item: Server) => client.post(SERVER_URLS.SAVE, item),\r\n saveSimple: (item: Server) => client.post(SERVER_URLS.SAVE_SIMPLE, item),\r\n delete: (params: UidRequest) => client.post(SERVER_URLS.DELETE, params),\r\n validate: (item: Server) => client.post(SERVER_URLS.VALIDATE, item),\r\n select: () => client.get(SERVER_URLS.SELECT),\r\n start: (params: UidRequest) => client.post(SERVER_URLS.START, params),\r\n stop: (params: UidRequest) => client.post(SERVER_URLS.STOP, params),\r\n startService: (params: UidRequest) => client.post(SERVER_URLS.START_SERVICE, params),\r\n stopService: (params: UidRequest) => client.post(SERVER_URLS.STOP_SERVICE, params),\r\n sendCommand: (params: UidRequest) => client.post(SERVER_URLS.SEND_COMMAND, params),\r\n checkMachineServer: (params: UidRequest) => client.post(SERVER_URLS.CHECK_MACHINE_SERVER, params),\r\n getChannelToken: (params: UidRequest) => client.post(SERVER_URLS.GET_CHANNEL_TOKEN, params),\r\n getInitCommands: (params: UidRequest) => client.post(SERVER_URLS.GET_INIT_COMMANDS, params),\r\n getLogo: (serverId: number) => client.post(`${SERVER_URLS.GET_LOGO}${serverId}`),\r\n commandTypes: () => client.get(SERVER_URLS.COMMAND_TYPES),\r\n parameterTypes: () => client.get(SERVER_URLS.PARAMETER_TYPES),\r\n propertyTypes: () => client.get(SERVER_URLS.PROPERTY_TYPES),\r\n timeZones: () => client.get(SERVER_URLS.TIME_ZONES),\r\n deviceStateSeverities: () => client.get(SERVER_URLS.DEVICE_STATE_SEVERITIES),\r\n getConfigCategory: () => client.get(SERVER_URLS.GET_CONFIG_CATEGORY),\r\n monitoring: (serverId: number) => client.get(`${SERVER_URLS.MONITORING}${serverId}`),\r\n playlist: (serverId: number) => client.get(`${SERVER_URLS.PLAYLIST}${serverId}`),\r\n recording: (serverId: number) => client.get(`${SERVER_URLS.RECORDING}${serverId}`),\r\n onAirLayers: (serverId: number) => client.get(`${SERVER_URLS.ON_AIR_LAYERS}${serverId}`),\r\n onAirLayersPost: (serverId: number, params?: UidRequest) => client.post(`${SERVER_URLS.ON_AIR_LAYERS_ALT}${serverId}`, params),\r\n onAirLayersStatus: (serverId: number) => client.get(`${SERVER_URLS.ON_AIR_LAYERS_STATUS}${serverId}`),\r\n fileList: (serverId: number) => client.get(`${SERVER_URLS.FILE_LIST}${serverId}`),\r\n filePreviews: (serverId: number) => client.get(`${SERVER_URLS.FILE_PREVIEWS}${serverId}`),\r\n replaceParameters: (params: UidRequest) => client.post(SERVER_URLS.REPLACE_PARAMETERS, params),\r\n deleteRecording: (params: UidRequest) => client.post(SERVER_URLS.DELETE_RECORDING, params),\r\n stopRecording: (params: UidRequest) => client.post(SERVER_URLS.STOP_RECORDING, params),\r\n // Preview\r\n previewFile: (params: UidRequest) => client.post(SERVER_URLS.PREVIEW_FILE, params),\r\n previewFilePlay: (params: UidRequest) => client.post(SERVER_URLS.PREVIEW_FILE_PLAY, params),\r\n previewFileUnload: (params: UidRequest) => client.post(SERVER_URLS.PREVIEW_FILE_UNLOAD, params),\r\n previewFilesStop: (params: UidRequest) => client.post(SERVER_URLS.PREVIEW_FILES_STOP, params),\r\n previewFileStatus: (fileId: number) => client.get(`${SERVER_URLS.PREVIEW_FILE_STATUS}${fileId}`),\r\n previewCommands: (serverId: number) => client.get(`${SERVER_URLS.PREVIEW_COMMANDS}${serverId}`),\r\n previewCommand: (id: number) => client.get(`${SERVER_URLS.PREVIEW_COMMAND}${id}`),\r\n previewCommandSave: (item: PreviewCommand) => client.post(SERVER_URLS.PREVIEW_COMMAND_SAVE, item),\r\n previewCommandDelete: (id: number) => client.post(`${SERVER_URLS.PREVIEW_COMMAND_DELETE}${id}`),\r\n previewCommandValidate: (item: PreviewCommand) => client.post(SERVER_URLS.PREVIEW_COMMAND_VALIDATE, item),\r\n // HLS\r\n hlsPreviewStart: (params: UidRequest) => client.post(SERVER_URLS.HLS_PREVIEW_START, params),\r\n hlsPreviewStop: (params: UidRequest) => client.post(SERVER_URLS.HLS_PREVIEW_STOP, params),\r\n hlsFilePreviewStart: (params: UidRequest) => client.post(SERVER_URLS.HLS_FILE_PREVIEW_START, params),\r\n hlsFilePreviewStop: (params: UidRequest) => client.post(SERVER_URLS.HLS_FILE_PREVIEW_STOP, params),\r\n hlsSamplerIsRunning: (serverId: number) => client.get(`${SERVER_URLS.HLS_SAMPLER_IS_RUNNING}${serverId}`),\r\n hlsSamplerReset: (params: UidRequest) => client.post(SERVER_URLS.HLS_SAMPLER_RESET, params),\r\n // ServerBox operations on Server\r\n backupServerBox: (params: UidRequest) => client.post(SERVER_URLS.BACKUP_SERVER_BOX, params),\r\n backupServerBoxVersion: (params: UidRequest) => client.post(SERVER_URLS.BACKUP_SERVER_BOX_VERSION, params),\r\n restoreServerBox: (params: UidRequest) => client.post(SERVER_URLS.RESTORE_SERVER_BOX, params),\r\n switchServerBox: (params: UidRequest) => client.post(SERVER_URLS.SWITCH_SERVER_BOX, params),\r\n startPreviewServerBox: (params: UidRequest) => client.post(SERVER_URLS.START_PREVIEW_SERVER_BOX, params),\r\n stopPreviewServerBox: (params: UidRequest) => client.post(SERVER_URLS.STOP_PREVIEW_SERVER_BOX, params),\r\n startSecServerBox: (params: UidRequest) => client.post(SERVER_URLS.START_SEC_SERVER_BOX, params),\r\n stopSecServerBox: (params: UidRequest) => client.post(SERVER_URLS.STOP_SEC_SERVER_BOX, params),\r\n /**\r\n * Stop the PRIMARY render-box for maintenance, leaving the channel on air on the\r\n * secondary (SCP-1143). Refused on a single-node channel, or when the secondary\r\n * cannot carry air — decision D2. The refusal arrives as `success: false` with the\r\n * reason in `message`, not as a rejected promise.\r\n */\r\n stopPriServerBox: (params: UidRequest) => client.post(SERVER_URLS.STOP_PRI_SERVER_BOX, params),\r\n /** Start the PRIMARY render-box again and re-arm it with the airing item (SCP-1143). */\r\n startPriServerBox: (params: UidRequest) => client.post(SERVER_URLS.START_PRI_SERVER_BOX, params),\r\n /** Stop then start the PRIMARY render-box in one call (SCP-1143). */\r\n restartPriServerBox: (params: UidRequest) => client.post(SERVER_URLS.RESTART_PRI_SERVER_BOX, params),\r\n // StreamServer\r\n streamServerIndex: (params: FilterParamList) => client.post(SERVER_URLS.STREAM_SERVER_INDEX, params),\r\n streamServerDetail: (params: UidRequest) => client.post(SERVER_URLS.STREAM_SERVER_DETAIL, params),\r\n streamServerSave: (item: StreamServer) => client.post(SERVER_URLS.STREAM_SERVER_SAVE, item),\r\n streamServerDelete: (params: UidRequest) => client.post(SERVER_URLS.STREAM_SERVER_DELETE, params),\r\n streamServerStart: (params: UidRequest) => client.post(SERVER_URLS.STREAM_SERVER_START, params),\r\n streamServerRestart: (params: UidRequest) => client.post(SERVER_URLS.STREAM_SERVER_RESTART, params),\r\n streamServerVisible: (params: UidRequest) => client.post(SERVER_URLS.STREAM_SERVER_VISIBLE, params),\r\n switchStreamServer: (params: UidRequest) => client.post(SERVER_URLS.SWITCH_STREAM_SERVER, params),\r\n restartStreamServer: (params: UidRequest) => client.post(SERVER_URLS.RESTART_STREAM_SERVER, params),\r\n // Wowza\r\n createWowzaApp: (params: UidRequest) => client.post(SERVER_URLS.CREATE_WOWZA_APP, params),\r\n deleteWowzaApp: (params: UidRequest) => client.post(SERVER_URLS.DELETE_WOWZA_APP, params),\r\n restartWowzaApp: (params: UidRequest) => client.post(SERVER_URLS.RESTART_WOWZA_APP, params),\r\n getWowzaAppInfo: (params: UidRequest) => client.post(SERVER_URLS.GET_WOWZA_APP_INFO, params),\r\n getWowzaInStreams: (id: number) => client.get(`${SERVER_URLS.GET_WOWZA_IN_STREAMS}${id}`),\r\n wowzaTargetAction: (params: UidRequest) => client.post(SERVER_URLS.WOWZA_TARGET_ACTION, params),\r\n // YouTube\r\n youtubeChannels: (params: UidRequest) => client.post(SERVER_URLS.YOUTUBE_CHANNELS, params),\r\n youtubeReleaseToken: (params: UidRequest) => client.post(SERVER_URLS.YOUTUBE_RELEASE_TOKEN, params),\r\n };\r\n}\r\n\r\nexport function serverBoxApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SERVER_BOX_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SERVER_BOX_URLS.DETAIL, params),\r\n save: (item: ServerBox) => client.post(SERVER_BOX_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(SERVER_BOX_URLS.DELETE, params),\r\n validate: (item: ServerBox) => client.post(SERVER_BOX_URLS.VALIDATE, item),\r\n root: (serverId: number) => client.post(`${SERVER_BOX_URLS.ROOT}${serverId}`),\r\n kinds: () => client.get(SERVER_BOX_URLS.KINDS),\r\n collection: (serverBoxId: number) => client.get(`${SERVER_BOX_URLS.COLLECTION}${serverBoxId}`),\r\n availables: (serverId: number) => client.get(`${SERVER_BOX_URLS.AVAILABLES}${serverId}`),\r\n launchers: () => client.get(SERVER_BOX_URLS.LAUNCHERS),\r\n storages: () => client.get(SERVER_BOX_URLS.STORAGES),\r\n fileStorages: () => client.get(SERVER_BOX_URLS.FILE_STORAGES),\r\n fileStoragesStatus: () => client.get(SERVER_BOX_URLS.FILE_STORAGES_STATUS),\r\n initStorages: (params?: UidRequest) => client.post(SERVER_BOX_URLS.INIT_STORAGES, params),\r\n initStoragesByServer: (serverId: number) => client.post(`${SERVER_BOX_URLS.INIT_STORAGES_BY_SERVER}${serverId}`),\r\n getCredentials: (serverBoxId: number) => client.get(`${SERVER_BOX_URLS.GET_CREDENTIALS}${serverBoxId}`),\r\n sendCommand: (params: UidRequest) => client.post(SERVER_BOX_URLS.SEND_COMMAND, params),\r\n setTimeShiftSec: (params: UidRequest) => client.post(SERVER_BOX_URLS.SET_TIME_SHIFT_SEC, params),\r\n start: (params: UidRequest) => client.post(SERVER_BOX_URLS.START, params),\r\n stop: (params: UidRequest) => client.post(SERVER_BOX_URLS.STOP, params),\r\n /**\r\n * Flag a device for maintenance by hand, with NO expiry — it stays until cleared or until the\r\n * device starts successfully. Admin only. @see SCP-1155\r\n */\r\n setMaintenance: (params: UidRequest) => client.post(SERVER_BOX_URLS.SET_MAINTENANCE, params),\r\n /**\r\n * Clear the maintenance flag by hand. Idempotent, and deliberately works even when the caller's\r\n * view of the flag is stale — it is the recovery action for a stuck marker. Admin only.\r\n */\r\n clearMaintenance: (params: UidRequest) => client.post(SERVER_BOX_URLS.CLEAR_MAINTENANCE, params),\r\n playlistServers: (serverId: number) => client.get(`${SERVER_BOX_URLS.PLAYLIST_SERVERS}${serverId}`),\r\n recordingServers: (serverId: number) => client.get(`${SERVER_BOX_URLS.RECORDING_SERVERS}${serverId}`),\r\n exportServers: (serverId: number) => client.get(`${SERVER_BOX_URLS.EXPORT_SERVERS}${serverId}`),\r\n httpServers: () => client.get(SERVER_BOX_URLS.HTTP_SERVERS),\r\n openglServers: () => client.get(SERVER_BOX_URLS.OPENGL_SERVERS),\r\n timeServers: () => client.get(SERVER_BOX_URLS.TIME_SERVERS),\r\n ingestServers: () => client.get(SERVER_BOX_URLS.INGEST_SERVERS),\r\n fswServers: () => client.get(SERVER_BOX_URLS.FSW_SERVERS),\r\n bxfMessageServers: () => client.get(SERVER_BOX_URLS.BXF_MESSAGE_SERVERS),\r\n mamIntegrationServers: () => client.get(SERVER_BOX_URLS.MAM_INTEGRATION_SERVERS),\r\n mamIntegrationServersById: (id: number) => client.get(`${SERVER_BOX_URLS.MAM_INTEGRATION_SERVERS_BY_ID}${id}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { UidRequest, SuccessResult } from './types';\r\n\r\nexport const SOCIAL_SITE_URLS = {\r\n GET_MESSAGES: '/SocialSite/getMessages',\r\n SEND_MESSAGE: '/SocialSite/sendMessage',\r\n} as const;\r\n\r\nexport function socialSiteApi(client: PbaApiClient) {\r\n return {\r\n getMessages: (params: UidRequest) => client.post(SOCIAL_SITE_URLS.GET_MESSAGES, params),\r\n sendMessage: (params: UidRequest) => client.post(SOCIAL_SITE_URLS.SEND_MESSAGE, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const STAMP_URLS = {\r\n INDEX: '/StampItem/index',\r\n DETAIL: '/StampItem/detail',\r\n SAVE: '/StampItem/save',\r\n DELETE: '/StampItem/delete',\r\n COPY: '/StampItem/copy',\r\n VALIDATE: '/StampItem/validate',\r\n INIT: '/StampItem/init',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface StampItem extends EntityBase {\r\n StampItemID?: number | null;\r\n NameNM?: string;\r\n AccountID?: number | null;\r\n Description?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function stampApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(STAMP_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(STAMP_URLS.DETAIL, params),\r\n save: (item: StampItem) => client.post(STAMP_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(STAMP_URLS.DELETE, params),\r\n copy: (params: UidRequest) => client.post(STAMP_URLS.COPY, params),\r\n validate: (item: StampItem) => client.post(STAMP_URLS.VALIDATE, item),\r\n init: (params: UidRequest) => client.post(STAMP_URLS.INIT, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\nexport const SUBTITLE_URLS = {\r\n INDEX: '/SubTitle/index',\r\n DETAIL: '/SubTitle/detail',\r\n SAVE: '/SubTitle/save',\r\n DELETE: '/SubTitle/delete',\r\n VALIDATE: '/SubTitle/validate',\r\n GENERATE: '/SubTitle/generate',\r\n} as const;\r\n\r\nexport interface SubTitle extends EntityBase {\r\n SubTitleID?: number | null;\r\n NameNM?: string;\r\n FileID?: number | null;\r\n Description?: string;\r\n}\r\n\r\nexport function subtitleApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(SUBTITLE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post(SUBTITLE_URLS.DETAIL, params),\r\n save: (item: SubTitle) => client.post(SUBTITLE_URLS.SAVE, item),\r\n delete: (params: UidRequest) => client.post(SUBTITLE_URLS.DELETE, params),\r\n validate: (item: SubTitle) => client.post(SUBTITLE_URLS.VALIDATE, item),\r\n generate: (params: UidRequest) => client.post(SUBTITLE_URLS.GENERATE, params),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase } from './types';\r\n\r\nexport const TASK_URLS = {\r\n INDEX: '/TaskItem/index',\r\n DELETE_INSTANCE: '/TaskItem/deleteInstance',\r\n DELETE_ALL_INSTANCE: '/TaskItem/deleteAllInstance',\r\n PROGRESS: '/TaskItem/progress/',\r\n SPENT: '/TaskItem/spent/',\r\n} as const;\r\n\r\nexport interface TaskItem extends EntityBase {\r\n TaskItemID?: number | null;\r\n NameNM?: string;\r\n Status?: string;\r\n Progress?: number | null;\r\n StartDate?: string;\r\n EndDate?: string;\r\n}\r\n\r\nexport function taskApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(TASK_URLS.INDEX, params),\r\n deleteInstance: (params: UidRequest) => client.post(TASK_URLS.DELETE_INSTANCE, params),\r\n deleteAllInstance: (params: UidRequest) => client.post(TASK_URLS.DELETE_ALL_INSTANCE, params),\r\n progress: (taskId: number) => client.get(`${TASK_URLS.PROGRESS}${taskId}`),\r\n spent: (taskId: number) => client.get(`${TASK_URLS.SPENT}${taskId}`),\r\n };\r\n}\r\n","import type { PbaApiClient } from './client';\r\n\r\nimport type { FilterParamList, UidRequest, SuccessResult, EntityBase, ImageCache } from './types';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Endpoint URLs\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const TEMPLATE_URLS = {\r\n INDEX: '/Template/index',\r\n DETAIL: '/Template/detail',\r\n SAVE: '/Template/save',\r\n DELETE: '/Template/delete',\r\n VALIDATE: '/Template/validate',\r\n GET_IMAGE: '/Template/getImage/',\r\n GET_IMAGES: '/Template/getImages',\r\n PLAYOUT_EVENT_OPERATION: '/Template/playouteventoperation',\r\n WIZARD: '/Template/wizard',\r\n WIZARD_SAVE: '/Template/wizardSave',\r\n WIZARD_VALIDATE: '/Template/wizardValidate',\r\n // v2\r\n V2_JSON_EXPORT: '/v2/template/JSON/export',\r\n V2_JSON_IMPORT: '/v2/template/JSON/import/',\r\n V2_XML_SINGLE_EXPORT: '/v2/template/XML/singleexport/',\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Entity interfaces\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Template extends EntityBase {\r\n TemplateID?: number | null;\r\n NameNM?: string;\r\n AccountID?: number | null;\r\n Description?: string;\r\n TemplateTypeID?: number | null;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// API\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function templateApi(client: PbaApiClient) {\r\n return {\r\n index: (params: FilterParamList) => client.post(TEMPLATE_URLS.INDEX, params),\r\n detail: (params: UidRequest) => client.post