UNPKG

ngx-tinymce

Version:
1 lines 15.1 kB
{"version":3,"file":"ngx-tinymce.mjs","sources":["../../lib/src/options.ts","../../lib/src/tinymce.ts","../../lib/src/provide.ts","../../lib/src/ngx-tinymce.ts"],"sourcesContent":["import type { RawEditorOptions } from 'tinymce';\n\nexport class TinymceOptions {\n /** 指定tinymce目录路径,默认:`./assets/tinymce/` */\n baseURL?: string = './assets/tinymce/';\n /** 指定tinymce文件名,默认:`tinymce.min.js` */\n fileName?: string = 'tinymce.min.js';\n /** 默认配置项,对全局 Tinymce 有效 */\n config?: RawEditorOptions;\n /** 延迟加载(单位:毫秒),默认:`0` */\n delay?: number;\n}\n","import {\n Component,\n forwardRef,\n OnDestroy,\n ChangeDetectionStrategy,\n TemplateRef,\n ViewEncapsulation,\n booleanAttribute,\n numberAttribute,\n inject,\n signal,\n input,\n output,\n afterNextRender,\n effect,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { NuLazyService } from '@ng-util/lazy';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport type { Editor as TinyMCEEditor, RawEditorOptions } from 'tinymce';\nimport { TinymceOptions } from './options';\n\nconst isSSR = !(typeof document === 'object' && !!document);\n\n/**\n * Angular for tinymce, You can modify the global configuration via `provideTinymce`\n */\n@Component({\n selector: 'tinymce',\n exportAs: 'tinymce',\n template: `\n @if (inline()) {\n <div [attr.id]=\"id\"><ng-content /></div>\n } @else {\n <textarea [attr.id]=\"id\" [attr.placeholder]=\"placeholder()\" class=\"tinymce-selector\"></textarea>\n } @if (load()) {\n <div class=\"loading\">\n @if (_loading()) {\n {{ _loading() }}\n } @else {\n <ng-template [ngTemplateOutlet]=\"_loadingTpl()\" />\n }\n </div>\n }\n `,\n imports: [NgTemplateOutlet],\n styles: [\n `\n tinymce .tinymce-selector {\n display: none;\n }\n `,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TinymceComponent),\n multi: true,\n },\n ],\n preserveWhitespaces: false,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TinymceComponent implements OnDestroy, ControlValueAccessor {\n private readonly defConfig = inject(TinymceOptions, { optional: true });\n private readonly lazySrv = inject(NuLazyService);\n private readonly doc = inject(DOCUMENT);\n\n private _instance?: TinyMCEEditor | null;\n private value = '';\n protected readonly load = signal(true);\n protected readonly id = `_tinymce-${Math.random().toString(36).substring(2)}`;\n\n private onChange?: (value: string) => void;\n private onTouched?: () => void;\n\n readonly config = input<RawEditorOptions | null>(null);\n readonly placeholder = input('');\n readonly inline = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n private _disabled = signal(false);\n\n protected _loading = signal<string | null>(null);\n protected _loadingTpl = signal<TemplateRef<any> | null>(null);\n readonly loading = input(null, {\n transform: (value: string | TemplateRef<any> | null) => {\n if (value instanceof TemplateRef) {\n this._loading.set(null);\n this._loadingTpl.set(value);\n } else {\n this._loading.set(value);\n }\n return value;\n },\n });\n /** 延迟初始化 */\n readonly delay = input(0, { transform: numberAttribute });\n readonly ready = output<TinyMCEEditor>();\n\n get instance(): TinyMCEEditor | undefined | null {\n return this._instance;\n }\n\n constructor() {\n afterNextRender(() => {\n if (isSSR) {\n return;\n }\n // 已经存在对象无须进入懒加载模式\n if (this.win.tinymce) {\n this.initDelay();\n return;\n }\n\n const { defConfig } = this;\n const baseURL = defConfig && defConfig.baseURL;\n const fileName = defConfig && defConfig.fileName;\n const url = (baseURL ?? './assets/tinymce/') + (fileName ?? 'tinymce.min.js');\n this.lazySrv.monitor(url).subscribe(() => this.initDelay());\n this.lazySrv.load(url);\n });\n\n effect(() => {\n const cfg = this.config();\n if (!this._instance) return;\n this.destroy();\n if (cfg)\n this.initDelay();\n })\n }\n\n private get win(): any {\n return this.doc.defaultView ?? window;\n }\n\n private initDelay(): void {\n if (isSSR) {\n return;\n }\n setTimeout(() => this.init(), Math.max(0, this.delay()));\n }\n\n private init(): void {\n const win = this.win;\n if (!win.tinymce) {\n throw new Error('tinymce js文件加载失败');\n }\n\n const { defConfig, config, id, inline } = this;\n if (this._instance) {\n return;\n }\n\n if (defConfig?.baseURL) {\n let url = '' + defConfig.baseURL;\n if (url.endsWith('/')) {\n url = url.substring(0, url.length - 1);\n }\n win.tinymce.baseURL = url;\n }\n const userOptions = { ...defConfig?.config, ...config() };\n const options: RawEditorOptions = {\n selector: `#` + id,\n inline: inline(),\n ...defConfig?.config,\n ...config(),\n\n setup: (editor) => {\n this._instance = editor;\n if (this.onChange) {\n editor.on('change keyup', () => {\n this.value = editor.getContent();\n this.onChange!(this.value);\n });\n }\n if (typeof userOptions.setup === 'function') {\n userOptions.setup(editor);\n }\n },\n init_instance_callback: (editor) => {\n if (editor && this.value) {\n editor.setContent(this.value);\n }\n this.setDisabled();\n if (typeof userOptions.init_instance_callback === 'function') {\n userOptions.init_instance_callback(editor);\n }\n this.ready.emit(editor);\n },\n };\n if (userOptions.auto_focus) {\n options.auto_focus = id;\n }\n\n win.tinymce.init(options);\n\n this.load.set(false);\n }\n\n private destroy(): void {\n if (this._instance == null) {\n return;\n }\n this._instance.off();\n this._instance.remove();\n this._instance = null;\n }\n\n private setDisabled(): void {\n if (!this._instance) {\n return;\n }\n const mode = this.disabled() || this._disabled() ? 'readonly' : 'design';\n // Compatible with 5\n const setMode5 = (this._instance as any).setMode;\n if (typeof setMode5 === 'function') {\n setMode5(mode);\n } else {\n this._instance!.mode.set(mode);\n }\n }\n\n ngOnDestroy(): void {\n this.destroy();\n }\n\n writeValue(value: string): void {\n // value should be NOT NULL\n this.value = value ?? '';\n this._instance?.setContent(this.value);\n }\n\n registerOnChange(fn: (_: any) => object): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => object): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n this.setDisabled();\n }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { TinymceOptions } from './options';\n\n/**\n * Sets up providers necessary to config for the Tinymce.\n * @example\n * bootstrapApplication(AppComponent, {\n * providers: [provideTinymce({baseURL: '//cdn.tiny.cloud/1/no-api-key/tinymce/6/'})]\n * });\n */\nexport function provideTinymce(options: TinymceOptions): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: TinymceOptions, useValue: options }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}